Как проверить, предоставлены ли некоторые из дополнительных параметров процедуры excel-VBA?

Я пытаюсь написать макрос VBA для автофильтрации таблицы, используя ввод пользователя. Мне нужно, чтобы пользователь указал столбцы для фильтрации, а также критерии для этого поля. Поэтому я решил определить Sub с несколькими необязательными аргументами (параметрами), чтобы учесть предпочтения пользователей. Моя проблема в том, как проверить, указан ли необязательный аргумент?

Я понимаю, что могу написать тест для каждого параметра, а затем написать условное выражение для каждого возможного варианта. Но это не кажется разумным способом, и мне интересно, может ли кто-нибудь предложить решение. Я должен сказать, что вначале мы не знаем, какое количество аргументов мы ожидаем получить от пользователя.

Спасибо за ответы.


person M.T    schedule 17.06.2013    source источник
comment
Возможный дубликат VB - Как мне проверить, указаны ли необязательные аргументы или нет?   -  person J. Chomel    schedule 08.04.2016


Ответы (2)


Если тип переменной variant, решением будет использовать IsMissing:

 If IsMissing(arg) Then
     MsgBox "missing parameter"
 End If

Затем, если вы ожидаете string или number, просто проверьте значение:

 Function func (Optional s as String, Optional n as Integer)

 If s = "" Then
     MsgBox "s is missing"
 End If

 If n = 0 Then
     MsgBox "n is missing"
 End
person Jika    schedule 30.10.2016
comment
Это единственный ответ, который работает с дополнительным вариантом, который требуется, когда вам нужно, чтобы макрос был виден в меню F8. Это также более правильный ответ, поскольку он не требует установки значения по умолчанию. - person HackSlash; 11.10.2017

Можно было бы указать абсурдный дефолт. Тогда сравните со значением по умолчанию.

Sub xyz( Optional p1 As String = "default_impossible_value")
    If p1 = "default_impossible_value" Then
       MsgBox "there_is_no_value_for_param_1"
    End If
End Sub

Затем расширите его до любого количества параметров, которые вы хотите использовать в качестве записи:

Sub xyz( Optional p1 As String = "default_impossible_value"_
        ,Optional p2 As String = "default_impossible_value"_
        ,Optional p3 As String = "default_impossible_value"_
...
)
    If p1 = "default_impossible_value" Then
       MsgBox "there_is_no_value_for_param_1"
    End If
    If p2 = "default_impossible_value" Then
       MsgBox "there_is_no_value_for_param_2"
    End If
    If p3 = "default_impossible_value" Then
       MsgBox "there_is_no_value_for_param_3"
    End If
....
End Sub
person J. Chomel    schedule 08.04.2016
comment
Большое спасибо за комментарий, очень полезный фрагмент кода. Мой вопрос в том, как я могу узнать об ожидаемом количестве переменных, которые могут / не могут быть предоставлены. Я стараюсь избегать большого количества переменных (комбинация столбцов и типов фильтров), таких как P1, P2, P3, ... Я понимаю, что могу решить эту проблему, используя формы VBA в качестве графического интерфейса пользователя и позволяя пользователю создавать переменные который будет использоваться для фильтрации, но есть ли способ сделать это в коде без форм? - person M.T; 10.04.2016
comment
Я просто попытался ответить на первый вопрос. Я не совсем уверен, что понимаю, о чем вы сейчас спрашиваете. Что вы имеете в виду ожидаемое количество переменных? Это Sub вы написали, или это что-то связано с книгой, листом или чем-то еще? - person J. Chomel; 10.04.2016