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

VBA宏开发遇Error 13类型不匹配问题求助

嘿,作为VBA新手碰到Error 13(类型不匹配)确实挺闹心的,我结合你的代码片段和常见踩坑点,帮你梳理下解决办法!

解决VBA Error 13的核心思路

Error 13本质就是变量类型和你要赋值/操作的内容类型不兼容,结合你的需求(获取前三街道地址让用户选择),我整理了几个最可能的问题点和修复方案:

1. 对象变量忘记初始化

你代码里声明了xhrRequest和domDoc,但如果没给它们分配实际的对象实例,后续调用方法时就会触发类型不匹配。必须加上这两行初始化代码:

Set xhrRequest = New XMLHTTP60
Set domDoc = New DOMDocument60

2. InputBox返回值的类型坑

你提到最后一个InputBox或者Case 1报错,大概率是这里的问题:

  • 普通InputBox返回的是字符串,如果直接拿它去匹配Case 1(数字),就会类型不匹配;
  • 如果用Application.InputBox,用户点取消会返回布尔值False,要是赋值给字符串变量也会炸。

修复示例(处理用户选择的逻辑):

Dim userChoice As Variant
userChoice = InputBox("请选择地址序号:1=第一,2=第二,3=第三", "选择地址")

' 先判断输入是否为有效数字,再转成整数匹配Case
If IsNumeric(userChoice) Then
    Select Case CInt(userChoice)
        Case 1
            ' 比如把第一个地址写入选中的单元格
            myValue.Value = result(0)
        Case 2
            myValue.Value = result(1)
        Case 3
            myValue.Value = result(2)
        Case Else
            MsgBox "请输入1-3之间的数字哦!"
    End Select
ElseIf userChoice = "" Then ' 用户点了取消或空白输入
    MsgBox "已取消选择"
Else
    MsgBox "输入无效,请输入数字!"
End If

3. 数组赋值时的类型兼容问题

你的result(2)是字符串数组,如果从DOM节点提取的内容是Null或者非字符串类型(比如节点不存在时返回的Nothing),直接赋值就会报错。赋值前要先判断节点内容:

nNode = 0
For Each myNode In myNodes
    If nNode > 2 Then Exit For ' 只取前3个地址
    ' 先确保节点有效,转成字符串再赋值
    If Not myNode Is Nothing Then
        result(nNode) = CStr(myNode.Text)
    Else
        result(nNode) = "无地址信息"
    End If
    nNode = nNode + 1
Next myNode

4. 范围选择的变量声明遗漏

你代码里的Set myValue = Applica...应该是用来选单元格的Application.InputBox,这里要注意:

  • myValue必须声明为Range类型;
  • 要处理用户取消选择的情况,否则会报错。

修复代码:

Dim myValue As Range
On Error Resume Next ' 临时忽略错误,处理取消选择
Set myValue = Application.InputBox("请选择要写入地址的单元格", Type:=8)
On Error GoTo 0 ' 恢复错误捕获

If myValue Is Nothing Then
    MsgBox "未选择单元格,程序退出"
    Exit Sub
End If

完整修复后的参考代码

Sub myTest2()
    Dim xhrRequest As XMLHTTP60
    Dim domDoc As DOMDocument60
    Dim query As String
    Dim myNodes As IXMLDOMNodeList
    Dim myNode As IXMLDOMNode
    Dim nNode As Integer
    Dim myValue As Range
    Dim result(2) As String
    Dim userChoice As Variant
    
    ' 初始化网络和DOM对象
    Set xhrRequest = New XMLHTTP60
    Set domDoc = New DOMDocument60
    
    ' 让用户选择目标单元格
    On Error Resume Next
    Set myValue = Application.InputBox("请选择要写入地址的单元格", Type:=8)
    On Error GoTo 0
    If myValue Is Nothing Then
        MsgBox "已取消操作"
        Exit Sub
    End If
    
    ' 获取搜索关键词
    query = InputBox("请输入搜索关键词", "关键词搜索")
    If query = "" Then
        MsgBox "关键词不能为空哦!"
        Exit Sub
    End If
    
    ' 这里补全你的XHR请求逻辑(示例)
    xhrRequest.Open "GET", "你的搜索接口URL?query=" & query, False
    xhrRequest.send
    domDoc.LoadXML xhrRequest.responseText
    
    ' 替换成你实际的地址节点XPath
    Set myNodes = domDoc.SelectNodes("//address")
    
    ' 提取前3个地址到数组
    nNode = 0
    For Each myNode In myNodes
        If nNode > 2 Then Exit For
        result(nNode) = CStr(IIf(myNode.Text = "", "无匹配地址", myNode.Text))
        nNode = nNode + 1
    Next myNode
    
    ' 补全不足3个的情况
    Do While nNode <= 2
        result(nNode) = "无匹配地址"
        nNode = nNode + 1
    Loop
    
    ' 显示选项让用户选择
    userChoice = InputBox("请选择要写入的地址:" & vbCrLf & _
                         "1. " & result(0) & vbCrLf & _
                         "2. " & result(1) & vbCrLf & _
                         "3. " & result(2), "选择地址")
    
    ' 处理用户选择
    If IsNumeric(userChoice) Then
        Select Case CInt(userChoice)
            Case 1
                myValue.Value = result(0)
            Case 2
                myValue.Value = result(1)
            Case 3
                myValue.Value = result(2)
            Case Else
                MsgBox "请输入1-3之间的数字!"
        End Select
    ElseIf userChoice = "" Then
        MsgBox "已取消选择"
    Else
        MsgBox "输入无效,请输入数字!"
    End If
    
    ' 释放对象,避免内存泄漏
    Set xhrRequest = Nothing
    Set domDoc = Nothing
    Set myNodes = Nothing
    Set myNode = Nothing
    Set myValue = Nothing
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:18:33