Установите 'Me.Labelnn.BackColor' с циклом for nn = ... в отчете с большим количеством меток - PullRequest
0 голосов
/ 10 января 2012

У меня есть отчет, который похож на почасовое расписание на целую неделю.Каждая ячейка в расписании составляет 1 день на 1 машину.Каждая колонка является одной из 7 машин.Таким образом, ряд состоит из 7 дневных клеток.Пока все хорошо, но каждый день требует 18 строк текста (поле Memo) и - каждая строка должна быть раскрашена.Я создал 18 ярлыков с номерами Label33 и выше для каждого из 7 столбцов.

Я устанавливаю их BackColor с довольно большой инструкцией case из 7 случаев и 18 x Labelnn.Backcolor = aColor в каждом случае.

Однако я хотел бы заменить это на что-то, что образует control_name="Label" & n n, и сделать что-то вроде Me.control_name.BackColor=aColor.

Возможно?Как?(Нет, учитывая, насколько гибкий VBA-Access, я еще не пробовал выше.)

Ответы [ 2 ]

1 голос
/ 10 января 2012

Коди Грей прав, но это бесполезно, если вы не знаете, что такое массив элементов управления.

Ниже приведен Excel VBA, но я сделал то же самое с Access VBA, но не в последнее время. Я думаю, что синтаксис тот же, но я не гарантирую.

Я создал рабочую книгу, вставил форму, вытащил на нее несколько элементов управления и запустил следующий код:

Option Explicit
Sub TestControls()

  Dim InxC As Long

  Load UserForm1

  With UserForm1
    For InxC = 0 To .Controls.Count - 1
      Debug.Print .Controls(InxC).Name
    Next
  End With

End Sub

Вывод в ближайшее окно был:

Label1
CommandButton1
ComboBox1
CommandButton2
OptionButton1

Вы можете видеть, что Label1.xxx точно такой же, как .Controls(0).xxx. Я называю свои элементы управления систематически, чтобы я мог выполнять код как:

  With UserForm1
    For InxC = 0 To .Controls.Count - 1
      If Mid(.Controls(InxC).Name,1,5) = "lblXx" Then
        ' Code to set properties of all lblXx controls
      End If
    Next
  End With

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

Во время выполнения я делаю те, которые мне нужны, видимыми и при необходимости устанавливаю их верхние и левые свойства.

0 голосов
/ 10 января 2012

Я согласен с Коди Грей.Используйте Контрольные массивы .

Вот ссылка, которая поможет вам

http://www.siddharthrout.com/index.php/2018/01/15/vba-control-arrays/

Хотя Тони дал вам относительно простой способсделать это, но есть случаи, когда вы можете добавить или удалить элемент управления или просто испортить последовательность.Также бывают случаи, когда вы просто не можете оставить метку Label1.Вы можете добавить к нему какой-нибудь текст, чтобы он что-то обозначал ...

В таком сценарии используйте TypeOf вместо Name

Например

Option Compare Database

Private Sub Command1_Click()
    Dim ctl As Control
    For Each ctl In Me.Controls
        If TypeOf ctl Is Label Then
            Debug.Print ctl.Name
        End If
    Next ctl
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...