Как я могу использовать необязательный аргумент массива в процедуре VBA?

У меня есть частная процедура в сценарии VBA для MS Access:

Private Sub drawLineDiagram(chartSpace As Variant, title As String, caption As String, x_val() As Variant, y_val() As Variant, Optional y_val2() As Variant = ????)

Как видите, я хочу иметь необязательный последний параметр для массива значений.

Какой параметр по умолчанию я должен назначить? Если я сделаю это с необязательным целочисленным значением и назначу его, например, 0 все нормально.

Если я сделаю это с массивом, как показано выше, и назначу массив, строка будет помечена красным => как ошибка (и она не будет компилироваться).


person Sebastian    schedule 15.02.2010    source источник


Ответы (4)


Если вам нужен необязательный массив в VBA, объявите его как Variant без спецификатора массива, но все равно обращайтесь к нему как к массиву. Таким образом, вы получаете Variant (одиночную переменную), которая содержит массив Variants, а не просто массив Variants. Значение по умолчанию не требуется:

Private Sub drawLineDiagram(chartSpace As Variant, title As String, caption As String, x_val As Variant, y_val As Variant, Optional y_val2 As Variant)

Для согласованности также объявите как простые Variants два других параметра.

Если вы ненавидите IDE, не используйте ее. Используйте блокнот. Затем вставьте написанный код.

person GSerg    schedule 15.02.2010
comment
Спасибо, попробую. На самом деле я не ненавижу IDE, я просто чувствую большой разрыв в удобстве использования между этой IDE и, например, netbeans. А отсутствие юзабилити, на мой взгляд, снижает эффективность. - person Sebastian; 15.02.2010
comment
Это потому, что целевая аудитория VBA IDE - менеджеры и другие люди, которые считаются умными, но могут не быть программистами. Отсюда сообщения о синтаксических ошибках и отсутствии дополнительных функций. Сравните с VS.NET IDE, это явный перебор для менеджера. - person GSerg; 15.02.2010
comment
Хорошо, это хороший момент. Не думал об этом = ›типичный взгляд программиста ....;) VS.NET IDE - действительно хорошая программа, но я согласен: для них это было бы слишком. - person Sebastian; 15.02.2010
comment
Спасибо за решение. Мне нравится идея передачи массива в вариант, потому что это можно легко проверить с помощью «If IsArray (somevar) Then», и все готово. Еще два цента я вложил в IDE: IDE VBA на 99% идентична IDE нашего старого доброго друга Visual Studio 6. Потому что, как видите ... VB6 никогда не умирал. Последние 10 лет он жил в своем потомке, VBA, хотя и намного меньше по размеру и не скомпилирован. Он продолжал работать в Office 2010, 2013 и 2016 ... до тех пор, пока не началась облачная хрень с Office 365. - person spinjector; 08.01.2018

Возможно, вам нужен массив параметров:

В объявлении процедуры определите список параметров обычным способом. Все параметры, кроме последнего, должны быть обязательными (не обязательно (Visual Basic)).

Перед последним именем параметра поставьте ключевые слова ByVal ParamArray. Этот параметр автоматически является необязательным. Не включайте ключевое слово Optional.

- Как: перегрузить процедуру, которая принимает неопределенное количество параметров (Visual Basic)

Ссылка для VBA: Общие сведения о параметре массивы

person Fionnuala    schedule 15.02.2010

На этот вопрос есть более простой, но не обязательно лучший ответ. Себастьян сказал: «Если я сделаю это с массивом, как показано выше, и назначу массив, строка будет помечена красным => как ошибка (и она не будет компилироваться)».

Ваш код включает «Необязательный y_val2 () As Variant = ????». Вам не нужен "()", чтобы он мог принимать массив Variant в качестве параметра. Так что, если вы действительно хотите сделать это таким образом, вы можете, например, что-то вроде «Optional y_val2 = FALSE».

При первоначальной передаче аргумента, если вы хотите передать массив, просто убедитесь, что that является массивом Variant.

Я действительно думаю, что более элегантно не использовать здесь значение по умолчанию, поэтому я согласен с ответом GSerg в целом (и поддержал как этот, так и исходный вопрос).

Однако для GSerg и spinjector да, вы можете проверить необязательный параметр с помощью «If IsArray (YourOptionalVariantParameter) Then», но если вы используете вариант, «IsMissing (YourOptionalVariantParameter)" удобен и элегантен, может быть немного быстрее и может использоваться, когда ( и только когда) Variant передается в качестве аргумента, чтобы проверить, существует ли он.

Если вы выполняете IsArray (YourOptionalVariantParameter) и такой параметр не существует, то все, что мы делаем, это проверяем, является ли несуществующая переменная массивом. Если вы используете значение параметра по умолчанию, такое как FALSE (как в моем первом примере), тогда имеет смысл сначала проверить, является ли переменная массивом или нет.

Кстати, я не согласен с тем, что вам нужно объявлять все параметры как Варианты для согласованности. Варианты менее эффективны, чем другие типы, и поэтому, я думаю, их следует использовать только в случае необходимости.

person sdanse    schedule 06.12.2019

IDE может быть не очень полезным, но справка (на этот раз) содержит ответ:
ParamArray
Необязательно. Используется только в качестве последнего аргумента в списке аргументов, чтобы указать, что последний аргумент является необязательным массивом элементов Variant. Ключевое слово ParamArray позволяет указать произвольное количество аргументов. ParamArray нельзя использовать с ByVal, ByRef или Optional.

person Patrick Honorez    schedule 15.02.2010
comment
Когда поток данных (то есть точки диаграммы) поступает в виде массива, использование ParamArray не имеет смысла. Это синтаксический сахар для людей, которые хотят перечислить свои значения в коде как литералы и не хотят объявлять для этого другую переменную массива. - person GSerg; 15.02.2010