2016-07-08 3 views
0

При отображении простой MsgBox, например:Почему MsgBox требует переменной байт [VBA]

MsgBox("Hello World!") 

работает отлично, почему немного более «продвинутый» MessageBox должен быть написан таким образом:

Dim DisplayMsgBox as Byte 
DisplayMsgBox = MsgBox("Hello world!", vbOKOnly, "Say Hi") 

Есть ли какая-то особая причина, почему это нужно делать таким образом, а не просто как «нормальный» MsgBox без каких-либо «дополнительных вложений»? (Так как это :)

MsgBox("Hello world!", vbOKOnly, "Say Hi") 
+1

Вы можете сделать «MsgBox» Hello world! », VbOKOnly,« Say Hi »' ''() 'требуется при использовании' = '. –

+2

Если вам нравится '()', тогда поставим 'Call' перед' Call MsgBox («Hello world!», VbOKOnly, «Say Hi») ' –

+0

Хорошо, спасибо за быстрый ответ. Теперь у меня есть три новых метода, чтобы что-то выразить :) @ScottCraner –

ответ

1

При использовании:

Dim DisplayMsgBox as Byte 
DisplayMsgBox = MsgBox("Hello world!", vbOKOnly, "Say Hi") 

DisplayMsgBox получит значение нажатой кнопке

Попробуйте это и посмотреть на различия:

Sub Test_MsgBox_Result() 
Dim DisplayMsgBox As Byte 
DisplayMsgBox = MsgBox("Hello world!", vbOKOnly, "Say Hi") 
MsgBox "The value of Ok is " & DisplayMsgBox 
DisplayMsgBox = MsgBox("Hello world!", vbYesNo, "Say Hi") 
If DisplayMsgBox = vbYes Then 
    MsgBox "The value of Yes is " & DisplayMsgBox 
Else 
    MsgBox "The value of No is " & DisplayMsgBox 
End If 
DisplayMsgBox = MsgBox("Hello world!", vbYesNoCancel, "Say Hi") 
If DisplayMsgBox = vbYes Then 
    MsgBox "The value of Yes is " & DisplayMsgBox 
ElseIf DisplayMsgBox = vbNo Then 
    MsgBox "The value of No is " & DisplayMsgBox 
Else 
    MsgBox "The value of Cancel is " & DisplayMsgBox 
End If 
End Sub 

Для получения дополнительной информации см. here

+0

Спасибо, это очень помогает :) –

2

Тип возврата не является Byte per se, но vbMsgBoxResult значение перечисления.

MSDN документы становятся все труднее и труднее найти, но в любом случае с Rubberduck вы получите CommandBar, который показывает контекстную метку, которая подтверждает тип возвращаемого значения:

Rubberduck commandbar

Это идет от фактически погрузки связанных с проектом COM-библиотек и итерации типов COM и их членов (у меня есть репозиторий Rubberduck).

vbMsgBoxResult будучи Enum, основной тип является Long, а не Byte - вы можете легко подтвердить это в непосредственной панели:

?TypeName(VbMsgBoxResult.vbOK) 
Long 

Что касается скобок, нет ничего особенного MsgBox - это тот же синтаксис, что и любая другая процедура Function.

Причина это работает:

MsgBox ("Test") 

Это потому, что вы заставляете аргумент строка "Test" будет передаваться по значению (это что круглые скобки делают!)

И причина этого не работа:

MsgBox ("Test", vbOkOnly) 

Это потому, что VBA не может оценить "Test", vbOkOnly, как один единственный аргумент, чтобы передать ByVal функции.

Это будет работать:

MsgBox ("Test"), (vbOkOnly) 

Но будет выглядеть глупо.

При вызове VBA Function как вы бы Sub (то есть, когда вы не заботитесь о возвращаемом значении), необходимо опустить скобки или использовать [устаревший] явный Call синтаксис:

Call MsgBox("Test", vbOkOnly) 
Смежные вопросы