VBA中Dim arr与Dim arr()声明数组的差异及报错原因
VBA两个子过程运行结果差异原因
核心差异来自两个过程中arr变量的声明类型完全不同,和VBA本身的变量声明、赋值规则直接相关:
Test_1中Dim arr, s As String的声明效果:
VBA不会给同一条Dim语句里没写As 类型的变量继承后面的类型,所有未显式指定类型的变量默认是Variant变体型。所以这里的arr是单个Variant类型变量,并非数组。Variant类型可以承载任意类型的值,包括数组、数值、对象、字符串等。而Split()函数的返回值本身就是一个包装了字符串数组的Variant值,直接赋值给Variant类型的arr完全符合语法,因此可以正常运行。Test_2中Dim arr(), s As String的声明效果:
带括号的arr()是显式声明的动态数组变量,这个变量本身的类型是数组容器(未指定元素类型时默认元素为Variant,但变量本身是数组类型,不是可以承载任意值的单个Variant变量)。一方面VBA不支持直接用等号给显式声明的静态/动态数组变量直接赋值函数返回的整组值,另一方面Split()返回的Variant包装数组和显式数组变量的类型不匹配,因此执行赋值时会触发错误13类型不匹配。
常见踩坑点:不要用其他语言的声明逻辑套VBA,
Dim a, b As String这种写法里,只有b是String类型,a始终是Variant类型,要声明多个同类型变量必须每个都加As,比如Dim a As String, b As String。
问题复现代码如下:
Sub Test_1() Dim arr, s As String s = "Hi Hello" arr = Split(s) '正常运行,arr为Variant类型,持有Split返回的字符串数组 End Sub Sub Test_2() Dim arr(), s As String s = "Hi Hello" arr = Split(s) '触发错误13:类型不匹配 End Sub
如果要让Test_2正常运行,最直接的改法是去掉arr后的括号,把arr声明为Variant类型即可;如果一定要保留数组声明,需要先定义数组大小后逐元素搬运Split返回的内容,写法冗余没有必要。
内容的提问来源于stack exchange,提问作者straj
相关产品推荐
相关产品推荐

