如何在Excel中生成GUID?

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不具有加密功能.

  • 这是带有更改的功能,这也可以在Windows中使用','change = 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)) (7认同)
  • 这在Excel 2007中对我不起作用.我收到一个通用,这个公式错误有问题. (2认同)
  • 在Excel for Mac上完美运行,只需要将`;`改为`,` (2认同)
  • @MirkoAkkov它不是Mac,它是Thread.CurrentCulture的System.Globalization.CultureInfo实例,它包含一个TextInfo对象,该对象定义了一个`ListSeparator`属性,用于确定Excel将在Excel公式中的函数参数之间正确解析的字符.在Windows中,可以在控制面板的"区域设置"中查看/更改此(以及许多其他设置). (2认同)

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)

  • 它不适用于最新的 Windows 更新。以下是在这种情况下如何使用此宏的信息:/sf/ask/3173265021/ (2认同)
  • 由于 Windows 更新取出“Scriptlet.TypeLib”,请尝试以下操作: 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) )) 如果 Len(GUID) = 8 或 Len(GUID) = 13 或 Len(GUID) = 18 或 Len(GUID) = 23 然后 GUID = GUID & "-" End If Next N GenerateGUID = GUID End Function (2认同)

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值...这有点可能.


Eri*_*k A 5

基于使用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 中工作,并且可能更容易实现。

请注意,您可以省略最后一行,以免在结果中返回破折号和大括号。


Ale*_*der 5

我在这里找到了很好的解决方案: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)