Excel VBA生成一个代码
在那里。我编写了这段代码,它将一个字符替换为两个数字(例如,0=10;1=11;2=12;…),除第一个元素(零元素)外,其他一切都正常工作。所以,如果我把“010a4”字符串放在单元格A1上,并使用我的公式“=GENERATECODE(A1)”,我的预期返回值是“1011102014”,但我得到了一个“110111102014”字符串。所以,只有零值出现这个错误,我不知道为什么。有什么想法吗 我的代码:Excel VBA生成一个代码,excel,vba,Excel,Vba,在那里。我编写了这段代码,它将一个字符替换为两个数字(例如,0=10;1=11;2=12;…),除第一个元素(零元素)外,其他一切都正常工作。所以,如果我把“010a4”字符串放在单元格A1上,并使用我的公式“=GENERATECODE(A1)”,我的预期返回值是“1011102014”,但我得到了一个“110111102014”字符串。所以,只有零值出现这个错误,我不知道为什么。有什么想法吗 我的代码: Function GENERATECODE(Code As String)
Function GENERATECODE(Code As String)
Dim A As String
Dim B As String
Dim i As Integer
Const AccChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const RegChars = "1011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071"
For i = 1 To Len(AccChars)
A = Mid(AccChars, i, 1)
B = Mid(RegChars, 2 * i - 1, 2)
Code = Replace(Code, A, B)
Next
GENERATECODE = Code
End Function
您的问题是,您的代码首先将每个
0
更改为10
,然后将每个1
更改为11
。所以每个0
都会给你10
然后110
如果要保留相同类型的算法(这可能不是一个好的选择),则需要更改AccChars
和RegChars
,以使字符永远不会被字符串替换,而该字符串可以提供稍后在AccChars
字符串上找到的字符。在您的情况下,只需按照Const-AccChars=“012…”替换Const-AccChars=“102…”和Const-RegChars=“101112…”
perConst-RegChars=“111012…”
但最好是完全改变你的算法。首先,我建议不要使用字符串的就地编辑,而是使用两个字符串。除了不正确之外,您当前的代码效率低下,因为它涉及多次扫描代码字符串,而不是只扫描一次。只需在字符串上扫描一次,将替换项收集到一个数组中,该数组在末尾连接:
Function GENERATECODE(Code As String) As String
Dim codes As Variant
Dim i As Long, n As Long
Dim c As String
n = Len(Code)
ReDim codes(1 To n)
For i = 1 To n
c = Mid(Code, i, 1)
Select Case c
Case "0" To "9":
codes(i) = "1" & c
Case "a" To "z":
codes(i) = Asc(c) - 77
Case "A" To "Z":
codes(i) = Asc(c) - 19
Case Else:
codes(i) = "??"
End Select
Next i
GENERATECODE = Join(codes, "")
End Function
例如:
?generatecode("010a4")
1011102014
这两个偏移的要点是希望“a”映射到20,“a”映射到46。注Asc(“a”)-77=97-77
和Asc(“a”)-19=65-19=46
您的问题是,您的代码首先将每个0
更改为10
,然后将每个1
更改为11
。所以每个0
都会给你10
然后110
。正如文森特指出的,你正在一个字符一个字符地替换字符,因此在用10替换0之后,你会在相同的输入上再次替换。解决方案是从一个空字符串开始,使用&
Wow在循环中构建它。。。非常感谢你!!!工作很好!!!正如您和其他人所建议的,我将探索另一种更有效的解决方案(因为我的数据库非常庞大)。再次感谢大家!!!工作很好,显然,它比我所做的更有效率。感谢您优雅的解决方案!!