VBA将字符串形式单元格引用传入Range时出现类型不匹配错误如何解决
VBA运行时错误13(类型不匹配)问题排查与修复方案
错误原因汇总
- 数组与字符串拼接错误:你使用
Array("C15:C28")给rangesx1等变量赋值后,变量本身是数组类型,直接和字符串拼接会触发类型不匹配。 - 多余添加双引号:
Range()方法本身接受纯文本格式的单元格地址参数,不需要额外拼接Chr(34)加双引号,拼接后反而会生成Range("""C15:C28""")这类不符合要求的参数格式。 - 变量声明不规范:VBA中单行同时声明多个变量时,只有最后一个变量会采用标注的类型,你写的
Dim rngx1, rngx2, rngy1, rngy2 As Range中,只有rngy2是Range类型,其余三个为Variant类型,存在类型隐患。 - For循环语法错误:VBA不支持
For Each item in 数组1, 数组2, 数组3这类同时遍历多个数组的写法,且你循环中完全没有用到遍历的item变量,循环属于冗余代码。 - 区域赋值逻辑错误:直接使用
&拼接Range对象无法提取区域内的值,输出到目标区域需要明确指定Value属性,且要对应好单元格维度。
修复后代码
Sub CellReferenceToRange() ' 修正变量声明,每个变量单独指定类型 Dim rngx1 As Range, rngx2 As Range, rngy1 As Range, rngy2 As Range Dim rangesx1 As String, rangesx2 As String, rangesy1 As String, rangesy2 As String ' 直接赋值地址字符串,不需要套Array rangesx1 = "C15:C28" rangesy1 = "C15:C28" rangesx2 = "C15:C28" rangesy2 = "C15:C28" ' 不需要多余的Chr(34),直接传地址字符串给Range Set rngx1 = Range(rangesx1) Set rngy1 = Range(rangesy1) Set rngx2 = Range(rangesx2) Set rngy2 = Range(rangesy2) ' 按列输出四个区域的值到目标区域,可根据实际需求调整赋值逻辑 Range("AD21:AD34").Value = rngx1.Value Range("AE21:AE34").Value = rngx2.Value Range("AF21:AF34").Value = rngy1.Value Range("AG21:AG34").Value = rngy2.Value End Sub
扩展说明(后续适配字典多组元素参考)
如果后续要从字典中读取多组地址,可以先把所有地址存到同一个二维数组里,再用普通For循环按索引遍历,依次取出对应位置的地址生成Range对象即可。不要随意用Array()包裹单字符串,只有当你需要存储多个同类型值的时候才需要用到数组。
内容的提问来源于stack exchange,提问作者A. Kaymakci
相关产品推荐
相关产品推荐

