#excel #vba #validation #listbox
#преуспеть #vba #валидация #поле списка #excel #проверка
Вопрос:
У меня есть полностью функционирующая пользовательская форма, которая переносит значения на рабочий лист при нажатии кнопки «Отправить». Это работало нормально, когда проверка данных применялась ко всем текстовым полям (появляется окно сообщения с запросом на ввод значения), и без проверки данных в поле списка.
Однако, после добавления проверки данных для окна списка (см. Код ниже) кнопка «Отправить» передает только предварительно выбранное значение в конструкторе форм, а не выделение. Например. если по умолчанию ничего не выбрано, то я делаю выбор, он передает пустую ячейку. Если ‘Alex’ выбрано по умолчанию, и я выбираю ‘Hannah’, как только форма открыта, она передаст ‘Alex’.
У кого-нибудь есть какие-либо идеи относительно того, почему выбранный элемент в окне списка не выбирается? Все остальные значения переносятся нормально (у меня есть около 10 других текстовых полей без проблем). Это проблема с проверкой данных?
Мой код выглядит следующим образом:
Private Sub cbSubmit_Click()
'Name Selection Data Validation
If Not IsAnythingSelected(lbName) Then
MsgBox "Please select your name"
Exit Sub
End If
Unload Me
'Begin Transfer Information and Change Workbook
Dim nwb As Workbook
Set nwb = Workbooks.Open("G:Test Dataset.xlsx")
'Determine emptyRow
Dim emptyRow As Long
emptyRow = WorksheetFunction.CountA(nwb.Sheets("daily_tracking_dataset").Range("A:A")) 1
'Transfer Information
With nwb.Sheets("daily_tracking_dataset")
'Date
.Cells(emptyRow, 1).Value = CDate(txtDate.Text)
'Name
.Cells(emptyRow, 2).Value = lbName.Value
'Reference Checkss
.Cells(emptyRow, 3).Value = txtROT.Value
.Cells(emptyRow, 4).Value = txtROP.Value
End With
ActiveWorkbook.Save
ActiveWindow.Close
UserForm1.Hide
ActiveWindow.Close
End Sub
С помощью следующей функции для определения, есть ли элемент в поле списка, выбран:
'Function to loop through Name list box and find a selection
Function IsAnythingSelected(lbName As Control) As Boolean
Dim i As Long
Dim selected As Boolean
selected = False
For i = 1 To lbName.ListCount
If lbName.selected(i) Then
selected = True
Exit For
End If
Next i
IsAnythingSelected = selected
End Function
End If
Ответ №1:
Индексация поля списка начинается с 0, а не с 1. Поэтому используйте это вместо этого в своей функции:
For i = 0 To lbName.ListCount - 1
If lbName.selected(i) Then
selected = True
Exit For
End If
Next I
Правка1:
Попробуйте заменить эту строку:
.Cells(emptyRow, 2).Value = lbName.Value
с помощью этого:
.Cells(emptyRow, 2).Value = lbName.List(lbname.ListIndex)
Комментарии:
1. Просто попробовал это, но, похоже, это не оказывает никакого влияния. Форма по-прежнему отправляет пустое значение (или, если я предварительно выбираю имя в VBA, оно отображает это значение).
2. Ах, моя ошибка, вы просто используете эту функцию, чтобы проверить, выбрано ли что-то. Но вам следует обновить его до этого, поскольку вы пропустите выделение, если выберете первый элемент. Это также выведет нижний индекс за пределы диапазона. Кстати, смотрите Мое редактирование для возможного источника вашей проблемы.
3. Большое спасибо. Кажется, теперь все работает нормально! Как всегда, VBA, похоже, является бесконечной областью устранения неполадок. Спасибо за вашу помощь 🙂