You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VIES VAT校验VBA代码修复请求:URL变更后代码失效

VIES VAT验证代码修复方案

核心问题

你把SOAP服务接口的URL换成了VIES的前端网页地址,这是代码失效的主要原因——前端网页不接收SOAP格式的请求,必须使用官方提供的SOAP接口地址。

需要修正的内容

  • 恢复正确的SOAP接口URL:
    把sURL的值改回HTTPS版本的SOAP接口(仅需将原HTTP协议改为HTTPS,路径保持不变):

    sURL = "https://ec.europa.eu/taxation_customs/vies/services/checkVatService"
    
  • 完善请求头设置:
    原代码的Content-Type缺少字符集声明,容易导致XML解析失败,修正为:

    .setRequestHeader "Content-Type", "text/xml; charset=utf-8"
    
  • 优化错误处理:
    移除全局的On Error Resume Next,在关键步骤添加错误判断,避免因接口返回异常导致代码崩溃。比如在解析XML前检查请求状态和节点是否存在。

修正后的完整代码

Sub VATCHECK()
    Dim sURL As String
    Dim sEnv As String
    Dim xmlhttp As New MSXML2.xmlhttp
    Dim xmlDoc As New MSXML2.DOMDocument
    Dim sCountryCode As String
    Dim sVATNo As String
    Dim i As Long
    
    Range("D2", Range("D2").End(xlDown)).Clear
    If Cells(Rows.Count, 1).End(xlUp).Row < 2 Then Exit Sub

    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        ' 使用正确的SOAP接口URL
        sURL = "https://ec.europa.eu/taxation_customs/vies/services/checkVatService"
        sCountryCode = Range("B" & i).Value
        sVATNo = Range("C" & i).Value
    
        sEnv = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:urn=""urn:ec.europa.eu:taxud:vies:services:checkVat:types"">"
        sEnv = sEnv & "<soapenv:Header/>"
        sEnv = sEnv & "<soapenv:Body>"
        sEnv = sEnv & "<urn:checkVat>"
        sEnv = sEnv & "<urn:countryCode>" & sCountryCode & "</urn:countryCode>"
        sEnv = sEnv & "<urn:vatNumber>" & sVATNo & "</urn:vatNumber>"
        sEnv = sEnv & "</urn:checkVat>"
        sEnv = sEnv & "</soapenv:Body>"
        sEnv = sEnv & "</soapenv:Envelope>"

        With xmlhttp
            .Open "POST", sURL, False
            ' 完善Content-Type头
            .setRequestHeader "Content-Type", "text/xml; charset=utf-8"
            .send sEnv
            
            ' 检查请求状态
            If .Status <> 200 Then
                Range("D" & i).Value = "请求失败(状态码:" & .Status & ")"
                GoTo NextRow
            End If
        
            Set xmlDoc = New MSXML2.DOMDocument
            xmlDoc.LoadXML .responseText
            
            ' 检查valid节点是否存在
            If xmlDoc.getElementsByTagName("valid").Length = 0 Then
                Range("D" & i).Value = "接口返回异常"
                GoTo NextRow
            End If
            
            If Range("A" & i).Value = 0 Then
                Range("D" & i).Value = ""
            Else
                If LCase(xmlDoc.getElementsByTagName("valid").Item(0).Text) = "true" Then
                    Range("D" & i).Value = "Valid VAT number"
                Else
                    Range("D" & i).Value = "Invalid VAT number"
                End If
            End If
        End With
NextRow:
    Next i
  
End Sub

内容的提问来源于stack exchange,提问作者Krzysztof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:25:33