那里。我编写的代码替换了两个数字的字符(例如0= 10;1= 11;2= 12;.)除了第一个元素(零元素),一切都很好。因此,如果我在单元格A1上放置"010a4“字符串,并使用我的公式"=GENERATECODE(A1)",我的预期返回值是"1011102014”,但我有一个"110111102014“字符串。所以,只有零值才会出现这个错误,我不知道为什么。有什么想法吗?
我的代码:
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发布于 2018-04-16 14:22:54
除了不正确之外,您当前的代码效率很低,因为它需要多次扫描代码字符串,而不是只扫描一次。只需扫描一次字符串,将替换收集到一个数组中,该数组在末尾被连接:
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。
发布于 2018-04-16 14:12:57
您的问题是,您的代码首先将每个0更改为10,然后将每个1更改为11。所以每个0给你10,然后是110。
如果您想保持相同的算法(这可能不是一个好的选择),那么您需要更改AccChars和RegChars,以便一个字符永远不会被一个可以给出稍后在AccChars字符串上找到的字符的字符串所取代。在您的情况下,只需将Const AccChars = "012 ...替换为Const AccChars = "102 ...,将Const RegChars = "101112 ...替换为Const RegChars = "111012 ...
但是最好完全改变你的算法。我首先建议不要使用字符串的就地编辑,而是使用2个string。
https://stackoverflow.com/questions/49858828
复制相似问题