webentwicklung-frage-antwort-db.com.de

Wie kann ich GUIDs in Excel generieren?

Ich habe eine Excel-Datei mit einer Reihenfolge in jeder Zeile, und ich möchte, dass jede Bestellung eine eindeutige Kennung hat, sodass eine eindeutige ID-Spalte angezeigt wird. Jedes Mal, wenn ich eine Zeile ausfülle, möchte ich, dass Excel automatisch die Spalte für die eindeutige ID auffüllt. Ich habe etwas recherchiert und war auf die Richtung der GUIDs gerichtet. Ich habe folgenden Code gefunden: 

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

aber ich bin mir nicht sicher, wie ich es umsetzen kann. Jede Hilfe wäre sehr dankbar. Danke im Voraus.

41
abw333

Der folgende Excel-Ausdruck wird zu einer V4-GUID ausgewertet:

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

-oder (abhängig von Gebietsschemaeinstellung/Dezimal- und Listentrennzeichen) -

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

Beachten Sie, dass das erste Zeichen der dritten Gruppe immer 4 ist, um eine V4-GUID/UUID (Pseudozufallszahl generiert) gemäß RFC 4122, Abschnitt 4.4 zu kennzeichnen.

Beachten Sie auch, dass das erste Zeichen der vierten Gruppe für denselben RFC immer zwischen 8 und B liegt.

Standard-Haftungsausschluss: Die resultierenden GUIDs/UUIDs sind nicht kryptografisch stark.

37
NekojiruSou

Ich habe die folgende Funktion in v.2013 Excel vba verwendet, um eine GUID zu erstellen, und funktioniert gut.

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

Ich weiß, dass diese Frage beantwortet wurde, aber ich denke, der fragliche Code sollte ungefähr so ​​aussehen, wie auf dieser Seite: http://snipplr.com/view/37940/

Habe nicht getestet, aber dieser Code scheint die Windows-API zu nutzen, um seine GUIDs abzurufen. Ich würde versuchen, dies in ein öffentliches Modul einzufügen und =GetGUId() in eine Excel-Zelle einzugeben, um zu sehen, was ich bekommen würde. Wenn es in VB6 funktioniert, haben Sie sehr gute Chancen, dass es auch in VBA funktioniert:

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

Danke Gus Molina!

Wenn dieser Code funktioniert (was ich nicht bezweifle), würden Sie meiner Meinung nach immer dann eine neue Gruppe von GUIDs erhalten, wenn die Funktion ausgewertet wird. Dies bedeutet, dass jedes Mal, wenn das Blatt berechnet wird, beispielsweise beim Speichern der Arbeitsmappe. Wenn Sie die GUIDs für eine spätere Verwendung benötigen, stellen Sie sicher, dass Sie die -peziösen Werte kopieren ... was ziemlich wahrscheinlich ist.

9
Mathieu Guindon

Ich habe hier eine hübsche Lösung gefunden:
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=751237&msg=8634441

Option Explicit

Private Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type
Private Declare Function CoCreateGuid Lib "ole32" (pguid As GUID) As Long
Private Declare Function StringFromGUID2 Lib "ole32" ( _
  rguid As GUID, ByVal lpsz As Long, ByVal cchMax As Long) As Long

Public Function CreateGUID() As String
  Dim NewGUID As GUID
  CoCreateGuid NewGUID
  CreateGUID = Space$(38)
  StringFromGUID2 NewGUID, StrPtr(CreateGUID), 39
End Function
3
Alekzander

Gleiches für deutsche Excel-Version:

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

Ein VBA-Ansatz, der auf der Generierung von Zufallszahlen mit der Funktion Rnd() basiert und nicht auf externen API-Aufrufen oder Scriptlet.TypeLib:

Public Function CreateGUID() As String
    Do While Len(CreateGUID) < 32
        If Len(CreateGUID) = 16 Then
            '17th character holds version information
            CreateGUID = CreateGUID & Hex$(8 + CInt(Rnd * 3))
        End If
        CreateGUID = CreateGUID & Hex$(CInt(Rnd * 15))
    Loop
    CreateGUID = "{" & Mid(CreateGUID, 1, 8) & "-" & Mid(CreateGUID, 9, 4) & "-" & Mid(CreateGUID, 13, 4) & "-" & Mid(CreateGUID, 17, 4) & "-" & Mid(CreateGUID, 21, 12) & "}"
End Function

Dies ist im Wesentlichen eine VBA-Implementierung der Antwort von NekojiruSou (sie generiert auch eine v4-GUID) und unterliegt den gleichen Einschränkungen, funktioniert jedoch in VBA und ist möglicherweise einfacher zu implementieren.

Beachten Sie, dass Sie die letzte Zeile weglassen können, um die Striche und geschweiften Klammern im Ergebnis nicht zurückzugeben.

1
Erik A

Da das Windows-Update "Scriptlet.TypeLib" herausgenommen hat, versuchen Sie Folgendes: 

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

Alternative, 

wenn Sie eine Verbindung zu SQL Server 2008 oder höher herstellen, verwenden Sie stattdessen die SQL-Funktion NEWID ().

1
rchacko

Wenn Sie Datensätze in eine Datenbank einfügen, können Sie auf diese Weise eine GUID erstellen. 

Dies ist wahrscheinlich der einfachste und einfachste Weg zur Implementierung, da Sie keine komplexe VBA-Funktion benötigen, da Sie die integrierte SQL-Funktion verwenden.

Die Anweisung verwendet NewID()

Die Syntax lautet wie folgt:

INSERT INTO table_name (ID,Column1,Column2,Column3)
VALUES (NewID(),value1,value2,value3) 

In der VBA-Syntax sieht es folgendermaßen aus:

strSql = "INSERT INTO table_name " _
       & "(ID,Column1,Column2,Column3) " _
       & "VALUES (NewID(),value1,value2,value3)"

Und wenn Sie Werte verketten müssen, behandeln Sie sie einfach als Zeichenfolge und verketten, wie Sie es normalerweise für eine SQL-Anweisung tun würden.

strSql = "INSERT INTO table_name " _
       & "(ID,Column1,Column2,Column3) " _
       & "VALUES (" & "NewID()" & "," & "value1" & "," & "value2" & "," & "value3" & ")"
0
KyloRen

Ich habe eine VBA-Funktion erstellt, die sowohl auf dem Mac als auch unter Windows funktioniert:

https://github.com/Martin-Carlsson/Business-Intelligence-Goodies/blob/master/Excel/GenerateGiud/GenerateGiud.bas

'Generates a guid, works on both mac and windows 
Function Guid() As String
    Guid = RandomHex(3) + "-" + _
        RandomHex(2) + "-" + _
        RandomHex(2) + "-" + _
        RandomHex(2) + "-" + _
        RandomHex(6)
End Function

'From: https://www.mrexcel.com/forum/Excel-questions/301472-need-help-generate-hexadecimal-codes-randomly.html#post1479527
Private Function RandomHex(lngCharLength As Long)
    Dim i As Long
    Randomize
    For i = 1 To lngCharLength
        RandomHex = RandomHex & Right$("0" & Hex(Rnd() * 256), 2)
    Next
End Function
0
Martin Carlsson

Ich bin kürzlich auf Probleme gestoßen, als ich CreateObject ("Scriptlet.TypeLib") in irgendeinem vba-Code verwendet habe.

Basierend auf NekojiruSou haben die folgenden Excel-Funktionen Folgendes geschrieben, die ohne bestimmte Excel-Funktionen funktionieren sollten. Damit kann eine benutzerdefinierte Funktion in Excel entwickelt werden.

Public Function Get_NewGUID() As String
    'Returns GUID as string 36 characters long

    Randomize

    Dim r1a As Long
    Dim r1b As Long
    Dim r2 As Long
    Dim r3 As Long
    Dim r4 As Long
    Dim r5a As Long
    Dim r5b As Long
    Dim r5c As Long

    'randomValue = CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd())) + lowerbound
    r1a = RandomBetween(0, 65535)
    r1b = RandomBetween(0, 65535)
    r2 = RandomBetween(0, 65535)
    r3 = RandomBetween(16384, 20479)
    r4 = RandomBetween(32768, 49151)
    r5a = RandomBetween(0, 65535)
    r5b = RandomBetween(0, 65535)
    r5c = RandomBetween(0, 65535)

    Get_NewGUID = (PadHex(r1a, 4) & PadHex(r1b, 4) & "-" & PadHex(r2, 4) & "-" & PadHex(r3, 4) & "-" & PadHex(r4, 4) & "-" & PadHex(r5a, 4) & PadHex(r5b, 4) & PadHex(r5c, 4))

End Function

Public Function Floor(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
    'From: http://www.tek-tips.com/faqs.cfm?fid=5031
    ' X is the value you want to round
    ' Factor is the multiple to which you want to round
        Floor = Int(X / Factor) * Factor
End Function

Public Function RandomBetween(ByVal StartRange As Long, ByVal EndRange As Long) As Long
    'Based on https://msdn.Microsoft.com/en-us/library/f7s023d2(v=vs.90).aspx
    '         randomValue = CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd())) + lowerbound
        RandomBetween = CLng(Floor((EndRange - StartRange + 1) * Rnd())) + StartRange
End Function

Public Function PadLeft(text As Variant, totalLength As Integer, padCharacter As String) As String
    'Based on https://stackoverflow.com/questions/12060347/any-method-equivalent-to-padleft-padright
    ' with a little more checking of inputs

    Dim s As String
    Dim inputLength As Integer
    s = CStr(text)
    inputLength = Len(s)

    If padCharacter = "" Then
        padCharacter = " "
    ElseIf Len(padCharacter) > 1 Then
        padCharacter = Left(padCharacter, 1)
    End If

    If inputLength < totalLength Then
        PadLeft = String(totalLength - inputLength, padCharacter) & s
    Else
        PadLeft = s
    End If

End Function

Public Function PadHex(number As Long, length As Integer) As String
    PadHex = PadLeft(Hex(number), 4, "0")
End Function
0
mphase