Не удается передать значение поля списка после добавления проверки данных

#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, похоже, является бесконечной областью устранения неполадок. Спасибо за вашу помощь 🙂