abw*_*333 44 excel vba guid excel-vba
我有一个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
' format is {24DD18D4-C902-497F-A64B-28B2FA741661}
Guid = Replace(Guid, "{", "")
Guid = Replace(Guid, "}", "")
Guid = Replace(Guid, "-", "")
GenGuid = Guid
End Function
Run Code Online (Sandbox Code Playgroud)
但我不确定如何实现它.任何帮助将不胜感激.先感谢您.
Nek*_*Sou 37
以下Excel表达式求值为V4 GUID:
=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))
- 或(取决于区域设置/小数和列表分隔符) -
=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))
请注意,第三组的第一个字符始终为4,表示每个RFC 4122第4.4节中的V4(生成的伪随机数)GUID/UUID.
另请注意,第四组的第一个字符始终在每个RFC的8到B之间.
标准免责声明:生成的GUID/UUID不具有加密功能.
rch*_*cko 31
我在v.2013 excel vba中使用了以下函数来创建GUID并且运行良好..
Public Function GetGUID() As String
GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36)
End Function
Run Code Online (Sandbox Code Playgroud)
Mat*_*don 11
我知道这个问题已得到解答,但我认为有问题的代码应该与本页的内容类似:http://snipplr.com/view/37940/
还没有测试过,但是这段代码似乎可以利用Windows API来获取它的GUID - 我会尝试将它放在一个公共模块中并输入=GetGUId()一个Excel单元格来查看我得到的内容.如果它在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
Run Code Online (Sandbox Code Playgroud)
谢谢Gus Molina!
如果这段代码有效(我不怀疑),我认为每当函数被评估时你都会获得一组新的GUID,这意味着每次计算工作表时 - 例如,当您保存工作簿时.如果您需要GUID以供以后使用,请务必复制pastespecial值...这有点可能.
基于使用Rnd()函数生成随机数的 VBA 方法,而不是基于外部 API 调用或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
Run Code Online (Sandbox Code Playgroud)
这本质上是 NekojiruSou 答案的 VBA 实现(它还生成 v4 GUID),并且具有相同的限制,但可以在 VBA 中工作,并且可能更容易实现。
请注意,您可以省略最后一行,以免在结果中返回破折号和大括号。
我在这里找到了很好的解决方案: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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66337 次 |
| 最近记录: |