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

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

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

txt_001_Title
txt_002_Title
txt_003_Title

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

EDIT: Извините, я должен был быть больше описательно об этом.

из-за вышеупомянутого соглашения об именах я ищу итерацию через эти текстовые поля, чтобы я мог выполнить что-то с каждым. То, что каждый из этих 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

etc.

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

 me.txt_001_result = me.txt_001_value / me.txt_001_calc     

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

3 ответов


вы можете перечислить имена элементов управления 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

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

Private Sub Form_Load()
    TextBoxNames Me
End Sub

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

вместо вычисления результата для меня.txt_001_result и затем присвоение этого значения текстовое поле, рассмотрите возможность установки источника управления для txt_001_result to txt_001_value / txt_001_calc и пусть Access помещает правильное значение в 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

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

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

Я определенно предпочитаю для каждого, хотя.


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