Доступ к 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 связанной формы или несколько раз в несвязанной форме, вы можете рассмотреть мой длинный пост на использование пользовательских коллекций для управления группами управление.