web-dev-qa-db-fra.com

Comment créer un GUID dans Excel?

J'ai besoin d'une fonction pour ajouter un GUID aux cellules d'Excel. J'ai trouvé cette question précédente sur stackoverflow , mais cela ne fonctionne pas. Il suggère la fonction suivante: 

=CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,6553‌​5),4),"-
 ",DEC2HEX(RANDBETWEEN(16384,20479),4),"-",DEC2HEX(RANDBETWEEN(32768,49151‌​),4),"-
 ",DEC2HEX(RANDBETWEEN(0,65535),4),DEC2HEX(RANDBETWEEN(0,4294967295),8))

Je n'ai pas réussi à faire fonctionner la méthode de concaténation et je l'ai donc essayé en utilisant le chiffre "&" pour concaténer de toute façon. Cela semblait fonctionner, mais je reçois alors une erreur inexplicable sur le deuxième bloc DEX2HEX: DEC2HEX (RANDBETWEEN (0,6553‌ 5), 4). L'évaluateur de la formule Excel dit que cela est invalide, mais je n'arrive pas à comprendre pourquoi. Des idées? 

34
fraxture

J'utilise la fonction suivante dans v.2013 Excel vba macro code

Public Function GetGUID() As String 
    GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) 
End Function 
25
rchacko

À partir de la version moderne d'Excel, la syntaxe est une virgule et non un point-virgule. Je poste cette réponse pour la commodité des autres afin qu'ils ne soient pas obligés de remplacer les chaînes. Nous sommes tous paresseux ... hrmp ... humain, non?

= CONCATENER (DEC2HEX (RANDBETWEEN (0,4294967295), 8), "-", DEC2HEX (RANDBETWEEN (0,42949), 4), "-", DEC2HEX (RANDBETWEEN (0,42949), 4), "-" , DEC2HEX (RANDBETWEEN (0,42949), 4), "-", DEC2HEX (RANDBETWEEN (0,4294967295), 8), DEC2HEX (RANDBETWEEN (0,42949), 4))

Ou, si vous aimez que je n'aime pas quand un guide hurle et crie et que vous, vous pouvez aller dans les bas-fonds comme celui-ci.

= INFÉRIEUR (CONCATENATE (DEC2HEX (RANDBETWEEN (0,4294967295), 8), ")", "-", DEC2HEX (RANDBETWEEN (0,42949), 4), "-", DEC2HEX (RANDBETWEEN (0,42949), 4), " - ", DEC2HEX (RANDBETWEEN (0,42949), 4)," - ", DEC2HEX (RANDBETWEEN (0,4294967295), 8), DEC2HEX (RANDBETWEEN (0,42949), 4)))

29
Konrad Viltersten
=CONCATENATE(
    DEC2HEX(RANDBETWEEN(0;4294967295);8);"-";
    DEC2HEX(RANDBETWEEN(0;42949);4);"-";
    DEC2HEX(RANDBETWEEN(0;42949);4);"-";
    DEC2HEX(RANDBETWEEN(0;42949);4);"-";
    DEC2HEX(RANDBETWEEN(0;4294967295);8);
    DEC2HEX(RANDBETWEEN(0;42949);4)
)
24

Ce n'est pas un problème avec la fonction du tout.

Il m'a fallu un peu de fouille, mais le problème réside dans le copier-coller. Essayez de copier ceci: La chaîne RANDBETWEEN(0,6553‌​5), postée dans votre question initiale, et collez-la dans un éditeur hexadécimal, puis vous verrez qu'il y a en fait deux caractères nuls dans 65535:

00000000  52 41 4E 44 42 45 54 57 45 45 4E 28 30 2C 36 35  RANDBETWEEN(0,65
00000010  35 33 00 00 35 29                                53‌..​5)
5
Paul
=LOWER(
    CONCATENATE(
        DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8), "-", 
        DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4),"-","4", 
        DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"-",
        DEC2HEX(RANDBETWEEN(8,11)),
        DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"-",
        DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),
        DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4)
    )
)

Tiré de git @mobilitymaster.

3
Masud

pour moi c'est correct, en espagnol espagnol

=CONCATENAR(
DEC.A.HEX(ALEATORIO.ENTRE(0,4294967295),8),"-",
DEC.A.HEX(ALEATORIO.ENTRE(0,65535),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(16384,20479),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(32768,49151),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(0,65535),4),
DEC.A.HEX(ALEATORIO.ENTRE(0,4294967295),8)
)
1
César Salazar

La formule pour Dutch Excel:

=KLEINE.LETTERS(
    TEKST.SAMENVOEGEN(
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;8));8);"-";
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;4));4);"-";"4";
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;3));3);"-";
        DEC.N.HEX(ASELECTTUSSEN(8;11));
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;3));3);"-";
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;8));8);
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;4));4)
    )
)
0
nidkil

Après avoir essayé plusieurs options et rencontré divers problèmes avec les versions plus récentes d'Excel (2016), je suis tombé sur ce message de MS qui fonctionnait à merveille. Je l'ai amélioré en utilisant du code d'un message de danwagner.co

Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As LongPtr

Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr

Function CreateGuidString(Optional IncludeHyphens As Boolean = True, Optional IncludeBraces As Boolean = False)
    Dim Guid As GUID_TYPE
    Dim strGuid As String
    Dim retValue As LongPtr

    Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

    retValue = CoCreateGuid(Guid)

    If retValue = 0 Then
        strGuid = String$(guidLength, vbNullChar)
        retValue = StringFromGUID2(Guid, StrPtr(strGuid), guidLength)

        If retValue = guidLength Then
            '   valid GUID as a string
            '   remove them from the GUID
            If Not IncludeHyphens Then
                strGuid = Replace(strGuid, "-", vbNullString, Compare:=vbTextCompare)
            End If

            '   If IncludeBraces is switched from the default False to True,
            '   leave those curly braces be!
            If Not IncludeBraces Then
                strGuid = Replace(strGuid, "{", vbNullString, Compare:=vbTextCompare)
                strGuid = Replace(strGuid, "}", vbNullString, Compare:=vbTextCompare)
            End If


            CreateGuidString = strGuid
        End If
    End If

End Function


Public Sub TestCreateGUID()
    Dim Guid As String
    Guid = CreateGuidString() '<~ default
    Debug.Print Guid
End Sub

Il existe des options supplémentaires dans le message MS original trouvé ici: https://answers.Microsoft.com/en-us/msoffice/forum/msoffice_Excel-msoffice_custom-mso_2010/guid-run-time-error-70 -permission-denied/c9ee4076-98af-4032-bc87-40ad7aa7cb38

0
Ken Thompson

La formule pour Excel français: 

=CONCATENER(
DECHEX(ALEA.ENTRE.BORNES(0;4294967295);8);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;4294967295);8);
DECHEX(ALEA.ENTRE.BORNES(0;42949);4))

Comme l'a noté Josh M, cela ne fournit pas un GUID conforme, mais cela fonctionne bien pour mon besoin actuel.

0
jazzfan

La formule pour la version polonaise:

=ZŁĄCZ.TEKSTY(
    DZIES.NA.SZESN(LOS.ZAKR(0;4294967295);8);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;4294967295);8);
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4)
)
0
czachor

La formule pour l'allemand Excel:

=KLEIN(
    VERKETTEN(
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;8));8);"-";
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;4));4);"-";"4";
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;3));3);"-";
        DEZINHEX(ZUFALLSBEREICH(8;11));
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;3));3);"-";
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;8));8);
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;4));
    )
)
0
Fredder