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.
Der folgende Excel-Ausdruck wird zu einer V4-GUID ausgewertet:
=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))
-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.
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
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.
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
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))
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.
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 ().
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" & ")"
Ich habe eine VBA-Funktion erstellt, die sowohl auf dem Mac als auch unter Windows funktioniert:
'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
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