VBA启用Option Explicit时声明数组读区域值报类型不匹配问题
报错原因
你碰到的Run-Time error '13'本质是对VBA读取单元格区域的返回类型不熟悉:
- 读取多单元格区域的
Value属性时,返回值永远是Variant类型的二维数组,不是你声明的Long类型数组,也不能直接赋值给固定大小的数组。 - 关闭
Option Explicit时,未显式声明的Bar默认是Variant类型,天然可以兼容这个返回值,所以能正常运行,这和二维数组的声明写法本身没有关系。
你之前两种写法的问题分别是:
Dim Bar() As Long:声明的是Long类型的动态数组,VBA不支持将Variant数组直接整体赋值给其他数据类型的数组,直接触发类型不匹配。Dim Bar(1 to 3, 1 to 10):声明的是固定大小数组,VBA语法里固定大小的数组不支持整体直接赋值,只有动态数组、Variant类型变量可以接收整块区域的读取结果。
正确实现方式
日常开发中最简便、性能最优的写法是直接将接收变量声明为Variant即可,不需要提前声明为数组类型:
Option Base 1 Option Explicit Sub My_PROGRAM() Dim Bar As Variant ' 读取后Bar就是下标从1开始的二维数组,和Option Base设置无关 Bar = Worksheets("Sheet1").Range("C4:L6").Value ' 可以用以下代码验证数组尺寸:对应区域共3行10列 Debug.Print "行数:" & UBound(Bar, 1), "列数:" & UBound(Bar, 2) End Sub
注意:只要是从单元格区域读取的数组,行、列下标永远从1开始,和模块里的Option Base设置没有关系,不需要额外处理下标偏移。
如果你因为业务需求必须使用Long类型的数组,不能直接赋值,需要遍历Variant数组逐个转换元素:
Option Base 1 Option Explicit Sub My_PROGRAM() Dim rawData As Variant Dim Bar() As Long Dim i As Long, j As Long rawData = Worksheets("Sheet1").Range("C4:L6").Value ' 根据读取到的实际尺寸重定义Long数组 ReDim Bar(1 To UBound(rawData, 1), 1 To UBound(rawData, 2)) ' 逐元素转换赋值 For i = 1 To UBound(rawData, 1) For j = 1 To UBound(rawData, 2) ' 如果单元格存在非数值内容,这里需要额外加错误判断 Bar(i, j) = CLng(rawData(i, j)) Next j Next i End Sub
建议始终保持
Option Explicit开启,这个选项可以帮你规避绝大多数变量拼写错误、隐式类型转换带来的隐蔽bug,不要因为这次报错就关闭它。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

