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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:21:30