VBA中如何正确将ParamArray参数赋值给类的数组属性?
解决VBA ParamArray赋值给Variant数组属性的类型不匹配问题
问题原因
ParamArray参数在VBA中的本质是Variant类型变量,它内部封装了一个Variant数组,但你的ReportError类中Values属性的Let方法要求接收的是Variant()(即元素为Variant的数组类型),直接将Fields(ParamArray参数)赋值给err.Values时,会因类型不匹配触发错误。
解决方案
有两种可行的修改方式:
方法一:修改ReportError类的Values属性定义
将属性的Let方法参数类型改为Variant,兼容ParamArray的类型,同时内部处理数组逻辑:
Option Explicit Public ID As String Public bookType As String Public msg As String Public sheetName As String Public c As Long Public r As Long Private pValues() As Variant Public Property Get Values() As Variant() Values = pValues End Property Public Property Let Values(arr As Variant) ' 先判断传入的是否为数组 If IsArray(arr) Then pValues = arr Else ' 非数组则转为单元素数组 ReDim pValues(0 To 0) pValues(0) = arr End If End Property
修改后,直接执行err.Values = Fields即可正常运行。
方法二:在赋值前显式转换ParamArray为Variant数组
保持ReportError类不变,在CreateErrorForReport过程中,先将Fields转换为Variant()类型的数组再赋值:
Public Sub CreateErrorForReport(ByVal errID As String, ByVal errSheetName As String, ByVal errRow As Long, ByVal errCol As Long, ParamArray Fields() As Variant) Dim shtSource As Worksheet Dim i As Long, row As Long Dim err As New ReportError Set shtSource = Worksheets(ERR_WS_NAME) If UBound(Fields) >= LBound(Fields) Then Dim tempArr() As Variant tempArr = Fields ' 将Variant类型的ParamArray转换为Variant数组 err.Values = tempArr End If error_index = error_index + 1 errorDict.Add error_index, err End Sub
内容的提问来源于stack exchange,提问作者Alexey C
相关产品推荐
相关产品推荐

