I use this routine in almost every application I develop. It's handy whether you need a key for a collection or whether you use it in a database:
Option Explicit
Private Declare Function CoCreateGuid Lib _
"OLE32.DLL" (pGuid As GUID) As Long
Private Declare Function StringFromGUID2 Lib _
"OLE32.DLL" (pGuid As GUID, _
ByVal PointerToString As Long, _
ByVal MaxLength As Long) As Long
' Private members
Private Const GUID_OK As Long = 0
Private Type GUID
Guid1 As Long
Guid2 As Integer
Guid3 As Integer
Guid4(0 To 7) As Byte
End Type
Public Function CreateGUIDKey() As String
'*** Possible max length for buffer
Const GUID_LENGTH As Long = 38
Dim udtGUID As GUID
'User Defined Type
Dim strFormattedGUID As String
'The formatted string
Dim lngResult As Long
'Useless result flag
'*** Create a 'raw' GUID
lngResult = CoCreateGuid(udtGUID)
If lngResult = GUID_OK Then
'*** Pre-allocate space for the ID
strFormattedGUID = String$(GUID_LENGTH, 0)
'*** Convert the 'raw' GUID to a
'formatted string
StringFromGUID2 udtGUID, _
StrPtr(strFormattedGUID), GUID_LENGTH + 1
Else
'*** Return nothing or handle error
strFormattedGUID = ""
End If
' *** Return our nicely formatted GUID
CreateGUIDKey = strFormattedGUID
End Function