59 votes

Comment puis-je générer des GUIDs dans Excel ?

J'ai un fichier Excel avec une commande par ligne, et je veux que chaque commande ait un identifiant unique, il y aura donc une colonne ID unique. Chaque fois que je remplis une ligne, je veux qu'Excel remplisse automatiquement la colonne ID unique pour moi. J'ai fait quelques recherches et j'ai été orienté vers les GUIDs. J'ai trouvé le code suivant :

Function GenGuid() As String
Dim TypeLib As Object
Dim Guid As String
Set TypeLib = CreateObject("Scriptlet.TypeLib")
Guid = TypeLib.Guid
' format is {24DD18D4-C902-497F-A64B-28B2FA741661}
Guid = Replace(Guid, "{", "")
Guid = Replace(Guid, "}", "")
Guid = Replace(Guid, "-", "")
GenGuid = Guid
End Function

mais je ne suis pas sûr de la manière dont je peux la mettre en œuvre. Toute aide serait grandement appréciée. Merci d'avance.

0 votes

Je ne pense pas que votre problème soit de générer un GUID. Vous avez un code fonctionnel pour cela. Vous pouvez même obtenir un GUID dans n'importe quelle cellule en lui attribuant la formule suivante =GenGuid() bien qu'elle change à chaque évaluation de la formule. Votre question devrait plutôt être la suivante : Comment puis-je faire en sorte qu'Excel remplisse automatiquement une cellule avec le résultat d'une fonction VBA ?

1 votes

Avertissement : Le code ci-dessus ajoutera des déchets aléatoires à la fin de la chaîne : stackoverflow.com/questions/19556268/

0 votes

Ne mettez pas cette fonction dans une cellule comme une formule. =GenGuid() - Cela générera de nouveaux GUIDs pour chaque ligne à chaque fois que la feuille de calcul sera recalculée ! Au lieu de cela, utilisez les événements de la feuille de travail pour rechercher les modifications apportées à la feuille, et dans ce cadre, vous devrez trouver un moyen de déterminer si une ligne nouvelle/blanche est en cours d'édition ("la colonne GUID est-elle vide sur cette ligne ?"), et si c'est le cas, vous devez définir la valeur de la cellule avec le GUID généré (afin qu'elle reste statique). C'est la meilleure façon de s'assurer qu'une fois que vous avez attribué un GUID à une ligne, celle-ci conserve toujours la même valeur.

50voto

NekojiruSou Points 355

L'expression Excel suivante donne un GUID V4 :

=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))

-ou (en fonction de la configuration locale/des séparateurs décimaux et de liste)

=CONCATENATE(DEC2HEX(RANDBETWEEN(0;4294967295);8);"-";DEC2HEX(RANDBETWEEN(0;65535);4);"-";DEC2HEX(RANDBETWEEN(16384;20479);4);"-";DEC2HEX(RANDBETWEEN(32768;49151);4);"-";DEC2HEX(RANDBETWEEN(0;65535);4);DEC2HEX(RANDBETWEEN(0;4294967295);8))

Notez que le premier caractère du troisième groupe est toujours 4 pour signifier un GUID/UUID V4 (généré par un nombre pseudo-aléatoire) selon la section 4.4 du RFC 4122.

Notez également que le premier caractère du quatrième groupe est toujours compris entre 8 et B selon la même RFC.

Avis de non-responsabilité : les GUIDs/UUIDs résultants ne sont pas cryptographiquement forts.

2 votes

Cela n'a pas fonctionné pour moi dans Excel 2007. J'ai reçu une erreur générique "There is something wrong with this formula".

2 votes

Fonctionne parfaitement sur Excel pour Mac, il suffit de modifier ; a ,

10 votes

Voici la fonction avec les modifications ; cela fonctionne également sous Windows avec le changement ',' =CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-", DEC2HEX(RA‌​NDBETWEEN(16384,2047‌​9),4),"-",DEC2HEX(RA‌​NDBETWEEN(32768,4915‌​1),4),"-",DEC2HEX(RA‌​NDBETWEEN(0,65535),4‌​),DEC2HEX(RANDBETWEE‌​N(0,4294967295),8))

34voto

rchacko Points 51

J'ai utilisé la fonction suivante dans v.2013 excel vba pour créer un GUID et cela fonctionne bien .

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

0 votes

Beau morceau de code. Pour éliminer les traits d'union, vous pourriez le faire de la manière suivante GetGUID = Replace(Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36),"-",vbNullString)

2 votes

Il ne fonctionnera pas avec la dernière mise à jour de Windows. Voici une information sur la façon d'utiliser cette macro dans ce cas : stackoverflow.com/questions/45332357/

2 votes

Depuis que la mise à jour de Windows a supprimé "Scriptlet.TypeLib", essayez ce qui suit : Declare Function CoCreateGuid Lib "ole32" (ByRef GUID As Byte) As Long Public Function GenerateGUID() As String Dim ID(0 To 15) As Byte Dim N As Long Dim GUID As String Dim Res As Long Res = CoCreateGuid(ID(0)) For N = 0 To 15 GUID = GUID & IIf(ID(N) < 16, "0", "") & Hex$(ID(N)) If Len(GUID) = 8 Or Len(GUID) = 13 Or Len(GUID) = 18 Or Len(GUID) = 23 Then GUID = GUID & "-" End If Next N GenerateGUID = GUID End Function

11voto

retailcoder Points 3056

Je sais que cette question a déjà reçu une réponse, mais je pense que le code en question devrait ressembler à ce qui se trouve sur cette page : http://snipplr.com/view/37940/

Je n'ai pas testé, mais ce code semble puiser dans l'API Windows pour obtenir ses GUID - j'essaierais de mettre cela dans un module public et de taper =GetGUId() dans une cellule Excel pour voir ce que j'obtiendrais. Si cela fonctionne en VB6, il y a de grandes chances que cela fonctionne aussi en VBA :

Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

Private Declare Function CoCreateGuid Lib "OLE32.DLL" (pGuid As GUID) As Long

Public Function GetGUID() As String
'(c) 2000 Gus Molina

    Dim udtGUID As GUID

    If (CoCreateGuid(udtGUID) = 0) Then

        GetGUID = _
            String(8 - Len(Hex$(udtGUID.Data1)), "0") & Hex$(udtGUID.Data1) & _
            String(4 - Len(Hex$(udtGUID.Data2)), "0") & Hex$(udtGUID.Data2) & _
            String(4 - Len(Hex$(udtGUID.Data3)), "0") & Hex$(udtGUID.Data3) & _
            IIf((udtGUID.Data4(0) < &H10), "0", "") & Hex$(udtGUID.Data4(0)) & _
            IIf((udtGUID.Data4(1) < &H10), "0", "") & Hex$(udtGUID.Data4(1)) & _
            IIf((udtGUID.Data4(2) < &H10), "0", "") & Hex$(udtGUID.Data4(2)) & _
            IIf((udtGUID.Data4(3) < &H10), "0", "") & Hex$(udtGUID.Data4(3)) & _
            IIf((udtGUID.Data4(4) < &H10), "0", "") & Hex$(udtGUID.Data4(4)) & _
            IIf((udtGUID.Data4(5) < &H10), "0", "") & Hex$(udtGUID.Data4(5)) & _
            IIf((udtGUID.Data4(6) < &H10), "0", "") & Hex$(udtGUID.Data4(6)) & _
            IIf((udtGUID.Data4(7) < &H10), "0", "") & Hex$(udtGUID.Data4(7))
    End If

End Function

Merci Gus Molina !

Si ce code fonctionne (ce dont je ne doute pas), je pense que vous obtiendrez un nouvel ensemble de GUID à chaque fois que la fonction est évaluée, c'est-à-dire à chaque fois que la feuille est calculée - lorsque vous enregistrez le classeur, par exemple. Assurez-vous de copier-coller les valeurs spéciales si vous avez besoin des GUID's pour une utilisation ultérieure... ce qui est assez probable.

1 votes

Quelqu'un peut-il ajouter des commentaires à ce code pour expliquer ce qu'il fait ?

1 votes

@EmilyBeth il invoque CoCreateGuid à partir de OLE32.DLL, stocke le résultat dans un type défini par l'utilisateur, puis remplit chaque partie de 0 à gauche et les convertit en chaînes hexagonales. Data1 As Long contient les 4 premiers octets, Data2 et Data3 As Integer conserve les 4 octets suivants, puis Data4 contient les 8 octets restants. Un GUID n'est en fait qu'un très, très grand nombre stocké sur 16 octets, avec des parties spécifiques.

2voto

Chake Points 58

Idem pour allemand Version Excel :

=VERKETTEN(DEZINHEX(ZUFALLSBEREICH(0;4294967295);8);"-";DEZINHEX(ZUFALLSBEREICH(0;65535);4);"-";DEZINHEX(ZUFALLSBEREICH(16384;20479);4);"-";DEZINHEX(ZUFALLSBEREICH(32768;49151);4);"-";DEZINHEX(ZUFALLSBEREICH(0;65535);4);DEZINHEX(ZUFALLSBEREICH(0;4294967295);8))

3 votes

El version est en fait le même. Ce sont les paramètres locaux qui déterminent les alias des fonctions et le caractère qui délimite les arguments des fonctions.

0voto

Bob Cutler Points 1

Beau morceau de code. Pour éliminer les traits d'union, vous pourriez le faire de la manière suivante

GetGUID = Replace(Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36),"-",vbNullString)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X