Sub StoreQA(ShapeClicked As Shape)
MsgBox "yeee"
End Sub
Sub ThisIsToBeRun()
StoreQA
End Sub
我收到编译错误:参数不可选。
我尝试提及 StoreQA(ShapeClicked As Shape)
但这也没有帮助。
最佳答案
Argument not optional
您将在此处定义一个名为 ShapeClicked
的参数:
Sub StoreQA(ShapeClicked As Shape)
由于该参数不是可选
,因此任何代码都必须为此参数提供参数,以调用此 StoreQA
过程:
' gets the first Shape in Sheet1 (assumes it exists), then passes it to StoreQA:
StoreQA Sheet1.Shapes(1)
如果不需要该参数,请将其删除:
Sub StoreQA()
如果某些地方需要但其他地方不需要,请考虑将其设为可选
:
Sub StoreQA(Optional ByVal ShapeClicked As Shape)
然后您可以合法地调用该过程,而无需提供任何参数:
StoreQA '<~ compiles fine now
可选注意事项
如果StoreQA
过程收到Optional
参数,则需要在使用它之前验证是否收到有效的对象引用 - 否则会出现问题:
Sub StoreQA(Optional ByVal ShapeClicked As Shape)
If ShapeClicked Is Nothing Then
' argument was not provided *or 'Nothing' was supplied*
''Debug.Print ShapeClicked.Name '<~ error 91
Else
' ShapeClicked is holding a valid Shape object reference
Debug.Print ShapeClicked.Name
End If
End Sub
如果Optional
参数被声明为As Variant
(无论是显式还是非显式),那么您可以使用IsMissing
函数来验证可选参数是否存在提供 - 当 Nothing
也是一个有效的、有用的接收值时有用(无论如何对于对象引用 - 对于普通值类型,它可以消除使用魔术/硬编码“无效”值的需要):
Sub StoreQA(Optional ByVal ShapeClicked As Variant)
If IsMissing(ShapeClicked) Then '<~ only valid with an Optional+Variant parameter
' argument was not provided
''Debug.Print ShapeClicked.Name '<~ error 91
ElseIf Not ShapedClicked Is Nothing Then
' ShapeClicked is holding a valid Shape object reference
Debug.Print ShapeClicked.Name
Else
' 'Nothing' was explicitly supplied
'...
End If
End Sub
关于vba - 在另一个子例程中运行子例程 - 编译错误 : Argument not optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61691964/