Выполнение подпрограммы в другой подпрограмме - Ошибка компиляции: аргумент не является необязательным - PullRequest
2 голосов
/ 09 мая 2020
Sub StoreQA(ShapeClicked As Shape)
MsgBox "yeee"
End Sub

Sub ThisIsToBeRun()
StoreQA
End Sub

Я получаю ошибку компиляции: аргумент не является необязательным. Я пробовал упомянуть StoreQA(ShapeClicked As Shape), но это тоже не помогло.

1 Ответ

4 голосов
/ 09 мая 2020

Аргумент не является необязательным

Здесь вы определяете параметр с именем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...