Требовать выбора — список Excel VBA

#excel #vba #listbox

#excel #vba #список

Вопрос:

У меня есть пользовательская форма Excel, которая отправляет данные на рабочий лист. Я встроил проверку данных, которая требует, чтобы в каждом текстовом поле было введено значение, например:

 Private Sub Button_Submit_Click()
'Data Validation
If Me.txtCVS.Value = "" Then
Me.txtCVS.SetFocus
MsgBox "'CVs Screened' is a mandatory field. Enter daily figure or zero.", vbOKOnly, "Required     Field"
Exit Function 
 

Однако я не знаю, какой код использовать, чтобы требовать выбора из списка — пользователи выбирают свое имя из списка, прежде чем вводить свои ежедневные цифры. Некоторые пользователи, похоже, не могут вспомнить, чтобы щелкнуть их имя (!!!).

У кого-нибудь есть фрагмент работоспособного кода, который я могу использовать, чтобы потребовать выбора перед отправкой результатов? Похоже, он не работает так же, как текст в текстовом поле выше.

Ответ №1:

Вы можете использовать приведенную ниже функцию, которая перебирает все элементы в списке и возвращает true / false, если что-то выбрано или нет.

 Private Sub Button_Submit_Click()

    If Not IsAnythingSelected(ListBox1) Then
        MsgBox "Please select your name"
    End If

End Sub

Function IsAnythingSelected(lBox As Control) As Boolean
    Dim i As Long
    Dim selected As Boolean
    selected = False
    For i = 1 To lBox.ListCount
        If lBox.selected(i) Then
            selected = True
            Exit For
        End If
    Next i
    IsAnythingSelected = selected
End Function
 

Комментарии:

1. Кажется, у меня возникли небольшие проблемы с этим. Я скопировал приведенный выше код, чтобы он располагался под моей подпрограммой Button_Submit_Click() и над моей проверкой данных текстового поля (выше). Однако я получаю ошибку компиляции, потому что проверка текстового поля выполняется после функции End, но в конце подраздела. Я думаю, что моя проблема заключается в том, что функция и вспомогательный элемент смешаны вместе. Есть ли какой-либо способ объединить как вышеуказанную функцию цикла, так и проверку текстового поля в моем исходном сообщении?

2. @cazzzac нет, просто добавьте If Not end if часть til в ваш текущий Button_Submit_Click() и добавьте всю Function часть под любыми подразделами

3. Спасибо!!! Это было вполне логично, но в моем мертвом состоянии я не мог с этим разобраться. Работает прекрасно.

4. Хммм, итак, проверка данных работает нормально, а остальная часть формы отправляется в набор данных без проблем. Но форма не будет передавать значение, выбранное из списка name. Он переносит все, что было предварительно выбрано в проекте VBA. Например, если предварительно выбранное значение было пустым, и я выбираю имя, передается пустое значение; если предварительно выбранное значение равно ‘Alex’, и я выбираю ‘Hannah’, будет передано ‘Alex’.

5. Возможно ли, что приведенная выше проверка данных, возможно, очистила мой выбор до предварительно выбранного значения?

Ответ №2:

Попробуйте изменить

 For i = 1 to lBox.ListCount 
 

для следующего:

 For i = 0 To lBox.ListCount - 1