Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-在代码中生成唯一的数字_Vba_Numbers_Unique - Fatal编程技术网

VBA-在代码中生成唯一的数字

VBA-在代码中生成唯一的数字,vba,numbers,unique,Vba,Numbers,Unique,是否有任何方法可以在代码中生成唯一的数字? 我有一个使用系统时间的想法,但最终无法实现。您可以使用Now()将输出格式化为数字 Sub unique() Dim t As Date t = Now() Range("A1").NumberFormat = "@" Range("A1") = CStr(Format(t, "yyyymmddhhMMss")) End Sub 这将是独一无二的 正如@Vasily所指出的,如果不将单元格格式化为字符串并将数字作为sting,则值将被截断为科学符号

是否有任何方法可以在代码中生成唯一的数字? 我有一个使用系统时间的想法,但最终无法实现。

您可以使用Now()将输出格式化为数字

Sub unique()

Dim t As Date
t = Now()
Range("A1").NumberFormat = "@"
Range("A1") = CStr(Format(t, "yyyymmddhhMMss"))
End Sub
这将是独一无二的


正如@Vasily所指出的,如果不将单元格格式化为字符串并将数字作为sting,则值将被截断为科学符号

特别是在这种情况下,发明了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

你需要多少位数?上下文是什么?此代码在完成之前是否生成唯一值?或者它是否按计划/间歇运行,并且在运行时需要生成唯一的值?例如,如果它一直运行到完成,只需生成一个变量,并在每次需要新变量时递增1。你能使用一个隐藏的工作表,并使用一个特定的单元格,每次你需要一个新的数字时都会增加它吗?我认为最好是
Cstr(Format(now(),“yyyymmddhhmmsms”)
@Vasily OP明确要求一个数字。
格式(now(),“yyyyymmddhhmmsms”)
是一个字符串,不需要
Cstr()
包装。我的意思是,如果您使用格式
“yyyymmddhhmmsms”
为唯一标识符
CDbl
减少数字范围,它将返回一个
数字+16
,VBA没有
bigint
(例如在SQL Server中),这就是为什么我的建议是使用字符串而不是数字。如果标识符是唯一的,则数字或字符串无关紧要。@Vasily啊,这很有意义。你说得对。在不将单元格格式化为字符串并将数字作为字符串放置的情况下,它将截断科学格式的数字。我编辑了答案。