如何验证LEI代码

as_*_*ack 5 excel vba excel-vba

我正在写一个宏来验证LEI代码.

LEI代码是:

  1. 20个字符串
  2. 前18个字母字母数字
  3. 最后两个字符数字

示例:F50EOCWSQFAUVO9Q8Z97

验证

  1. 将字符串中的所有字母字符替换为2位数字以创建整数
  2. 如果整数mod除以97为1则代码有效,否则无效

我写了以下内容:

Sub Test()

Dim LEI_String As String

    LEI_String = Range("B1")

    LEI_String = Replace(LEI_String, "A", "10")
    LEI_String = Replace(LEI_String, "B", "11")
    LEI_String = Replace(LEI_String, "C", "12")
    LEI_String = Replace(LEI_String, "D", "13")
    LEI_String = Replace(LEI_String, "E", "14")
    LEI_String = Replace(LEI_String, "F", "15")
    LEI_String = Replace(LEI_String, "G", "16")
    LEI_String = Replace(LEI_String, "H", "17")
    LEI_String = Replace(LEI_String, "I", "18")
    LEI_String = Replace(LEI_String, "J", "19")
    LEI_String = Replace(LEI_String, "K", "20")
    LEI_String = Replace(LEI_String, "L", "21")
    LEI_String = Replace(LEI_String, "M", "22")
    LEI_String = Replace(LEI_String, "N", "23")
    LEI_String = Replace(LEI_String, "O", "24")
    LEI_String = Replace(LEI_String, "P", "25")
    LEI_String = Replace(LEI_String, "Q", "26")
    LEI_String = Replace(LEI_String, "R", "27")
    LEI_String = Replace(LEI_String, "S", "28")
    LEI_String = Replace(LEI_String, "T", "29")
    LEI_String = Replace(LEI_String, "U", "30")
    LEI_String = Replace(LEI_String, "V", "31")
    LEI_String = Replace(LEI_String, "W", "32")
    LEI_String = Replace(LEI_String, "X", "33")
    LEI_String = Replace(LEI_String, "Y", "34")
    LEI_String = Replace(LEI_String, "Z", "35")


    MsgBox Len(LEI_String)
    Range("B2").Value = CCur(LEI_String) Mod 97
    MsgBox CCur(LEI_String) Mod 97

End Sub
Run Code Online (Sandbox Code Playgroud)

我当然得到运行时错误6溢出错误,因为我正在使用的整数长度为35位.

有办法解决这个问题吗?

Flo*_* B. 6

LEI数字太大而不适合Decimal类型.要获得模数,您必须在转换为基数10后计算每个数字的模数:

Private Sub Test()

  Debug.Print IsValidLEI("F50EOCWSQFAUVO9Q8Z97")  ' >> True   '
  Debug.Print IsValidLEI("T50EOCWSQFAUVO9Q8Z97")  ' >> False  '

End Sub

Public Function IsValidLEI(lei As String) As Boolean
  Dim i As Long, c As Long, m As Long

  For i = 1 To Len(lei)  ' each character '
    c = AscW(Mid(lei, i, 1))  ' get the character code (see ASCII table) '

    Select Case c
      Case 48 To 57 ' 0-9 -> 0-9 '
        m = (m * 10 + c - 48) Mod 97  ' x10 to shift 1 digit, -48 to convert to base10 '
      Case 65 To 90 ' A-Z -> 10-35 '
        m = (m * 100 + c - 55) Mod 97 ' x100 to shift 2 digits, -55 to convert to base10 '
      Case Else
        Err.Raise 5, , "Unexpected character at " & i
    End Select
  Next

  IsValidLEI = m = 1
End Function
Run Code Online (Sandbox Code Playgroud)