Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
如何在Excel中创建GUID?_Excel_Guid - Fatal编程技术网

如何在Excel中创建GUID?

如何在Excel中创建GUID?,excel,guid,Excel,Guid,我需要一个函数来为excel中的单元格添加GUID。我找到了,但它不起作用。它提出了以下功能: =CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,6553‌​5),4),"-" ,DEC2HEX(RANDBETWEEN(16384,20479),4),"-",DEC2HEX(RANDBETWEEN(32768,49151‌​),

我需要一个函数来为excel中的单元格添加GUID。我找到了,但它不起作用。它提出了以下功能:

=CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,6553‌​5),4),"-"
    ,DEC2HEX(RANDBETWEEN(16384,20479),4),"-",DEC2HEX(RANDBETWEEN(32768,49151‌​),4),"-"
    ,DEC2HEX(RANDBETWEEN(0,65535),4),DEC2HEX(RANDBETWEEN(0,4294967295),8))

我一直无法使concatenate方法工作,因此尝试使用“&”图形进行连接。这似乎有效,但随后我在第二个
DEX2HEX
块上出现了一个无法解释的错误:
DEC2HEX(randbween(06553‌​5) ,4)
。Excel公式计算器说它无效,但我似乎根本不明白为什么。有什么想法吗?

我正在v.2013 excel vba宏代码中使用以下函数

Public Function GetGUID() As String 
    GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) 
End Function 

这根本不是函数的问题

我花了点时间去挖掘,但问题在于复制和粘贴。尝试复制此:
randbween(06553‌​5) 
string,张贴在原始问题中,并将其粘贴到十六进制编辑器中,然后您将看到65535中实际上有两个空字符:

00000000  52 41 4E 44 42 45 54 57 45 45 4E 28 30 2C 36 35  RANDBETWEEN(0,65
00000010  35 33 00 00 35 29                                53‌..​5)

对于现代版本的Excel,有逗号而不是分号的语法。我发布这个答案是为了方便其他人,所以他们不必替换字符串-我们都很懒。。。hrmp。。。人类,对吗

=连接(DEC2HEX(randtween(04294967295),8),“-”,DEC2HEX(randtween(042949),4),“-”,DEC2HEX(randtween(042949),4),“-”,DEC2HEX(randtween(04294967295),8),DEC2HEX(randtween(042949),4))

或者,如果你像我一样不喜欢当一个向导尖叫和叫喊时,而你,我们可以像这样走低一点

=LOWER(连接(DEC2HEX(Randbeth(04294967295),8),“-”,DEC2HEX(Randbeth(042949),4),“-”,DEC2HEX(Randbeth(042949),4),“-”,DEC2HEX(Randbeth(04294967295),8),DEC2HEX(Randbeth(042949),4)))


对我来说,这是正确的,用西班牙语

=CONCATENAR(
DEC.A.HEX(ALEATORIO.ENTRE(0,4294967295),8),"-",
DEC.A.HEX(ALEATORIO.ENTRE(0,65535),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(16384,20479),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(32768,49151),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(0,65535),4),
DEC.A.HEX(ALEATORIO.ENTRE(0,4294967295),8)
)

法语Excel的公式:

=CONCATENER(
DECHEX(ALEA.ENTRE.BORNES(0;4294967295);8);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;4294967295);8);
DECHEX(ALEA.ENTRE.BORNES(0;42949);4))

正如Josh M所指出的,这并没有提供一个兼容的GUID,但是这很适合我当前的需要。

德语Excel的公式:

=KLEIN(
    VERKETTEN(
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;8));8);"-";
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;4));4);"-";"4";
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;3));3);"-";
        DEZINHEX(ZUFALLSBEREICH(8;11));
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;3));3);"-";
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;8));8);
        DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;4));
    )
)

取自git@mobilitymaster。

荷兰Excel的公式:

=KLEINE.LETTERS(
    TEKST.SAMENVOEGEN(
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;8));8);"-";
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;4));4);"-";"4";
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;3));3);"-";
        DEC.N.HEX(ASELECTTUSSEN(8;11));
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;3));3);"-";
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;8));8);
        DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;4));4)
    )
)

意大利语版版本:

=CONCATENA(
    DECIMALE.HEX(CASUALE.TRA(0;4294967295);8);"-";
    DECIMALE.HEX(CASUALE.TRA(0;42949);4);"-";
    DECIMALE.HEX(CASUALE.TRA(0;42949);4);"-";
    DECIMALE.HEX(CASUALE.TRA(0;42949);4);"-";
    DECIMALE.HEX(CASUALE.TRA(0;4294967295);8);
    DECIMALE.HEX(CASUALE.TRA(0;42949);4))
ESP:


波兰语版本的公式:

=ZŁĄCZ.TEKSTY(
    DZIES.NA.SZESN(LOS.ZAKR(0;4294967295);8);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;4294967295);8);
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4)
)

在尝试了许多选项,并在更新版本的Excel(2016)中遇到了各种问题后,我从微软那里看到了这篇文章,它非常有魅力。我使用danwagner.co发布的一些代码对其进行了一些增强

Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As LongPtr

Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr

Function CreateGuidString(Optional IncludeHyphens As Boolean = True, Optional IncludeBraces As Boolean = False)
    Dim Guid As GUID_TYPE
    Dim strGuid As String
    Dim retValue As LongPtr

    Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

    retValue = CoCreateGuid(Guid)

    If retValue = 0 Then
        strGuid = String$(guidLength, vbNullChar)
        retValue = StringFromGUID2(Guid, StrPtr(strGuid), guidLength)

        If retValue = guidLength Then
            '   valid GUID as a string
            '   remove them from the GUID
            If Not IncludeHyphens Then
                strGuid = Replace(strGuid, "-", vbNullString, Compare:=vbTextCompare)
            End If

            '   If IncludeBraces is switched from the default False to True,
            '   leave those curly braces be!
            If Not IncludeBraces Then
                strGuid = Replace(strGuid, "{", vbNullString, Compare:=vbTextCompare)
                strGuid = Replace(strGuid, "}", vbNullString, Compare:=vbTextCompare)
            End If


            CreateGuidString = strGuid
        End If
    End If

End Function


Public Sub TestCreateGUID()
    Dim Guid As String
    Guid = CreateGuidString() '<~ default
    Debug.Print Guid
End Sub
Private将PtrSafe函数CoCreateGuid Lib“ole32.dll”(Guid作为Guid\u类型)声明为LongPtr
私有声明PtrSafe函数StringFromGUID2 Lib“ole32.dll”(Guid为Guid_类型,ByVal lpStrGuid为LongPtr,ByVal cbMax为LongPtr)为LongPtr
函数CreateGuidString(可选IncludeHyphens为Boolean=True,可选IncludeBraces为Boolean=False)
将Guid设置为Guid\u类型
将strGuid设置为字符串
作为LongPtr的Dim retValue
Const guidlelength As Long=39'带有空终止符{xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx}的注册表GUID格式
retValue=CoCreateGuid(Guid)
如果retValue=0,则
strGuid=String$(guidLength,vbNullChar)
retValue=StringFromGUID2(Guid、StrPtr(strGuid)、guidLength)
如果retValue=guidLength,则
'作为字符串的有效GUID
'从GUID中删除它们
如果不包括母鸡,那么
strGuid=Replace(strGuid,“-”,vbNullString,Compare:=vbTextCompare)
如果结束
'如果IncludeBraces从默认值False切换为True,
“别管那些花括号了!
如果没有,那么
strGuid=Replace(strGuid,“{”,vbNullString,Compare:=vbTextCompare)
strGuid=Replace(strGuid,“}”,vbNullString,Compare:=vbTextCompare)
如果结束
CreateGuidString=strGuid
如果结束
如果结束
端函数
公共子TestCreateGUID()
将Guid设置为字符串

Guid=CreateGuidString()“Ken Thompson是对的!”对我来说,这种方式也有效(excel 2016),但类型定义GUID\U类型被跳过,因此完整脚本是:

Private Type GUID_TYPE
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As LongPtr

Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr

Function CreateGuidString(Optional IncludeHyphens As Boolean = True, Optional IncludeBraces As Boolean = False)
    Dim Guid As GUID_TYPE
    Dim strGuid As String
    Dim retValue As LongPtr

    Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

    retValue = CoCreateGuid(Guid)

    If retValue = 0 Then
        strGuid = String$(guidLength, vbNullChar)
        retValue = StringFromGUID2(Guid, StrPtr(strGuid), guidLength)

        If retValue = guidLength Then
            '   valid GUID as a string
            '   remove them from the GUID
            If Not IncludeHyphens Then
                strGuid = Replace(strGuid, "-", vbNullString, Compare:=vbTextCompare)
            End If

            '   If IncludeBraces is switched from the default False to True,
            '   leave those curly braces be!
            If Not IncludeBraces Then
                strGuid = Replace(strGuid, "{", vbNullString, Compare:=vbTextCompare)
                strGuid = Replace(strGuid, "}", vbNullString, Compare:=vbTextCompare)
            End If


            CreateGuidString = strGuid
        End If
    End If

End Function

为什么不使用同一问题中提供的VBA代码?您使用的是哪个版本的Excel?AFAIK
RANDBETWEEN
仅于2007年推出。如果您使用2003,请将其替换为
INT(RAND()*65535)
@PeterAlbert
,但是我在第二个DEX2HEX块上得到了一个无法解释的错误(假设第一个块是正确的)
)@PeterL.:我不确定我是否理解您的评论…:-(我想我不必指出这不会产生“真实的”GUIDs-因为它们没有版本号。请参阅以获取详细信息无法使PeterL的解决方案在Excel 2013中工作。在总共10秒的函数调试之后,我发现您的解决方案更适合我。工作非常完美。谢谢!应该使用此解决方案,而不是Frazture的答案,因为它更简单,并且依赖于生成guid.Fraxture解决方案的系统(无意冒犯)甚至不创建有效的guid,因为它不考虑当前时间、MAC地址等。它们也不包括guid版本位。guid不仅仅是一组随机字符,它们背后有其含义。此处的详细信息:注意:库可能有问题(权限被拒绝)安装win update后:我确认@Radek的评论,即在对Office进行安全更新后,此机制不再工作。记录Microsoft建议的方法,以防止上述函数导致“权限被拒绝”错误或使用替代函数。声明函数CoCreateGuid Lib“ole32”(ByRef GUID为字节)如果Len(GUID)=8或Len(GUID)=13或Len(GUID)=18或Len(GUID),则只要N=0到15的公共函数GenerateGUID()作为字符串Dim ID(0到15)作为字节Dim N作为字符串Dim N作为字符串Dim-GUID N=23然后GUID=GUID&“-”如果下一个N生成GUID,则结束=
=ZŁĄCZ.TEKSTY(
    DZIES.NA.SZESN(LOS.ZAKR(0;4294967295);8);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4);"-";
    DZIES.NA.SZESN(LOS.ZAKR(0;4294967295);8);
    DZIES.NA.SZESN(LOS.ZAKR(0;42949);4)
)
Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As LongPtr

Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr

Function CreateGuidString(Optional IncludeHyphens As Boolean = True, Optional IncludeBraces As Boolean = False)
    Dim Guid As GUID_TYPE
    Dim strGuid As String
    Dim retValue As LongPtr

    Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

    retValue = CoCreateGuid(Guid)

    If retValue = 0 Then
        strGuid = String$(guidLength, vbNullChar)
        retValue = StringFromGUID2(Guid, StrPtr(strGuid), guidLength)

        If retValue = guidLength Then
            '   valid GUID as a string
            '   remove them from the GUID
            If Not IncludeHyphens Then
                strGuid = Replace(strGuid, "-", vbNullString, Compare:=vbTextCompare)
            End If

            '   If IncludeBraces is switched from the default False to True,
            '   leave those curly braces be!
            If Not IncludeBraces Then
                strGuid = Replace(strGuid, "{", vbNullString, Compare:=vbTextCompare)
                strGuid = Replace(strGuid, "}", vbNullString, Compare:=vbTextCompare)
            End If


            CreateGuidString = strGuid
        End If
    End If

End Function


Public Sub TestCreateGUID()
    Dim Guid As String
    Guid = CreateGuidString() '<~ default
    Debug.Print Guid
End Sub
Private Type GUID_TYPE
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
End Type

Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (Guid As GUID_TYPE) As LongPtr

Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (Guid As GUID_TYPE, ByVal lpStrGuid As LongPtr, ByVal cbMax As Long) As LongPtr

Function CreateGuidString(Optional IncludeHyphens As Boolean = True, Optional IncludeBraces As Boolean = False)
    Dim Guid As GUID_TYPE
    Dim strGuid As String
    Dim retValue As LongPtr

    Const guidLength As Long = 39 'registry GUID format with null terminator {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

    retValue = CoCreateGuid(Guid)

    If retValue = 0 Then
        strGuid = String$(guidLength, vbNullChar)
        retValue = StringFromGUID2(Guid, StrPtr(strGuid), guidLength)

        If retValue = guidLength Then
            '   valid GUID as a string
            '   remove them from the GUID
            If Not IncludeHyphens Then
                strGuid = Replace(strGuid, "-", vbNullString, Compare:=vbTextCompare)
            End If

            '   If IncludeBraces is switched from the default False to True,
            '   leave those curly braces be!
            If Not IncludeBraces Then
                strGuid = Replace(strGuid, "{", vbNullString, Compare:=vbTextCompare)
                strGuid = Replace(strGuid, "}", vbNullString, Compare:=vbTextCompare)
            End If


            CreateGuidString = strGuid
        End If
    End If

End Function