我在表单上有大约10个文本框,实际上用于显示而不是输入。它们被命名为txt_001_Name
,txt_002_Title
等。为此使用了哪种循环。
我应该使用什么样的VBA来实际循环文本框的名称?所以,如果我是debug.print,它看起来像:
txt_001_Title
txt_002_Title
txt_003_Title
这可能很简单 - 我应该学习的原因更多!
编辑:对不起,我应该对此更具描述性。
由于上面的命名约定,我希望遍历这些文本框,以便我可以对每个文本框执行某些操作。这10个文本框中实际表示的是数值,每个文本框的onload
事件后面都有一个SQL语句。我还有另一组十个包含更静态的数值,最后另一个十个使用表达式简单地将前十个中的每一个除以相对的“第二”十,并且该值最终在相对中所以基本上它最终看起来像仪表板。
'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行,但我确信有更好的方法(循环这个),我应该学习它。 / p>
答案 0 :(得分:8)
您可以使用以下简单的过程列出文本框控件的名称:
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
但是,我不明白你想要完成什么。我意识到你想用除Debug.Print
以外的 ctl.Name 做一些事情,但我不知道那是什么。
不是计算 me.txt_001_result 的结果,然后将该值分配给文本框,而是考虑将 txt_001_result 的控制源设置为 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
答案 1 :(得分: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。
答案 2 :(得分:2)
我不能完全理解为什么你需要做你正在做的事情,但我有一些表格,我有一个未绑定的表格,我想显示任意数量的字段,所以我可以看到它。如果你只是在表单的OnOpen事件中走控制集合,那很好。但是如果你是在绑定表单的OnCurrent中执行它,或者在未绑定表单中多次执行它,你可能会在using custom collections to manage groups of controls上考虑我的一个长文章。