【问题标题】:Validate IBAN in Excel在 Excel 中验证 IBAN
【发布时间】:2012-01-12 17:17:48
【问题描述】:

是否有任何现成的 Excel 表来验证 IBAN?我将输入 IBAN,它会显示有效或无效。

我搜索了多个Adds In,发现this one

但我不知道如何打开它。 有人可以帮忙吗?

【问题讨论】:

    标签: excel excel-2007 excel-2003 vba


    【解决方案1】:

    这个呢,格式问题解决了吗,进行“97校验”:

    Public Function VALIDATEIBAN(ByVal IBAN As String) As String
    
    ' Created by : Koen Rijnsent (www.castoro.nl)
    ' Inspired by : Chris Fannin (AbbydonKrafts)
    ' Inspired by : bonsvr (http://stackoverflow.com/users/872583/bonsvr)
    
    On Error GoTo CatchError
    
    Dim objRegExp As Object
    Dim IBANformat As Boolean
    Dim IBANNR As String
    Dim ReplaceChr As String
    Dim ReplaceBy As String
    
    'Check format
    IBAN = UCase(IBAN)
    Set objRegExp = CreateObject("vbscript.regexp")
    objRegExp.IgnoreCase = True
    objRegExp.Global = True
    objRegExp.Pattern = "[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}"
    IBANformat = objRegExp.Test(IBAN)
    
    'Validity of country code will not be checked!
    If IBANformat = False Then
        VALIDATEIBAN = "FORMAT NOT RECOGNIZED"
    Else
        'Flip first 4 characters to the back
        IBANNR = Right(IBAN, Len(IBAN) - 4) & Left(IBAN, 4)
    
        'Replace letters by the right numbers
        For Nr = 10 To 35
            ReplaceChr = Chr(Nr + 55)
            ReplaceBy = Trim(Str(Nr))
            IBANNR = Replace(IBANNR, ReplaceChr, ReplaceBy)
        Next Nr
    
        'Loop through the IBAN, as it is too long to calculate at one go
        CurrPart = ""
        Answer = ""
        For CurrDigit = 1 To Len(IBANNR)
            CurrPart = CurrPart & Mid$(IBANNR, CurrDigit, 1)
            CurrNumber = CLng(CurrPart)
            'If the number can be divided
            If 97 <= CurrNumber Then
                LeftOver = CurrNumber Mod 97
                WorkValue = (CurrNumber - LeftOver) / 97
                Answer = Answer & CStr(WorkValue)
                CurrPart = CStr(LeftOver)
            Else
                'If no division occurred, add a trailing zero
                If Len(Answer) > 0 Then
                    Answer = Answer & "0"
                    'Exception for the last number
                    If CurrDigit = Len(IBANNR) Then
                        LeftOver = CurrNumber Mod 97
                    Else
                    End If
                Else
                End If
            End If
        Next
        If LeftOver = 1 Then
            VALIDATEIBAN = "IBAN OK"
        Else
            VALIDATEIBAN = "97 CHECK FAILED"
        End If
    End If
    
    Exit Function
    
    CatchError:
        VALIDATEIBAN = "ERROR: " & Err.Description
        MsgBox "Module: " & MODULE_NAME & " - VALIDATEIBAN function" & vbCrLf & vbCrLf _
        & "Error#:  " & Err.Number & vbCrLf & vbCrLf & Err.Description
    
    End Function
    

    【讨论】:

      【解决方案2】:
      Option Compare Database
      Option Explicit
      
         ' http://en.wikipedia.org/wiki/International_Bank_Account_Number
         Private Const IbanCountryLengths As String =    "AL28AD24AT20AZ28BH22BE16BA20BR29BG22CR21HR21CY28CZ24DK18DO28EE20FO18" & _
                                                      "FI18FR27GE22DE22GI23GR27GL18GT28HU28IS26IE22IL23IT27KZ20KW30LV21LB28" & _
                                                      "LI21LT20LU20MK19MT31MR27MU30MC27MD24ME22NL18NO15PK24PS29PL28PT25RO24" & _
                                                      "SM27SA24RS22SK24SI19ES24SE24CH21TN24TR26AE23GB22VG24QA29"
      
         Private Function ValidateIbanCountryLength(CountryCode As String, IbanLength    As Integer) As Boolean
          Dim i As Integer
          For i = 0 To Len(IbanCountryLengths) / 4 - 1
              If Mid(IbanCountryLengths, i * 4 + 1, 2) = CountryCode And _
                          CInt(Mid(IbanCountryLengths, i * 4 + 3, 2)) = IbanLength Then
                  ValidateIbanCountryLength = True
                  Exit Function
              End If
          Next i
          ValidateIbanCountryLength = False
      End Function
      
      Private Function Mod97(Num As String) As Integer
          Dim lngTemp As Long
          Dim strTemp As String
      
          Do While Val(Num) >= 97
              If Len(Num) > 5 Then
                  strTemp = Left(Num, 5)
                  Num = Right(Num, Len(Num) - 5)
              Else
                  strTemp = Num
                  Num = ""
              End If
              lngTemp = CLng(strTemp)
              lngTemp = lngTemp Mod 97
              strTemp = CStr(lngTemp)
              Num = strTemp & Num
          Loop
          Mod97 = CInt(Num)
      End Function
      
      Public Function ValidateIban(IBAN As String) As Boolean
          Dim strIban As String
          Dim i As Integer
      
          strIban = UCase(IBAN)
          ' Remove spaces
          strIban = Replace(strIban, " ", "")
      
          ' Check if IBAN contains only uppercase characters and numbers
          For i = 1 To Len(strIban)
              If Not ((Asc(Mid(strIban, i, 1)) <= Asc("9") And Asc(Mid(strIban, i, 1)) >= Asc("0")) Or _
                      (Asc(Mid(strIban, i, 1)) <= Asc("Z") And Asc(Mid(strIban, i, 1)) >= Asc("A"))) Then
                  ValidateIban = False
                  Exit Function
              End If
          Next i
      
          ' Check if length of IBAN equals expected length for country
          If Not ValidateIbanCountryLength(Left(strIban, 2), Len(strIban)) Then
              ValidateIban = False
              Exit Function
          End If
      
          ' Rearrange
          strIban = Right(strIban, Len(strIban) - 4) & Left(strIban, 4)
      
          ' Replace characters
          For i = 0 To 25
              strIban = Replace(strIban, Chr(i + Asc("A")), i + 10)
          Next i
      
          ' Check remainder
          ValidateIban = Mod97(strIban) = 1
      End Function
      

      来源:http://www.aswinvanwoudenberg.com/2013/07/18/vba-iban-validator/

      【讨论】:

      • 欢迎来到 StackOverflow,在此之前您可能需要阅读 how to post an answer。提供一些上下文来解释您发布该代码的原因以及它的作用。
      【解决方案3】:

      我发现 bonsvr 的回答很有帮助,谢谢。根据我对代码的阅读,这似乎是特定于 CZ 范围的帐户。

      由于我主要处理爱尔兰、英国和德国的 IBAN 代码,因此我开发了这个正则表达式以将 objRegExp.Pattern = ... 替换为 ...

      objRegExp.Pattern = "^[GB|IE]{2}\d{2}[a-zA-Z]{4}\d{14}|[DE]\d{20}$"
      

      我希望这对其他人有所帮助,因为最初的代码对我有所帮助。如果您想添加自己的国家/地区,请扩展上述内容。

      注意:我删除了空格 ([ ]) 的设置,因为我正在测试的文本没有。如果您希望每 4 个字符添加一次,这很容易 - 或者更简单,将上面代码的第一行替换为:

      IBAN = Trim(Ucase(Replace(IBAN, " ", "")))
      

      这将消除空格,修剪前后任何多余的空格并转换为大写。 (修剪可能是多余的,但皮带和大括号...)

      正则表达式由 [GB|IE](GB 或 IE)组成,允许 ISO 国家/地区代码后跟相同格式的 2 位校验和、4 个字符的银行代码和其后的 14 位数字,如下所示这两种国家 IBAN 格式的情况。 |[DE] 允许为德国使用另一个“或”,后跟 22 位数字。要添加其他国家/地区,只需将文本放在 $ 符号之前,以 | 开头。

      查找其他国家/地区格式here。 (维基百科)

      【讨论】:

        【解决方案4】:

        很简单,只要使用下面的函数。

        '' Validate IBAN
        Public Function VALIDATEIBAN(ByVal IBAN As string) As Boolean
        On Error GoTo Catch
        
        Dim objRegExp As Object
        Dim blnIsValidIBAN As Boolean
        
        Set objRegExp = CreateObject("vbscript.regexp")
        objRegExp.IgnoreCase = True
        objRegExp.Global = True
        objRegExp.Pattern = "^[a-zA-Z]{2}\d{2}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{4}|CZ\d{22}$"
        
        
        
        blnIsValidIBAN = objRegExp.Test(IBAN)
        VALIDATEIBAN = blnIsValidIBAN
        
        Exit Function
        
        Catch:
        VALIDATEIBAN = False
        MsgBox "Module: " & MODULE_NAME & " - VALIDATEIBAN function" & vbCrLf & vbCrLf _
            & "Error#:  " & Err.Number & vbCrLf & vbCrLf & Err.Description
        End Function
        

        使用方法:

        Copy the code.
        In Excel press Alt + F11 to enter the VBE.
        Press Ctrl + R to show the Project Explorer.
        
        Insert -> Module.
        Paste code.
        Save and Exit VBE.
        

        运行函数:

        现在您在 Excel 中有一个用户定义的函数,就像内置的 SUM、AVG 函数一样。 假设您想在单元格 A1 中验证 IBAN,只需在任意单元格中写入 =VALIDATEIBAN(A1). 它将返回 TRUE 或 FALSE。

        此外,它将适用于两者:

        ES65 0800 0000 1920 0014 5399
        

        ES6508000000192000145399
        

        但不是:

        ES65-0800-0000-1920-0014-5399
        

        【讨论】:

        • 抱歉 - 被否决 - 不适用于英国。其次,这是一个穷人的解决方案。此处描述了完整的验证算法:en.wikipedia.org/wiki/…
        • OP 没有要求特定国家,是的,有不同的验证算法。如果您希望它适用于英国而不是简单地将正则表达式更改为:objRegExp.Pattern = "[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}"。我提供了一个通用工具,您可以根据自己的需要进行调整。我希望这会有所帮助。
        • 投票否决:a) 不编译 b) 不验证校验位,因此完全无法进行 IBAN 验证
        • 它适用于我,它适用于 OP。如果它不适合你,为什么不打开一个新问题,也许我可以分配一些宝贵的时间让它为你工作?
        • 投了反对票,因为:它不验证 IBAN,这是 OP 要求的。它不适用于 OP。您也可以发布始终返回“有效”的函数并声称它始终适用于 OP。
        猜你喜欢
        • 2011-12-10
        • 2019-04-06
        • 2014-01-25
        • 2015-11-19
        • 2014-03-22
        • 2017-10-03
        • 2014-02-19
        • 2016-11-08
        • 2011-06-05
        相关资源
        最近更新 更多