Excel VBA生成一个代码

Excel VBA生成一个代码,excel,vba,Excel,Vba,在那里。我编写了这段代码,它将一个字符替换为两个数字(例如,0=10;1=11;2=12;…),除第一个元素(零元素)外,其他一切都正常工作。所以,如果我把“010a4”字符串放在单元格A1上,并使用我的公式“=GENERATECODE(A1)”,我的预期返回值是“1011102014”,但我得到了一个“110111102014”字符串。所以,只有零值出现这个错误,我不知道为什么。有什么想法吗 我的代码: Function GENERATECODE(Code As String)

在那里。我编写了这段代码,它将一个字符替换为两个数字(例如,0=10;1=11;2=12;…),除第一个元素(零元素)外,其他一切都正常工作。所以,如果我把“010a4”字符串放在单元格A1上,并使用我的公式“=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

您的问题是,您的代码首先将每个
0
更改为
10
,然后将每个
1
更改为
11
。所以每个
0
都会给你
10
然后
110

如果要保留相同类型的算法(这可能不是一个好的选择),则需要更改
AccChars
RegChars
,以使字符永远不会被字符串替换,而该字符串可以提供稍后在
AccChars
字符串上找到的字符。在您的情况下,只需按照
Const-AccChars=“012…”替换
Const-AccChars=“102…”和
Const-RegChars=“101112…”
per
Const-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在循环中构建它。。。非常感谢你!!!工作很好!!!正如您和其他人所建议的,我将探索另一种更有效的解决方案(因为我的数据库非常庞大)。再次感谢大家!!!工作很好,显然,它比我所做的更有效率。感谢您优雅的解决方案!!