Vba 如何在Excel中生成GUI?
我有一个excel文件,每行有一个订单,我希望每个订单都有一个唯一的标识符,因此将有一个唯一的ID列。每次我填写一行,我都希望Excel为我自动填充唯一ID列。我做了一些研究,并被指向了guid的方向。我找到了以下代码:Vba 如何在Excel中生成GUI?,vba,excel,guid,Vba,Excel,Guid,我有一个excel文件,每行有一个订单,我希望每个订单都有一个唯一的标识符,因此将有一个唯一的ID列。每次我填写一行,我都希望Excel为我自动填充唯一ID列。我做了一些研究,并被指向了guid的方向。我找到了以下代码: Function GenGuid() As String Dim TypeLib As Object Dim Guid As String Set TypeLib = CreateObject("Scriptlet.TypeLib") Guid = TypeLib.Guid '
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
但我不确定如何实施它。任何帮助都将不胜感激。提前感谢。以下Excel表达式的计算结果为V4 GUID:
=串联(DEC2HEX(randbehen(04294967295),8),“-”,DEC2HEX(randbehen(065535),4),“-”,DEC2HEX(randbehen(163842479),4),“-”,DEC2HEX(randbehen(065535),4),DEC2HEX(randbehen(04294967295),8))
-或(取决于区域设置/十进制和列表分隔符)-
=串联(DEC2HEX(randbehen(0;4294967295);8);“-”DEC2HEX(randbehen(0;65535);4);“-”DEC2HEX(randbehen(16384;20479);4);“-”DEC2HEX(randbehen(32768;49151);4);“-”DEC2HEX(randbehen(0;65535);4);DEC2HEX(randbehen(0;4294967295);8)
请注意,根据RFC 4122第4.4节,第三组的第一个字符始终为4,表示V4(生成的伪随机数)GUID/UUID
还请注意,对于同一RFC,第四组的第一个字符始终介于8和B之间
标准免责声明:生成的guid/uuid在加密方面不强
编辑:删除不可见字符与德语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))
我知道这个问题已经得到了回答,但我认为有问题的代码应该类似于此页面上的代码: 还没有测试过,但这段代码似乎要进入Windows API以获取其GUID——我会尝试将其放入公共模块中,并在Excel单元格中键入
=GetGUId()
,以查看得到的结果。如果它在VB6中工作,则很有可能它也在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
私有类型GUID
数据1尽可能长
数据2作为整数
数据3作为整数
数据4(7)作为字节
端型
专用声明函数CoCreateGuid Lib“OLE32.DLL”(pGuid作为GUID)的长度为
作为字符串的公共函数GetGUID()
"(c)2000 Gus Molina
将udtGUID设置为GUID
如果(CoCreateGuid(udtGUID)=0),则
GetGUID=_
字符串(8-Len(十六进制$(udtGUID.Data1)),“0”)&十六进制$(udtGUID.Data1)和_
字符串(4-Len(十六进制$(udtGUID.Data2)),“0”)&十六进制$(udtGUID.Data2)和_
字符串(4-Len(十六进制$(udtGUID.Data3)),“0”)&十六进制$(udtGUID.Data3)和_
IIf((udtGUID.Data4(0)<&H10),“0”和十六进制$(udtGUID.Data4(0))和_
IIf((udtGUID.Data4(1)<&H10),“0”和十六进制$(udtGUID.Data4(1))&_
IIf((udtGUID.Data4(2)<&H10),“0”和十六进制$(udtGUID.Data4(2))&_
IIf((udtGUID.Data4(3)<&H10),“0”和十六进制$(udtGUID.Data4(3))&_
IIf((udtGUID.Data4(4)<&H10)、“0”、“0”)&Hex$(udtGUID.Data4(4))&_
IIf((udtGUID.Data4(5)<&H10)、“0”、“0”)&Hex$(udtGUID.Data4(5))和_
IIf((udtGUID.Data4(6)<&H10)、“0”、“0”)&Hex$(udtGUID.Data4(6))和_
IIf((udtGUID.Data4(7)<&H10),“0”和十六进制$(udtGUID.Data4(7))
如果结束
端函数
谢谢Gus Molina
如果这段代码有效(我不怀疑这一点),我认为每当对函数求值时,就会得到一组新的GUID,这意味着每次计算工作表时——例如,在保存工作簿时。如果需要GUID供以后使用,请确保复制特殊值。。。这有点可能。我在v.2013 excel vba中使用了以下函数来创建GUID,并且运行良好
Public Function GetGUID() As String
GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36)
End Function
如果要将记录插入数据库中,可以使用这种方法创建GUID 这可能是最简单、最容易实现的方法,因为在使用内置SQL函数时,不需要复杂的
VBA
函数
该语句使用NewID()
语法如下:
INSERT INTO table_name (ID,Column1,Column2,Column3)
VALUES (NewID(),value1,value2,value3)
strSql = "INSERT INTO table_name " _
& "(ID,Column1,Column2,Column3) " _
& "VALUES (NewID(),value1,value2,value3)"
在VBA
语法中,它如下所示:
INSERT INTO table_name (ID,Column1,Column2,Column3)
VALUES (NewID(),value1,value2,value3)
strSql = "INSERT INTO table_name " _
& "(ID,Column1,Column2,Column3) " _
& "VALUES (NewID(),value1,value2,value3)"
如果需要连接值,只需将其视为字符串,并像通常对SQL语句那样连接
strSql = "INSERT INTO table_name " _
& "(ID,Column1,Column2,Column3) " _
& "VALUES (" & "NewID()" & "," & "value1" & "," & "value2" & "," & "value3" & ")"
我最近在一些vba代码中使用CreateObject(“Scriptlet.TypeLib”)时遇到了问题 因此,基于NekojiruSou excel函数编写了以下内容,这些内容应该可以在没有任何特定excel函数的情况下工作。这可用于在excel中开发用户定义的函数
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
公共函数Get_NewGUID()作为字符串
'返回长度为36个字符的GUID字符串
随机化
将r1a调暗至相同长度
将r1b调暗为长
暗r2一样长
尺寸r3与长度相同
暗r4与长r4相同
暗r5a与长r5a一样
将r5b变长
尺寸为r5c,长度为
'randomValue=CInt(数学下限((上限-下限+1)*Rnd())+lowerbound
r1a=介于(065535)之间的随机数
r1b=介于(065535)之间的随机数
r2=0,65535之间的随机数
r3=RandomBetween(1638420479)
r4=随机数(3276849151)
r5a=介于(065535)之间的随机数
r5b=介于(065535)之间的随机数
r5c=介于(065535)之间的随机数
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))
端函数
公共功能楼层(ByVal X为双精度,可选ByVal系数为双精度=1)为双精度
“发件人:http://www.tek-tips.com/faqs.cfm?fid=5031
'X是要舍入的值
'因子是要舍入的倍数
楼层=整数(X/系数)*系数
端函数
公共函数RandomBetween(ByVal StartRange为Long,ByVal EndRange为Long)为Long
"基于https://msdn.microsoft.com/en-us/library/f7s023d2(v=vs.90).aspx
'randomValue=CInt(数学下限((上限-下限+1)*Rnd())+lowerbound
RandomBeween=CLng(地板((端距-开始传输+1)*Rnd())+开始传输
端函数
公共函数PadLeft(文本作为变量,总长度作为整数,padCh
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
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
'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
' UUID Version 4 (random)
Function GetUUID4()
Dim guid As String
Dim i As Integer
Dim r As Integer
guid = ""
Randomize
For i = 0 To 31
' random digit 0..15
r = Rnd() * 15
' add dash separators
If (i = 8) Or (i = 12) Or (i = 16) Or (i = 20) Then guid = guid & "-"
' uuid4 version info in 12th and 16th digits
If (i = 12) Then r = 4
If (i = 16) Then r = (r And 3 Or 8)
' add as hex digit
guid = guid & Hex(r)
Next i
GetUUID4 = guid
End Function
Private Function getGUID() As String
getGUID = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
getGUID = Replace(getGUID, "y", Hex(Rnd() And &H3 Or &H8))
Dim i As Long: For i = 1 To 30
getGUID = Replace(getGUID, "x", Hex$(CLng(Rnd() * 15.9999)), 1, 1)
Next
End Function