Аргумент не является необязательным
Здесь вы определяете параметр с именем ShapeClicked
:
Sub StoreQA(ShapeClicked As Shape)
Поскольку параметр не Optional
, аргумент должен быть предоставлен для этого параметра любым кодом, который означает вызов этой StoreQA
процедуры:
' gets the first Shape in Sheet1 (assumes it exists), then passes it to StoreQA:
StoreQA Sheet1.Shapes(1)
Если параметр не нужен, удалите его:
Sub StoreQA()
Если это необходимо в некоторых местах, но не в других, подумайте о том, чтобы сделать это Optional
:
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