VBA数组运行时错误13:单行列赋值类型不匹配问题问询
VBA数组与Range赋值的单/多行差异:问题原因与解决方案
我来帮你把这个问题的底层逻辑理清楚——这其实是VBA处理Range返回值的一个容易踩的小坑!
核心原因
当你的源数据Range有2行及以上时,VBA会自动把Range的内容打包成一个二维Variant数组(哪怕只有1列,结构也是(1 to 行数, 1 to 1)),这时候和你预先用ReDim MyArray(nr,1)定义的二维数组结构完全匹配,所以直接MyArray() = Range(...)赋值完全没问题。
但当Range只有1行1列时,VBA不会返回二维数组,而是直接返回一个单个Variant值(注意,不是数组!)。这时候你试图把单个值整体赋值给已经定义好的二维数组,就会触发「运行时错误13(类型不匹配)」——因为单个值和二维数组的类型结构不兼容,VBA没法把单个值“映射”到二维数组的整体结构里。
为什么你预先ReDim(1,1)还是不行?
你可能会疑惑:我已经把数组定义成了(1,1)的二维结构,为什么不能直接接收Range的单个值?
原因很简单:MyArray() = Range(...)这种整体赋值操作要求右边必须是同维度的数组,而不是单个值。只有当你针对数组的单个元素赋值时(比如MyArray(1,1) = Range(...)),单个值才会被VBA接受并放进数组元素里。
优化后的解决方案
你的判断行数单独赋值的思路是完全正确的,这里可以给你两种更简洁的写法:
写法1:让VBA自动判断类型,再补全单行的数组结构
Option Explicit Option Base 1 Sub test() Dim MyArray As Variant ' 不预先声明为动态数组,让VBA自动适配 Dim nr As Integer nr = Range("Tbl_Test[Data]").Rows.Count ' 先获取Range内容,VBA会自动返回单个值或二维数组 MyArray = Range("Tbl_Test[Data]").Value ' 单行情况:把单个值包装成二维数组 If nr = 1 Then Dim tempArr(1, 1) As Variant tempArr(1, 1) = MyArray MyArray = tempArr End If ' 直接赋值到目标表格 Range("Tbl_Test2[Data]") = MyArray End Sub
写法2:提前判断行数,针对性定义数组并赋值
Option Explicit Option Base 1 Sub test() Dim MyArray() As Variant Dim nr As Integer nr = Range("Tbl_Test[Data]").Rows.Count If nr = 1 Then ReDim MyArray(1, 1) MyArray(1, 1) = Range("Tbl_Test[Data]").Value ' 单个元素赋值 Else ReDim MyArray(nr, 1) MyArray = Range("Tbl_Test[Data]").Value ' 整体数组赋值 End If Range("Tbl_Test2[Data]") = MyArray End Sub
这两种写法都能完美适配单行和多行的情况,避免类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Tim Thompson
相关产品推荐
相关产品推荐

