VBA报错Type mismatch: array or user-defined type expected原因及解决
报错原因及修复方案
这个“Type mismatch”报错是几个VBA细节问题叠加导致的,我帮你逐个拆解并修复:
1. 子过程调用的括号误用(直接触发报错的原因)
VBA里调用Sub过程时,如果你用displayArray (someArray)这种带括号的写法,括号会强制把数组参数转换成单个Variant值(而不是保持数组类型),但你的displayArray明确要求接收Double()类型数组,这就直接触发了类型不匹配错误。
修复方式:二选一即可
' 方式1:去掉括号直接调用(VBA推荐写法) displayArray someArray ' 方式2:用Call关键字包裹括号 Call displayArray(someArray)
2. 函数返回类型未显式声明
你的getBinsArray函数没有声明返回类型,默认会被视为Variant类型。虽然它实际返回的是Double数组,但隐式类型可能会在传递时引发不必要的类型转换风险,显式声明更严谨。
修复方式:修改函数定义,指定返回类型为Double数组:
Function getBinsArray(dataArray() As Double) As Double()
3. 函数内的拼写错误
getBinsArray里有个笔误:ReDim resultArray(1 To bindsNumber)中的bindsNumber应该是binsNumber,这个拼写错误会导致数组维度定义失败,后续赋值逻辑也会出错。
4. 输出范围的列数计算错误
displayArray里的列数计算逻辑有误:UBound(someArray) - LBound(someArray)得到的是数组的索引差值,不是元素总数。比如数组是1 To 5,索引差是4,但实际有5个元素,所以需要加1才能正确覆盖所有元素。
修复方式:修改范围计算代码:
.Range(.Cells(1, 1), .Cells(1, UBound(someArray) - LBound(someArray) + 1)).Value = someArray
修复后的完整代码
' 主过程 Sub Main() Dim someArray() As Double someArray = getBinsArray(sumLossesColl) displayArray someArray ' 修复调用方式 End Sub ' 子过程:输出数组到Sheet1 Sub displayArray(someArray() As Double) Dim i As Long With ThisWorkbook.Worksheets("Sheet1") ' 修复列数计算逻辑 .Range(.Cells(1, 1), .Cells(1, UBound(someArray) - LBound(someArray) + 1)).Value = someArray End With End Sub ' 函数:生成bins数组 Function getBinsArray(dataArray() As Double) As Double() ' 显式声明返回类型 Dim binsNumber As Long Dim binSize As Double binsNumber = Round(VBA.Sqr(UBound(dataArray) - LBound(dataArray)) + 0.5) MsgBox ("binsNumber: " & binsNumber) binSize = (getMaxValue(dataArray) - getMinValue(dataArray)) / (binsNumber - 1) Dim resultArray() As Double ReDim resultArray(1 To binsNumber) As Double ' 修复拼写错误 resultArray(1) = getMinValue(dataArray) Dim i As Long For i = 2 To binsNumber resultArray(i) = resultArray(i - 1) + binSize Next getBinsArray = resultArray End Function
内容的提问来源于stack exchange,提问作者Ans




