Доступ к VBA - Как бы я имел цикл в VBA, который позволяет мне циклически просматривать имена элементов управления

ms-access vba loops access-vba

33974 просмотра

3 ответа

У меня есть около 10 текстовых полей в форме, которые фактически используются для отображения, а не ввода. Они названы txt_001_Name, txt_002_Title, etc..what вид петли для этого используется.

Какой тип VBA я должен использовать, чтобы на самом деле перебрать имена текстовых полей? Так что, если бы я был debug.print это выглядело бы так:

txt_001_Title
txt_002_Title
txt_003_Title

Это, вероятно, довольно просто сделать - тем более я должен научиться тому, как!

РЕДАКТИРОВАТЬ: Извините, я должен был быть более описательным об этом.

Из-за вышеупомянутого соглашения об именах я собираюсь перебрать эти текстовые поля, чтобы я мог что-то выполнить с каждым. Каждое из этих 10 текстовых полей на самом деле представляет собой числовые значения, каждое из которых имеет SQL-оператор в onloadсобытии формы . У меня также есть другой набор из десяти, которые содержат числовые значения, которые являются гораздо более статичными, и, наконец, еще десять, которые используют выражение, чтобы просто разделить каждую из первых десяти, на относительную «вторую» десятку, и значение заканчивается в относительной 3. Таким образом, в основном это выглядит как таблица приборной панели.

'first ten'       'second ten'     'resulting ten'
---------------------------------------------------
txt_001_value      txt_001_calc     txt_001_result
txt_002_value      txt_002_calc     txt_002_result

и т.п.

Так что я действительно хочу использовать это для «получающихся» текстовых полей. Я хочу просмотреть первую десятку и выполнить простой расчет:

 me.txt_001_result = me.txt_001_value / me.txt_001_calc     

Все соглашения об именах «совпадают», поэтому я могу вручную набрать 10 строк из вышеперечисленного для этого, но я уверен, что есть лучший способ (цикл через это), и я, вероятно, должен изучить его.

Автор: Justin Источник Размещён: 12.11.2019 09:41

Ответы (3)


8 плюса

Решение

Вы можете перечислить имена элементов управления textbox с помощью простой процедуры, подобной этой:

Public Sub TextBoxNames(ByRef pfrm As Form)
    Dim ctl As Control
    For Each ctl In pfrm.Controls
        If ctl.ControlType = acTextBox Then
            Debug.Print ctl.Name
        End If
    Next ctl
    Set ctl = Nothing
End Sub

Вы можете вызвать его из события Load формы:

Private Sub Form_Load()
    TextBoxNames Me
End Sub

Однако я не понимаю, чего вы пытаетесь достичь. Я понимаю, что вы хотите сделать что-то с ctl.Name, кроме Debug.Print, но я не знаю, что это такое.

Вместо вычисления результата для me.txt_001_result , а затем назначить это значение в текстовом поле, рассмотреть вопрос о создании источника управления для txt_001_result к txt_001_value / txt_001_calc и позволить доступу поместить соответствующее значение в txt_001_result для вас.

В ответ на ваши комментарии я предложу эту процедуру в качестве отправной точки, на которой вы должны опираться:

Public Sub MyTextBoxValues()
    Const cintLastTextBoxNum As Integer = 10
    Dim i As Integer
    Dim strValueControl As String
    Dim strCalcControl As String
    Dim strResultControl As String
    Dim strPrefix As String

    For i = 1 To cintLastTextBoxNum
        strPrefix = "txt_" & Format(i, "000")
        'txt_001_value      txt_001_calc     txt_001_result '
        strValueControl = strPrefix & "_value"
        strCalcControl = strPrefix & "_calc"
        strResultControl = strPrefix & "_result"
        'me.txt_001_result = me.txt_001_value / me.txt_001_calc '
        'Debug.Print strResultControl, strValueControl, strCalcControl '
        Me.Controls(strResultControl) = Me.Controls(strValueControl) / _
            Me.Controls(strCalcControl)
    Next i
End Sub
Автор: HansUp Размещён: 12.10.2010 07:08

4 плюса

Я предпочитаю использовать FOR EACH для перебора коллекции элементов управления независимо от того, на чем находятся текстовые поля (либо сама форма, либо панель управления)

dim myBox as Textbox
For each myBox in myForm
    myBox.Text = "hello"
Next

Также означает, что вы можете создавать собственные группы (помещая их все в один контейнер). Обратите внимание, что если у вас есть другие элементы управления, вам может понадобиться проверка типов ( IF TYPEOF(myBox) = "TextBox" THEN ...)

Вы также можете сделать это так:

dim i as integer
For i = 1 to 10
     myForm.Controls("txt_00" & i & "_Title").Text = "hello"
Next i

Я определенно предпочитаю For Each, хотя.

Автор: BradC Размещён: 12.10.2010 04:27

2 плюса

Я не могу полностью понять, почему вам нужно делать то, что вы делаете, но у меня были такие формы, где у меня была несвязанная форма, для которой я хотел отобразить произвольное количество полей, чтобы я мог это увидеть. Если вы просматриваете коллекцию элементов управления только в событии OnOpen формы, это нормально. Но если вы делаете это в OnCurrent связанной формы или несколько раз в несвязанной форме, вы можете рассмотреть мой длинный пост об использовании пользовательских коллекций для управления группами элементов управления .

Автор: David-W-Fenton Размещён: 12.10.2010 08:31
Вопросы из категории :
32x32