向VBA子过程传递当前选区对象时出现424 object required错误如何解决
VBA选中Range传参报424错误解决方案
错误原因
你代码的问题出在makeUpper (mySelection)这行的括号使用不符合VBA语法规则:
- VBA中调用无返回值的Sub过程时,若不使用
Call关键字,不能给参数套外层括号 - 你额外加的括号会触发VBA的隐式求值逻辑:自动读取Range对象的默认属性
Value,把选中区域的内容数组作为参数传入,而非传入Range对象本身,自然会触发「需要对象」的424错误。
正确写法
二选一即可:
- 直接去掉外层括号
makeUpper mySelection
- 搭配
Call关键字使用括号(可选习惯)
Call makeUpper(mySelection)
优化建议
为了避免误选形状、图表等非Range对象时报错,可以加一层类型判断,同时可以兼容多列区域的转换需求:
Sub test() Dim mySelection As Range ' 先判断选中的是不是单元格区域 If TypeName(Selection) = "Range" Then Set mySelection = Selection makeUpper mySelection Else MsgBox "请先选中需要转换的单元格区域" End If End Sub Sub makeUpper(rng As Range) Dim v As Long, vUPRs As Variant With rng vUPRs = .Value2 ' 兼容多列选中的情况,原代码仅支持转换第一列 For v = LBound(vUPRs, 1) To UBound(vUPRs, 1) Dim col As Long For col = LBound(vUPRs, 2) To UBound(vUPRs, 2) vUPRs(v, col) = UCase(vUPRs(v, col)) Next col Next v .Cells = vUPRs End With End Sub
内容的提问来源于stack exchange,提问作者felima
相关产品推荐
相关产品推荐

