как использовать пропущенные и логические значения в одном операторе case в excel vba - PullRequest
1 голос
/ 14 июля 2020

В VBA (MS Excel 2016): как объединить отсутствующие и логические значения в операторе select case? Аргумент val может быть передан как логическое значение или не передан вообще, или передан как что-то еще неожиданное.

public sub test(optional val as variant)
  select case val
    case true, isMissing(val): msgbox("foo")
    case else: msgBox("bar")
  end select
end sub

Выше приведена ошибка времени выполнения '13': Несоответствие типов в случае "case true, isMissing (val): "line.

Предпочтительно использовать один и тот же оператор case, позволяющий использовать несколько значений для отображения msgbox (" foo "). Также предпочел бы не устанавливать значение по умолчанию для необязательного аргумента в определении функции.

Каждый из этих вызовов должен работать:

call test        // expect msgBox("foo")
call test("abc") // expect msgBox("bar")
call test(true)  // expect msgBox("foo")

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Хотя это не очень элегантно, другой вариант может быть:

Public Sub test(Optional val As Variant)
  Select Case IIf(IsMissing(val), True, val)
    Case True: MsgBox ("foo")
    Case Else: MsgBox ("bar")
  End Select
End Sub
0 голосов
/ 14 июля 2020

Нашел обходной путь. VBA позволяет установить значение по умолчанию, если необязательный аргумент отсутствует. Итак, это сработало:

public sub test(optional val as variant = true)
  select case val
    case true: msgbox("foo")
    case else: msgBox("bar")
  end select
end sub

Ожидаемые результаты:

call test        // "foo"
call test("abc") // "bar"
call test(true)  // "foo"

Все же хотелось бы знать, есть ли способ сделать это в операторе case. Может, и нет, и это правильный подход.

...