我需要一个函数来为excel中的单元格添加GUID。我找到了this previous question on 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,6553 5),4)。 Excel公式评估员说这是无效的,但我似乎无法弄清楚为什么。有任何想法吗?
答案 0 :(得分:31)
从Excel的现代版本开始,语法是逗号,而不是分号。我发布这个答案是为了方便他人,所以他们不必更换字符串 - 我们都懒惰...... hrmp ......人类,对吗?
= 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))
或者,如果你喜欢我不喜欢一个guid尖叫和喊叫你,我们可以像这样低调。
= LOWER(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)))
答案 1 :(得分:26)
=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)
)
答案 2 :(得分:25)
我在v.2013 excel vba宏代码中使用以下功能
Public Function GetGUID() As String
GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36)
End Function
答案 3 :(得分:5)
这根本不是问题。
我花了一些时间挖掘,但问题在于复制和粘贴。尝试复制: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)
答案 4 :(得分:5)
va_start
取自git @mobilitymaster。
答案 5 :(得分:2)
对我来说这是正确的,用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)
)
答案 6 :(得分:1)
Dutch 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)
)
)
答案 7 :(得分:0)
法国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,但这对我目前的需求很有效。
答案 8 :(得分:0)
德语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));
)
)
答案 9 :(得分:0)
波兰语版本的公式:
=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)
)
答案 10 :(得分:0)
尝试了许多选项并遇到了较新版本的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
原始MS帖子中还有其他选项,可在此处找到: https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-msoffice_custom-mso_2010/guid-run-time-error-70-permission-denied/c9ee4076-98af-4032-bc87-40ad7aa7cb38
答案 11 :(得分:0)
肯·汤普森是对的! -对我来说,这种方式也有效(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
答案 12 :(得分:-1)
意大利语版本:
=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))
答案 13 :(得分:-1)
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)
)