我有一张表格,其中B列是名字列表,A列是ID。我想知道是否有某种公式可以根据该行中B列的值生成基于文本的ID?每个名称也是唯一的,在任何情况下都不会重复。
最好不要使用VBA,但如果必须,也无妨。
我有一张表格,其中B列是名字列表,A列是ID。我想知道是否有某种公式可以根据该行中B列的值生成基于文本的ID?每个名称也是唯一的,在任何情况下都不会重复。
最好不要使用VBA,但如果必须,也无妨。
无需使用VBA的解决方案。
逻辑基于单元格中前8个字符和字符数。
= CODE(cell)
返回第一个字母的代码编号
= CODE(MID(cell,2,1))
返回第二个字母的代码编号
= IFERROR(CODE(MID(cell,9,1))
如果第9个字符不存在,则返回0
= LEN(cell)
单元格中字符数
连接前8个代码 + 在末尾添加字符长度
如果8个字符不足,则为字符串中的下一个字符复制额外的代码。
最终函数:
=CODE(B2)&IFERROR(CODE(MID(B2,2,1)),0)&IFERROR(CODE(MID(B2,3,1)),0)&IFERROR(CODE(MID(B2,4,1)),0)&IFERROR(CODE(MID(B2,5,1)),0)&IFERROR(CODE(MID(B2,6,1)),0)&IFERROR(CODE(MID(B2,7,1)),0)&IFERROR(CODE(MID(B2,8,1)),0)&LEN(B2)
=(1000+CODE(B2))&IFERROR(1000+CODE(MID(B2,2,1)),0)&IFERROR(1000+CODE(MID(B2,3,1)),0)&IFERROR(1000+CODE(MID(B2,4,1)),0)&IFERROR(1000+CODE(MID(B2,5,1)),0)&IFERROR(1000+CODE(MID(B2,6,1)),0)&IFERROR(1000+CODE(MID(B2,7,1)),0)&IFERROR(1000+CODE(MID(B2,8,1)),0)&LEN(B2)
- milan minarovic抱歉,我没有找到仅使用公式的解决方案,即使this thread可能会有所帮助(尝试计算scrabble游戏中的得分),但我没有找到确保生成的哈希值是唯一的方法。
然而,这是我的解决方案,基于一个UDF(用户定义函数):
将代码放入模块中:
Public Function genId(ByVal sName As String) As Long
'Function to create a unique hash by summing the ascii value of each character of a given string
Dim sLetter As String
Dim i As Integer
For i = 1 To Len(sName)
genId = Asc(Mid(sName, i, 1)) * i + genId
Next i
End Function
然后在您的工作表中像公式一样调用它:
=genId(A1)
* i
以考虑顺序。它在我的单元测试中运行正常。也许对你的需求有些过头了,但你可以调用 CoCreateGuid
来获取一个真正的 GUID
Private Declare Function CoCreateGuid Lib "ole32" (ID As Any) As Long
Function GUID() As String
Dim ID(0 To 15) As Byte
Dim i As Long
If CoCreateGuid(ID(0)) = 0 Then
For i = 0 To 15
GUID = GUID & Format(Hex$(ID(i)), "00")
Next
Else
GUID = "Error while creating GUID!"
End If
End Function
测试使用
Sub testGUID()
MsgBox GUID
End Sub
你是否只想在你的值旁边有一个递增的数字 id 列?如果是这样,并且你的值始终是唯一的,你可以很容易地使用公式来实现。
如果你的值在 B 列中,例如从标题下面的 B2 开始,那么在 A2 中,你将输入公式 "=IF(B2="","",1+MAX(A$1:A1))"。你可以将其复制并粘贴到数据扩展的范围内,它将为 B 列中每一行递增一个数字标识符,该行不为空。
如果你需要做更复杂的事情,比如识别和重新识别重复的值,或者使标识符在填充后“冻结”,请让我知道。目前,当你清除或添加值到列表时,标识符将上下切换,因此如果你的数据发生变化,你需要小心。
基于文本中特定字符数量的唯一标识符。我使用了基于元音和数字的标识符。
=LEN($J$14)-LEN(SUBSTITUTE($J$14;"a";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"e";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"i";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"j";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"o";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"u";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"y";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"1";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"2";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"3";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"4";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"5";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"6";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"7";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"8";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"9";""))&LEN($J$14)-LEN(SUBSTITUTE($J$14;"0";""))
你说你有信心你的单词中没有重复的值。更进一步,你确定任何单词的前8个字符都是唯一的吗?
如果是这样,您可以使用以下公式。它通过逐个获取每个字符的ASCII代码-40 [假设正常字符,这将使数字在8和57之间,字母在57和122之间],并将该字符代码乘以10 ^ [该字符的数字位置在单词中]。基本上,它取该字符代码[-40],并将每个代码连接到下一个。
编辑请注意,此代码不再需要至少存在8个字符才能防止错误,因为实际要编码的单词已附加了8个“0”。
=TEXT(SUM((CODE(MID(LOWER(RIGHT(REPT("0",8)&A3,8)),{1,2,3,4,5,6,7,8},1))-40)*10^{0,2,4,6,8,10,12,14}),"#")
=RIGHT(REPT("0",15)&TEXT(SUM(LEN(A3)*10^{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}-LEN(SUBSTITUTE(A3,MID(Alphabet,{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},1),""))*10^{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}),"#"),15)
[公式中的RIGHT("00000000000000"…部分旨在保持所有代码具有相同数量的字符]
请注意,这里的Alphabet是一个命名字符串,其中包含字符:“abcdehilmnorstu”。例如,使用上述公式,“asdf”单词计算a、s和d的实例,但不计算不在我的缩写字母表中的“f”。 “asdf”的代码将是:
001000000001001
这仅适用于以下假设:
未列出的字母(也不包括数字/特殊字符)不需要使每个名称唯一。例如,asdf和asd在上述方法中具有相同的代码。
并且,
字母的顺序不需要使每个名称唯一。例如,asd和dsa在上述方法中具有相同的代码。