Оператор And
(не функция ) не короткое замыкание 1 , поэтому для оценки результат логического выражения равен True
, VBA нужен результат функции MsgBox
... для каждого условия.
'both foo and bar need to be evaluated to know whether DoSomething needs to run:
If foo And Bar Then DoSomething
Сделайте вызовы MsgBox
условными - я бы предложил использовать блок Select Case
, чтобы не повторять каждый раз доступ к элементу ComboBox1.ListIndex
:
Select Case ComboBox1.ListIndex
Case 1
If Msgbox("Do you want to create a new company?", vbYesNo) = vbYes Then UserForm1.Show
Case 2
If Msgbox("Do you want to open the reports screen?", vbYesNo) = vbYes Then UserForm2.Show
Case 3
If Msgbox("Are you sure", vbYesNo) = vbYes Then Unload AccountsVbaPro
End Select
Обратите внимание, что UserForm1.Show
/ UserForm2.Show
могут в конечном итоге вызвать проблемы в конечном итоге, как и Unload AccountsVbaPro
, если этот код находится в коде позади формы с именем AccountsVbaPro
.
1 Оператор короткого замыкания не существует в VBA. Например, VB.NET, вы можете использовать операторы AndAlso
и OrElse
, которые делают. Следствием коротких замыканий логических операторов является то, что при вычислении логического выражения может произойти сбой, когда известен его результат:
If True Or True Or False Then ' all operands need to be evaluated
против
If True OrElse True OrElse False Then ' evaluation stops at the first True; 2nd & 3rd operands are skipped