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
相关产品推荐
相关产品推荐

