Код VBA проверяет, является ли TextBox пустым, если это не позволяет пользователю продолжить - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть пользовательская форма с несколькими текстовыми полями. Я хотел бы, чтобы появилось окно сообщения, если в TextBox2 и / или TextBox3 есть что-то, но в TextBox1 ничего нет. Я также хотел бы, чтобы пользователь не смог продолжить, если это произойдет.

Это мой текущий код:

Private Sub SubmitCommandButtom_Click()
If Len(TextBox1) = "" And Len(TextBox2) > 0 Or Len(TextBox3) > 0 Then
    MsgBox "Unit Number must be entered to continue!"
End If
Sheets("Uneven Split Job Aid").Range("A2") = TextBox1.Value
Sheets("Uneven Split Job Aid").Range("B2") = TextBox2.Value
Sheets("Uneven Split Job Aid").Range("C2") = TextBox3.Value

Этот код в настоящее время генерирует окно сообщения только тогда, когда есть значение в Textbox3, а не в TextBox1, не имеет значения, есть ли что-нибудь в TextBox2. Я хотел бы проверить значение TextBox2 также. Кроме того, когда я нажимаю Ok в окне сообщения, Sub продолжает работать и вставляет значения TextBoxes на лист. Хотелось бы, чтобы этого не случилось, если появляется окно сообщения.

Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

При использовании And / Or логической логики иногда требуются круглые скобки для обеспечения правильной оценки. Когда это было:

If Con1 And Con2 Or Con3 Then

Это интерпретировалось:

  • Верны ли оба Con1 и Con2?

Или

  • Это Con3 Правда?

Итак, я добавил скобки, чтобы читать:

If Con1 And (Con2 Or Con3) Then

Что будет интерпретироваться как:

  • Является ли Con1 Верным?

И

  • Является ли Con2 или Con3 True?

Который, если я правильно понял ваш вопрос, это логика, к которой вы стремитесь. Однако это означает, что если и TextBox2, и Textbox3 пусты, то не имеет значения, есть ли в TextBox1 что-либо; MsgBox не произойдет , а остальной код будет.


Дальнейший логический анализ:

Поскольку Con1 - Len(TextBox1) = "" - всегда преобразовывался в False (см. Примечание 1 ниже) , проверка And - Con1 And Con2 всегда была false. Таким образом, единственный способ, которым оператор if мог разрешить в true, был, если Con3 разрешен в True.

Поскольку Con3 было Len(TextBox3) > 0, весь оператор if зависел от длины текста в TextBox3!


Примечания:

  1. Len(TextBox1) = "" всегда будет равно false. Len() возвращает число, а не строку. Я думаю, что вы случайно объединили два метода для проверки пустой строки. Либо TextBox1.Value = "" или Len(TextBox1.Value) = 0 будет работать; однако комбинация не имеет смысла. Хотя мне потребовалось больше всего времени, чтобы набрать мой ответ, прежде чем я поймал это. Лучше использовать для доступа к содержимому TextBox.Value или TextBox.Text вместо TextBox.

  2. Текущая проверка содержимого TextBox1 вызовет MsgBox только тогда, когда TextBox1 пусто. Это исключает пробельные символы, такие как пробел. Если вам также нужен MsgBox, когда есть только пробельные символы, попробуйте что-то вроде: Len(Trim(TextBox1.Value)) = 0 вместо того, что вы имели ранее (Len(TextBox1) = "").

    Вы можете посмотреть другие предложения для этого здесь Вы также можете рассмотреть возможность добавления аналогичной проверки на TextBox2 и TextBox3, если вы не хотите запускать MsgBox, если они иметь символы пробела, но не символы без пробелов.


Private Sub SubmitCommandButtom_Click()

'Changed Len(TextBox1) = "" to Len(TextBox1.Value) = 0 as per explanation above.
'Added .Value to length checks
If Len(TextBox1.Value) = 0 And (Len(TextBox2.Value) > 0 Or Len(TextBox3.Value) > 0) Then
    MsgBox "Unit Number must be entered to continue!"
Else
    Sheets("Uneven Split Job Aid").Range("A2") = TextBox1.Value
    Sheets("Uneven Split Job Aid").Range("B2") = TextBox2.Value
    Sheets("Uneven Split Job Aid").Range("C2") = TextBox3.Value
    'And any other code ....
End If
0 голосов
/ 26 апреля 2018

Заменить:

If Len(TextBox1) = "" And Len(TextBox2) > 0 Or Len(TextBox3) > 0 Then

с:

If Len(TextBox1) = "" And Len(TextBox2 & TextBox3)  > 0 Then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...