如何验证LEI代码

时间:2018-02-23 13:03:27

标签: vba excel-vba excel

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

LEI代码是:

  1. 20 char string
  2. 前18个字母字母数字
  3. 最后两个字符数字
  4. 示例:F50EOCWSQFAUVO9Q8Z97

    验证

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

      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
      

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

      有办法解决这个问题吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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 = Round(LEI_String / 97, 0)
MsgBox Round(LEI_String / 97, 0)

End Sub

答案 2 :(得分:-1)

这是一种使用 RegexC# 验证 LEI 的方法

bool IsValidLEI(string lei) {
    Regex leiValidationRegex = new Regex(@"[A-Z0-9]{18}\d{2}");
    return leiValidationRegex.IsMatch(lei);
}