Проблемы с выпадающими списками в пользовательской форме - PullRequest
0 голосов
/ 14 января 2019

Я работаю в пользовательской форме и пишу в выпадающих списках. Я поместил в выпадающий список выпадающий список, используя .additem, и каждый раз, когда пользователь нажимает на один из элементов в списке, должно появиться окно сообщения.

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

Это из-за функции and? Есть ли другой способ сделать это?

Чтобы уточнить, ComboBox1.ListIndex = 2 (появляются 2 окна сообщений, тогда как мне нужно только то, которое я кодировал) и ComboBox1.ListIndex = 3 (вместо 1 отображаются 3 окна сообщений).

If ComboBox1.ListIndex = 1 And Msgbox("Do you want to create a new company?", vbYesNo) = vbYes Then UserForm1.Show

If ComboBox1.ListIndex = 2 And Msgbox("Do you want to open the reports screen?", vbYesNo) = vbYes Then UserForm2.Show

If ComboBox1.ListIndex = 3 And Msgbox("Are you sure", vbYesNo) = vbYes Then Unload AccountsVbaPro

1 Ответ

0 голосов
/ 14 января 2019

Оператор 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
...