如何在Excel中创建GUID?
如何在Excel中创建GUID?
我需要一个将GUID添加到Excel单元格的函数。我在stackoverflow上找到了一个相关问题(链接),但它没有起作用。它建议使用以下函数:\n=CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),\"-\",DEC2HEX(RANDBETWEEN(0,65535),4),\"-\"\n ,DEC2HEX(RANDBETWEEN(16384,20479),4),\"-\",DEC2HEX(RANDBETWEEN(32768,49151),4),\"-\"\n ,DEC2HEX(RANDBETWEEN(0,65535),4),DEC2HEX(RANDBETWEEN(0,4294967295),8))\n
\n我无法使concatenate方法起作用,所以尝试使用\"&\"符号进行拼接。看起来似乎可以工作,但是我在第二个DEX2HEX
块上遇到了一个无法解释的错误:DEC2HEX(RANDBETWEEN(0,65535),4)
。Excel公式计算器显示它是无效的,但我无法弄清楚原因。有什么想法吗?
如何在Excel中创建GUID?
有人在Excel 2013中使用以下代码创建GUID,但是遇到了一些问题:
=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)
)
但是,这段代码中使用的分号在Excel中会被解析为函数分隔符,而不是作为参数的分隔符。因此,代码需要进行修改,将所有的分号替换为逗号:
=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。
需要注意的是,这段代码生成的不是有效的版本4的GUID/UUID。可以参考维基百科中的相关说明:en.wikipedia.org/wiki/…
如果需要生成有效的版本4的GUID/UUID,可以参考以下链接中给出的代码:
- stackoverflow.com/a/12219726/729642
- Masud、Fredder、nidkil等用户的答案。
此外,有人认为RANDBETWEEN(0;42949)
应该改为RANDBETWEEN(0;65535)
,否则GUID中的四位数字部分将只在0000和A7C5之间,而实际上应该可以达到FFFF的范围。
在Excel中创建GUID的问题是由于需要在VBA宏代码中生成GUID而引起的。下面是解决这个问题的方法。
首先,可以使用以下VBA函数来生成GUID:
Public Function GetGUID() As String GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) End Function
这个函数是一个比较简单且可靠的方法来生成GUID。它使用了系统来生成GUID,因此不需要考虑当前时间、MAC地址等因素。
除了上述方法,还可以使用以下VBA函数来生成GUID:
Declare Function CoCreateGuid Lib "ole32" (ByRef GUID As Byte) As Long Public Function GenerateGUID() As String Dim ID(0 To 15) As Byte Dim N As Long Dim GUID As String Dim Res As Long Res = CoCreateGuid(ID(0)) For N = 0 To 15 GUID = GUID & IIf(ID(N) < 16, "0", "") & Hex$(ID(N)) If Len(GUID) = 8 Or Len(GUID) = 13 Or Len(GUID) = 18 Or Len(GUID) = 23 Then GUID = GUID & "-" End If Next N GenerateGUID = GUID End Function
这个函数使用了CoCreateGuid函数来生成GUID,并且添加了一些格式化的代码,使生成的GUID符合标准的格式。
需要注意的是,在安装Windows更新之后,可能会遇到库的问题(权限被拒绝)。可以参考以下链接中的解决方法:
https://stackoverflow.com/questions/45082258
另外,有用户在安全更新后报告说上述方法不再有效。可以参考以下链接中的解决方法:
https://stackoverflow.com/a/45332789/575559
这个链接中提到了微软推荐的方法,可以避免上述函数在引发“权限被拒绝”错误时使用,或者使用替代函数来生成GUID。
以上是在Excel中创建GUID的原因以及解决方法的整理。
如何在Excel中创建GUID?
在现代版本的Excel中,有逗号而不是分号的语法。我发布这个答案是为了方便其他人,这样他们就不必替换字符串——我们都很懒……嗯……人类,对吧?
=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))
或者,如果你像我一样不喜欢一个GUID大声喊叫,你可以像这样使用小写。
=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)))
逗号和分号之间的区别是因为本地化而不是现代或不那么现代的Excel。然而好答案。
完美!经过测试并且使用。
我需要分号,即=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))
我认为这是我有史以来最受欢迎的答案。有点难过,因为我在其他技术方面更有技巧。当然,我对得到的任何东西都很高兴,但还是……
不要误解我,你的答案对我很有用,我给了你点赞。只是想提一下,由于某些原因,我的Excel版本需要使用分号而不是逗号分隔参数——不知道可以在哪里配置(但正如trigras提到的,肯定是本地化问题)。然而,使用逗号,它在我的电脑上不起作用,但使用分号则可以——所以我想这可能对某些人有用,我将其放在评论中。
我不能代表他的经验。我相信不同版本之间可能会有所更改,但这也可能取决于本地化。重要的是要记住,它总是有可能更改,所以如果停止工作,应该尝试这个和那个。谢谢你的点赞。我喜欢那些小勾勾,哈哈。
如果有人在西班牙(español)的Excel安装中需要它:=CONCATENAR(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);"-";DEC.A.HEX(ALEATORIO.ENTRE(0;65536);4);"-";DEC.A.HEX(ALEATORIO.ENTRE(0;65536);4);"-";DEC.A.HEX(ALEATORIO.ENTRE(0;65536);4);"-";DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);DEC.A.HEX(ALEATORIO.ENTRE(0;65536);4))
请注意,这不是UUID v4。第三个组需要以4开头。
我不确定是否理解你的意思。你能提供任何支持该说法的参考资料吗?据我所知,没有限制任何定义组包含的内容。
我看到M位数表示版本,可能是4。然而,并没有说明应该是4。你是否在说建议的Excel公式生成的版本是4?如何确定?请帮助我理解。
随机UUID是版本4。所有版本都分配给不同的目的。guid.one/guid
我不知道GUID的这个属性。我感到受宠若惊和惊讶。非常感谢您教育我。这是一个非常有趣的知识。
用户发布的公式的问题在于其中一个65535个字符中有两个空字符(CHAR(0)
)。请参阅下面的我的答案。
这个评论是在回答我的答案、原始问题还是任何评论吗?