Есть ли способ определить, какие выпадающие списки не пусты при нажатии «поиск» в графическом интерфейсе VBA? - PullRequest
1 голос
/ 02 июля 2019

Я работаю над приложением в VBA, которое получает информацию из таблицы Excel, заполняет выпадающий список, затем на основе выбранной информации из выпадающего списка извлекает полную информацию для соответствующих значений.Есть 6 дропбоксов, и я ищу способ выяснить, какие дропбоксы имеют значение (не пустое), не переписывая десятки операторов if с одинаковым кодом, но с разными условиями (т. Е. Комбинации 1 и 3 имеют значения, поэтому программа будетищите только записи, основанные на этих двух выбранных полях)

Я знаю, что этого можно добиться, переписав операторы if, но я надеюсь, что есть более простой способ, который не займет несколько часов?

Private Sub Search_Page1_Click()

Dim year As String
Dim location As String
Dim snap As String
Dim city As String
Dim group As String
Dim endyear As String

year = Multipage1.Cmb_Year.Value
location = Multipage1.Cmb_Location.Value
snap = Multipage1.Cmb_Snapshot.Value
city = Multipage1.Cmb_City.Value
group = Multipage1.Cmb_Group.Value
endyear = Multipage1.Cmb_LeaseEnd.Value

If year = Empty And location = Empty And snap = Empty And city = Empty 
And group = Empty And endyear = Empty Then


MsgBox ("Please fill in at least one field")

End If

End Sub

1 Ответ

1 голос
/ 02 июля 2019

Если вы можете работать с Collection элементами управления ComboBox, тогда выберите пользовательскую функцию, например, и вызовите ее следующим образом:

Dim populatedBoxes as New Collection
Set populatedBoxes = GetPopulatedThings(Multipage1, "ComboBox")
Dim cb as MSForms.ComboBox
For Each cb in populatedBoxes
    MsgBox cb.Value
Next

В своем коде вы можете заменить:

If year = Empty And location = Empty And snap = Empty And city = Empty And group = Empty And endyear = Empty Then

С этим:

Set populatedBoxes = GetPopulatedThings(Multipage1, "ComboBox")
If populatedBoxes.Count = 0 Then Exit Sub

Вот функция:

Private Function GetPopulatedThings(container As Object, Optional ctrlType As String = "ComboBox") As Collection
Dim c As New Collection
Dim ctrl As MSForms.Control

For Each ctrl In container.Controls
    If TypeName(ctrl) = ctrlType Then
        Select Case ctrlType
            Case "ComboBox"
                If ctrl.ListIndex > -1 Then
                    c.Add ctrl
                End If
            Case Else
            ' TBD
            ' Additional cases will require separate logic...
        End Select
    End If
Next
Set GetPopulatedThings = c
End Function
...