2015-12-04 4 views
0

Есть ли способ, которым я могу сгенерировать уникальный номер в коде? У меня была идея использовать системное время для этого, но в итоге не смогла его реализовать.VBA - генерация уникальных номеров в коде

+0

сколько цифр и нужно? –

+0

В чем заключен контекст? Этот код генерирует уникальные значения до завершения? Или он работает по расписанию/с перерывами и ему нужно генерировать уникальные значения в любое время? Если он работает непрерывно до завершения, например, просто сгенерируйте переменную и увеличивайте ее на 1 каждый раз, когда вам понадобится новый. Не могли бы вы использовать скрытый рабочий лист и использовать определенную ячейку, которую вы увеличиваете каждый раз, когда вам нужен новый номер? – user3476534

ответ

2

Вы можете нам теперь() форматировать вывод на число.

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

Я имею в виду, что если вы будете увеличивать диапазон цифр для уникального идентификатора 'CDbl' с форматом' 'yyyymmddhhMMssms'', он вернет' number + 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 
Смежные вопросы