我需要一个函数来将 GUID 添加到 Excel 中的单元格。我在 stackoverflow 上找到了上一个问题,但它不起作用。它建议使用以下功能:
=CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-"
,DEC2HEX(RANDBETWEEN(16384,20479),4),"-",DEC2HEX(RANDBETWEEN(32768,49151),4),"-"
,DEC2HEX(RANDBETWEEN(0,65535),4),DEC2HEX(RANDBETWEEN(0,4294967295),8))
我一直无法让连接方法起作用,所以尝试使用“&”数字来连接。这似乎有效,但随后我在第二个
DEX2HEX
块上遇到了莫名其妙的错误:DEC2HEX(RANDBETWEEN(0,65535),4)
。 Excel 公式计算器说它无效,但我似乎根本不明白为什么。有什么想法吗?
从现代版本的 Excel 开始,语法中使用逗号,而不是分号。我发布这个答案是为了方便其他人,这样他们就不必更换字符串 - 我们都很懒...... hrmp ... 人类,对吗?
=连接(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"- ",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,4294967295),8),DEC2HEX(RANDBETWEEN(0,65535),4))
或者,如果你像我一样不喜欢向导尖叫和大喊大叫,我们可以像这样使用小写。
=LOWER(CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,65535),4), "-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,4294967295),8),DEC2HEX(RANDBETWEEN(0,65535),4)))
=CONCATENATE(
DEC2HEX(RANDBETWEEN(0;4294967295);8);"-";
DEC2HEX(RANDBETWEEN(0;42949);4);"-";
DEC2HEX(RANDBETWEEN(0;42949);4);"-";
DEC2HEX(RANDBETWEEN(0;42949);4);"-";
DEC2HEX(RANDBETWEEN(0;4294967295);8);
DEC2HEX(RANDBETWEEN(0;42949);4)
)
我在 v.2013 excel vba 宏代码中使用以下函数
Public Function GetGUID() As String
GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36)
End Function
=LOWER(
CONCATENATE(
DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8), "-",
DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4),"-","4",
DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"-",
DEC2HEX(RANDBETWEEN(8,11)),
DEC2HEX(RANDBETWEEN(0,POWER(16,3)),3),"-",
DEC2HEX(RANDBETWEEN(0,POWER(16,8)),8),
DEC2HEX(RANDBETWEEN(0,POWER(16,4)),4)
)
)
取自 git @mobilitymaster。
这根本不是功能问题。
我花了一些时间挖掘,但问题在于复制和粘贴。尝试复制这个:
RANDBETWEEN(0,65535)
字符串,发布在你原来的问题中,并将其粘贴到十六进制编辑器中,然后你会看到 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 西班牙语中
=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 的公式:
=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)
)
)
法语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));
)
)
在尝试了多种选项并遇到了较新版本的 Excel (2016) 的各种问题后,我发现了 MS 的这篇文章,它非常有用。我使用 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
肯·汤普森是对的! - 对我来说,这种方式也有效(excel 2016),但类型定义 GUID_TYPE 被跳过,所以完整的脚本是:
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
除了这里所有其他有价值的答案。对于那些对符合 RFC 4122 的通用唯一标识符 (UUID) 版本 4 感兴趣的人,我建议使用此公式。
=CONCATENATE(
DEC2HEX(RANDBETWEEN(0;4294967296);8);"-";
DEC2HEX(RANDBETWEEN(0;65536);4);"-";
DEC2HEX(RANDBETWEEN(0;65536);4);"-4";
DEC2HEX(RANDBETWEEN(0;4096);3);"-";
DEC2HEX(RANDBETWEEN(0;4294967296);8);
DEC2HEX(RANDBETWEEN(0;65536);4))
随机最终结果示例8D8AC610-566D-4EF0-9C22-186B2A5ED793
下面是上面的答案。但有兴趣的人可以了解详细信息。
关于上式的假设:
您的 MS Excel 或 LibreOffice Calc 配置为使用本地英语和分号作为分隔符
在 UUID 第三组中,
4
前缀表示该 UUID 基于 UUID 版本 4。如果这个数字是固定的。所有其他值可能会改变。详情请见:
如果您的 MS Excel 或 LibreOffice 使用另一种本地(语言),您需要适当调整此公式。
例如,在法语中,正确的公式是这样的:
=CONCATENER(
DECHEX(ALEA.ENTRE.BORNES(0;4294967296);8);"-";
DECHEX(ALEA.ENTRE.BORNES(0;65536);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;65536);4);"-4";
DECHEX(ALEA.ENTRE.BORNES(0;4096);3);"-";
DECHEX(ALEA.ENTRE.BORNES(0;4294967296);8);
DECHEX(ALEA.ENTRE.BORNES(0;65536);4))
要创建新的UUID,只需退出单元格编辑模式,在查看单元格时按F7键,这将自动计算新的UUID。
此公式的灵感来自 Matt。我针对 UUID 版本 4 格式和十六进制值的最大数量进行了调整。我假设是 16^8 = 4294967296、16^4 = 65536、16^3 = 4096。
波兰语版本的公式:
=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)
)
ESP:
=CONCATENAR(
DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);"-";
DEC.A.HEX(ALEATORIO.ENTRE(0;42949);4);"-";
DEC.A.HEX(ALEATORIO.ENTRE(0;42949);4);"-";
DEC.A.HEX(ALEATORIO.ENTRE(0;42949);4);"-";
DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);
DEC.A.HEX(ALEATORIO.ENTRE(0;42949);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))