vba - зацикливание на определенных элементах управления формы

У меня есть форма доступа с примерно 5 выпадающими списками, мне нужно проверить, являются ли значения выпадающих окон уникальными, прежде чем утверждать форму. Я могу выполнять итерации по всем элементам формы, но хочу иметь возможность выполнять итерацию только по выпадающим спискам:

----------------------------------------------------------------------
|Id1 [dropdown values] Id2 [Dropdown values]  Id3 [Dropdown Values]   |
|                                                                     |  
|  CollectionTask [Another dropdown]                                  |    
|  []This is a checkbox                                               |
|               [Approve Button] [clear myForm btn]                   |
----------------------------------------------------------------------

'iterating over the form elements 
 On Error Resume Next
    Dim ctl As Control
    For Each ctl In Me.Controls
        'do something only for dropdown controls of form
    Next

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

'this code will do the trick but that means I will have to write a condition for every id
'which for me is lots of code (not being lazy but I think iterating over the form elements will be more efficient 
If (id1.Value = id2.Value) Or (id1.Value = id3.Value) Or (id1.Value = id4.Value) then
       Msgbox "make sure you are not duplicating ids"

End if

1 ответ

Решение

С помощью следующего кода вы можете проверить все элементы управления с помощью ControlType из acComboBox, В основном это просто добавляет ComboBoxценность в Dictonary проверяя каждый раз, чтобы увидеть, существует ли значение в Dictonary, Вам просто нужно определить, что вы хотите сделать, если значение уже установлено в другом ComboBox,

Это код от руки, но я уверен, что все правильно:

 Private Sub CheckCombos()
     Dim ctl As Control
     Dim dict As Variant

     Set dict = CreateObject("Scripting.Dictionary")


     For Each ctl In Me.Controls

         If ctl.ControlType = acComboBox Then 

             If Nz(ctl.Value,"") <> "" Then 

                 If dict.Exists(ctl.Value) Then 
                    Msgbox "Combobox: " & ctl.Name & " has the same value as: " & dict(ctl.Value)
                 Else 
                    dict.Add ctl.Value, ctl.Name
                 End If

             Else 
                 Msgbox "Empty Combobox" 
                 'Handle exit
             End If 

         End If
     Next
  End Sub
Другие вопросы по тегам