VBA传递转置数组时出现类型不匹配错误求助
问题分析与解决
核心问题:类型不匹配原因
你遇到的类型不匹配,是因为Printarr过程的参数声明ByRef l_arr() As Variant要求传入显式的Variant数组类型,但Proc1中的Arr是一个Variant变量(它只是“持有”了一个数组,本身不是数组类型),两者类型不兼容。
另外你的代码还有几个语法错误,会导致额外问题:
- 过程声明应该用
Sub而非Proc - 拼写错误:
applicatiin→Application - 使用了中文引号
“”,需要替换为英文引号""
解决方案
方案1:修改Printarr的参数类型(最简单直接)
把Printarr的参数改为接受Variant类型(可以持有数组的变体变量),这样就能直接接收Proc1中的Arr:
Sub Proc1() Dim Arr As Variant ' 修正拼写错误+英文引号,转成一维数组 Arr = Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Transpose(Range("a1:n1"))) Dim lVC As Variant For Each lVC In Arr MsgBox lVC Next lVC Printarr Arr ' 直接传递即可 End Sub Sub Printarr(ByRef l_arr As Variant) ' 修改参数为Variant Dim VC As Variant For Each VC In l_arr MsgBox VC Next VC End Sub
方案2:显式声明Arr为数组类型
如果想保持Printarr的参数为Variant(),需要把Proc1中的Arr声明为数组,并正确赋值:
Sub Proc1() Dim Arr() As Variant ' 直接将单元格区域转为一维数组(避免两次Transpose的冗余) Arr = Application.Transpose(Application.Transpose(Range("a1:n1"))) Dim lVC As Variant For Each lVC In Arr MsgBox lVC Next lVC Printarr Arr End Sub Sub Printarr(ByRef l_arr() As Variant) ' 保持原参数声明 Dim VC As Variant For Each VC In l_arr MsgBox VC Next VC End Sub
补充说明
- 当你用
Arr = Range("a1:n1").Value时,得到的是二维数组(即使是单行/单列),所以需要用两次Transpose转成一维数组,才能被For Each正常遍历。 - 如果你不需要一维数组,也可以修改
Printarr来处理二维数组,比如:
Sub Printarr(ByRef l_arr As Variant) Dim i As Long For i = LBound(l_arr, 2) To UBound(l_arr, 2) MsgBox l_arr(1, i) Next i End Sub
内容的提问来源于stack exchange,提问作者john campbell
相关产品推荐
相关产品推荐

