2015-12-04 51 views
0

有什麼方法可以在代碼中生成唯一編號? 我有一個使用系統時間的想法,但最終無法實現它。VBA - 在代碼中生成唯一編號

+0

多少位u需要? –

+0

什麼是上下文?這個代碼是否會在完成之前生成唯一的值?或者它是否按計劃間歇運行,並且需要在運行時生成唯一值?例如,如果它連續運行直到完成,則只需生成一個變量並在每次需要新變量時加1。您可以使用隱藏的工作表並使用每次需要新號碼時增加的特定單元格嗎? – user3476534

回答

2

您可以將Now()然後將輸出格式化爲數字。

Sub unique() 

Dim t As Date 
t = Now() 
Range("A1").NumberFormat = "@" 
Range("A1") = CStr(Format(t, "yyyymmddhhMMss")) 
End Sub 

這將是唯一的。

作爲@Vasily指出,沒有格式化單元格作爲字符串,並將數字作爲一個刺的價值被截斷爲科學記數法。

+0

我認爲更好的是'Cstr(Format(now(),「yyyymmddhhMMssms」))' – Vasily

+0

@Vasily OP顯然要求輸入一個數字。 'Format(now(),「yyyymmddhhMMssms」)'是一個字符串,不需要'Cstr()'包裝器。 –

+1

我的意思是說,如果你將用格式爲「yyyymmddhhMMssms」的方式來增加唯一標識符CDbl的數字範圍,它將返回一個數字+16,VBA沒有'bigint'(例如在SQL Server中)這就是爲什麼我的提議是使用字符串而不是數字。如果識別器是唯一的,那麼數字或字符串無關緊要。 – Vasily

0

特別是對於這種情況下的GUID(全球唯一標識符)發明。這可能是有點過大......只是,你已經看到了:

Option Explicit 

Public Type TYP_GUID 
    bytes(15) As Byte 
End Type 

Public Declare Function CoCreateGuid Lib "OLE32.dll" _ 
         (guid As TYP_GUID) As Long 

Public Function newGUID() As TYP_GUID 
    Dim uGUID As TYP_GUID 
    CoCreateGuid uGUID 
    newGUID = uGUID 
End Function 

每當調用newGUID(),您將成爲這應該是世界非常獨特的值。你可以儘可能經常地調用它,你再也不會得到相同的值。

它也可能把這樣的GUID轉換爲字符串:

Option Explicit 

Public Type TYP_GUID 
    bytes(15) As Byte 
End Type 

Public Declare Function CoCreateGuid Lib "OLE32.dll" _ 
         (guid As TYP_GUID) As Long 

Public Declare Function StringFromGUID2 Lib "OLE32.dll" _ 
         (guid As TYP_GUID, _ 
         ByVal lpszString As String, _ 
         ByVal iMax As Long) As Long 

Public Function newGUID() As TYP_GUID 
    Dim uGUID As TYP_GUID 
    CoCreateGuid uGUID 
    newGUID = uGUID 
End Function 

Public Function newGUID_String() As String 
    Dim sBuffer As String 
    Dim lResult As Long 

    sBuffer = VBA.Space(78) 
    lResult = StringFromGUID2(newGUID, sBuffer, Len(sBuffer)) 
    newGUID_String = Left$(StrConv(sBuffer, vbFromUnicode), lResult - 1) 
End Function