Сохраните пары поиска в таблице данных, что-то вроде этого:
KeyValue Foreground Background
0-1 329171 329171
1-2 33023 33023
2-3 251574 251574
3-4 16645487 16645487
4-5 8453888 8453888
5-6 12615680 12615680
6-7 16744703 16744703
7-8 65535 65535
8-9 32896 32896
Конечно, теперь, когда я отредактировал эти данные в качестве примера, я заметил, что цвета переднего плана и фонаидентично, но это не влияет на мой ответ.
Теперь в вашем коде вместо If / Then / Else в качестве теста для определения цвета вы будете использовать DLookup () для поиска цветов на основе значения, которое вы тестировали:
Dim lngForeColor As Long
Dim lngBackColor As Long
lngForeColor = DLookup("Foreground", "tblColors", "[KeyValue]='" & Me!A & "'")
lngBackColor = DLookup("Background", "tblColors", "[KeyValue]='" & Me!A & "'")
Me!A.ForeColor = lngForeColor
Me!A.BackColor = lngBackColor
Теперь, объедините это с уточнением предложения Аарона обойти все элементы управления:
Dim ctl As Control
Dim lngForeColor As Long
Dim lngBackColor As Long
For Each ctl in Me.Detail.Controls
If DCount("*", "tblColors", "[KeyValue]='" & ctl.Value & "'") = 0 Then
lngForeColor = 0
lngBackColor = 16777215
Else
lngForeColor = DLookup("Foreground", "tblColors", "[KeyValue]='" & ctl.Value & "'")
lngBackColor = DLookup("Background", "tblColors", "[KeyValue]='" & ctl.Value & "'")
End If
ctl.ForeColor = lngForeColor
ctl.BackColor = lngBackColor
Next ctl
Set ctl = Nothing
Если ваш цвет переднего плана и фона одинаковы, вам не понадобятся оба столбца вваш стол, и вам нужно будет сделать только один поиск.
Теперь, если вы не меняете все элементы управления, а только некоторые из них, вы можете использовать свойство .Tag элементов управления, чтобы сделать это условным:
For Each ctl in Me.Detail.Controls
If .Tag = "ColorGroup" Then
' set the colors
End If
Next ctl
Лучшее предложение, когдавам нужно изменить группу элементов управления условно на основе данных из записи, чтобы создать пользовательскую коллекцию и назначить эти элементы управления ей в событии OnOpen вашего отчета формы.Для этого вы должны создать переменную уровня модуля типа collection:
Dim colColorGroup As New Collection
В событии OnOpen отчета вы должны сделать следующее:
Dim ctl As Control
For Each ctl in Me.Detail.Controls
colColorGroup.Add ctl, ctl.Name
Next ctl
Set ctl = Nothing
Затем вОтформатируйте событие детализации, вместо того чтобы проходить всю группу элементов управления, вы будете циклически проходить через эту коллекцию:
Dim varItem As Variant
Dim ctl As Control
For Each varItem in colColorGroup
Set ctl = varItem
If DCount("*", "tblColors", "[KeyValue]='" & ctl.Value & "'") = 0 Then
lngForeColor = 0
lngBackColor = 16777215
Else
lngForeColor = DLookup("Foreground", "tblColors", "[KeyValue]='" & ctl.Value & "'")
lngBackColor = DLookup("Background", "tblColors", "[KeyValue]='" & ctl.Value & "'")
End If
ctl.ForeColor = lngForeColor
ctl.BackColor = lngBackColor
Next varItem
Set ctl = Nothing
Это будет намного быстрее, чем циклически проходить большую группу элементов управления и выбирать на основеСвойство тега.