如何将ParamArray中的Variant转换为Range对象(VBA宏问题)
解决VBA中ParamArray传入区域的Variant转Range问题
你之前的错误出在vI.Range这个写法上——vI本身就是传入的单个Range对象的变体包装,不需要额外调用Range属性。直接用Set语句就能完成Variant到Range对象的转换,同时建议加上类型检查避免非法参数报错。
修改后的代码
Sub restoreDefaults_cellByCell(ParamArray targetRanges()) Dim rI As Range, cellI As Range, vI As Variant Dim sName As String For Each vI In targetRanges ' 先校验类型,防止传入非Range参数导致报错 If TypeOf vI Is Range Then Set rI = vI ' 直接将Variant转换为Range对象 For Each cellI In rI.Cells sName = NamedRange_getCellNamedRange(cellI, False) If Not dNamesFromSelection.Exists(sName) Then dNamesFromSelection.Add sName, "" End If Next cellI End If Next vI End Sub
关键说明
ParamArray targetRanges()会把每个传入的Range参数包装成Variant元素存入数组,循环时vI直接对应单个Range对象,用Set rI = vI即可完成类型转换。- 加入
TypeOf vI Is Range的判断,能避免用户误传非Range类型参数时触发运行时错误,提升代码健壮性。 - 转换后的
rI会保留原区域的工作表关联,即使传入的区域分布在不同工作表,遍历Cells时也能正确指向对应工作表的单元格。
内容的提问来源于stack exchange,提问作者Dumitru Daniel
相关产品推荐
相关产品推荐

