How can I generate GUIDs in Excel?

前端 未结 11 929
别那么骄傲
别那么骄傲 2020-11-27 14:58

I have an excel file with one order on each row, and I want each order to have a unique identifier, so there will be a Unique ID column. Every time I fill a row, I want Exce

相关标签:
11条回答
  • 2020-11-27 15:53

    I created a VBA function that works both on mac and windows:

    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 讨论(0)
  • 2020-11-27 16:00

    I know this question is answered, but I think the code in question should look something like what's on this page: http://snipplr.com/view/37940/

    Haven't tested, but this code seems to tap into the Windows API to get its GUID's - I would try putting that in a public module and typing =GetGUId() in an Excel cell to see what I'd get. If it works in VB6 you have a great deal of a good chance it works in VBA as well:

    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
    

    Thanks Gus Molina!

    If this code works (which I don't doubt), I think you'd get a new set of GUID's whenever the function gets evaluated, which means everytime the sheet gets calculated - when you're saving the workbook, for example. Make sure to copy-pastespecial-values if you need the GUID's for later use... which is somewhat likely.

    0 讨论(0)
  • 2020-11-27 16:00

    A VBA approach based on generating random numbers using the Rnd() function, and not on external API calls or 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
    

    This essentially is a VBA implementation of NekojiruSou's answer (it also generates a v4 GUID), and carries the same limitations, but will work in VBA and might be easier to implement.

    Note that you can omit the last line to not return the dashes and curly braces in the result.

    0 讨论(0)
  • 2020-11-27 16:04

    I used the following function in v.2013 excel vba to create a GUID and is working well..

    Public Function GetGUID() As String 
        GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) 
    End Function 
    
    0 讨论(0)
  • 2020-11-27 16:05

    I found pretty solution here:
    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
    
    0 讨论(0)
提交回复
热议问题