Excel VBA数组传参及元素存在性检查编译错误修复求助
Excel VBA数组传递错误修复与数组传递方法
你遇到的编译错误:
Type mismatch: array or user-defined type expected

一、错误原因与代码修复
1. 直接错误原因
你的test1过程中调用Find函数时,错误地将数组的单个元素j传给了要求接收数组类型的第一个参数,导致类型不匹配。此外代码还有其他逻辑问题,一起修复如下:
修复后的Find函数(匹配原设计:检查数组中是否存在指定key)
函数声明返回Boolean类型,需赋值布尔值,且找到匹配后立即退出循环:
Public Function Find(ByRef x() As Integer, ByVal key As Integer) As Boolean Dim low1 As Integer Dim high1 As Integer Dim i As Integer low1 = LBound(x) high1 = UBound(x) Find = False ' 默认返回未找到 For i = low1 To high1 If x(i) = key Then Find = True Exit For ' 找到后终止循环,提升效率 End If Next i End Function
修复后的test1过程(正确传递数组)
调用Find时传入整个数组,而非单个元素;同时修正数组下标范围,避免空元素:
Sub test1() Dim x() As Integer Dim a As Integer Dim i As Integer a = Range("A1", [A1].End(xlDown)).Count ReDim x(1 To a) As Integer ' 指定下标从1开始,和单元格行号对应 For i = 1 To a x(i) = Range("A" & CStr(i)).Value Next ' 检查数组中是否存在18,结果写入B1单元格 Worksheets(1).Cells(1, "B").Value = IIf(Find(x, 18), "存在指定值", "不存在指定值") End Sub
如果你原本的需求是遍历数组每个元素,判断是否等于18,则修改Find函数为接收单个数值,调用逻辑不变:
' 针对单个元素判断的函数 Public Function Find(ByVal num As Integer, ByVal key As Integer) As Boolean Find = (num = key) End Function ' 对应的test1过程 Sub test1() Dim x() As Integer Dim a As Integer Dim i As Integer Dim count As Integer Dim j As Variant a = Range("A1", [A1].End(xlDown)).Count ReDim x(1 To a) As Integer For i = 1 To a x(i) = Range("A" & CStr(i)).Value Next count = 1 For Each j In x Worksheets(1).Cells(count, "B").Value = IIf(Find(j, 18), "是", "否") count = count + 1 Next End Sub
二、Excel VBA传递数组的常用方法
1. 传递指定类型的数组
声明参数为固定类型的数组,调用时直接传入数组变量(无需加括号):
' 函数声明:接收Integer类型数组 Sub ProcessIntArray(ByRef arr() As Integer) ' 数组处理逻辑 End Sub ' 调用示例 Dim myIntArr() As Integer ReDim myIntArr(1 To 5) ProcessIntArray myIntArr
2. 传递Variant类型数组
兼容任意类型数组,适合不确定数组类型的场景,需先判断是否为数组:
Function CheckAnyArray(arr As Variant) As Boolean If Not IsArray(arr) Then CheckAnyArray = False Exit Function End If ' 后续数组处理逻辑 End Function ' 调用示例:可直接传入单元格区域转的二维数组 Dim rngArray As Variant rngArray = Range("A1:A5").Value ' 区域会转为二维数组 CheckAnyArray rngArray
3. 按值/按引用传递
- ByRef(默认):传递数组的引用,函数内部修改数组会影响原数组
- ByVal:传递数组的副本,函数内部修改不会影响原数组,声明时需在参数后加括号:
Function ProcessArrayByVal(ByVal arr() As String) As String ' 处理逻辑 End Function
内容的提问来源于stack exchange,提问作者朱彦锟
相关产品推荐
相关产品推荐

