【问题标题】:VBA generate a codeVBA生成代码
【发布时间】:2018-09-26 06:47:11
【问题描述】:

那里。我编写了这段代码,用两个数字替换了一个字符(例如 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
  • 正如文森特指出的那样,您将 char 替换为 char,因此在将 0 替换为 10 之后,您将在相同的输入上再次替换。一个解决方案是从一个空字符串开始,并在循环中构建它,使用&

标签: excel vba


【解决方案1】:

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

如果你想保持同一种算法(这可能不是一个好的选择),你需要改变AccCharsRegChars,这样一个字符就永远不会被一个可以给出找到的字符的字符串替换稍后在 AccChars 字符串上。在您的情况下,只需将 Const AccChars = "012 ... 替换为 Const AccChars = "102 ...Const RegChars = "101112 ... 替换为 Const RegChars = "111012 ...

但是完全改变你的算法可能会更好。我首先建议不要使用就地编辑字符串,而是使用 2 个字符串。

【讨论】:

  • 哇...非常感谢!!!工作得很好!!!正如您和其他人所建议的那样,我将探索另一种更有效的解决方案(因为我的数据库非常庞大)。再次,非常感谢你!!!
【解决方案2】:

除了不正确之外,您当前的代码效率低下,因为它涉及多次而不是一次扫描代码字符串。只需扫描字符串一次,将替换内容收集到最后连接的数组中:

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 - 77Asc("A") - 19 = 65-19 = 46

【讨论】:

  • 工作得很好,显然,它比我所做的更有效率。感谢您优雅的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2018-06-07
  • 1970-01-01
  • 2018-06-15
  • 2010-10-31
相关资源
最近更新 更多