访问VBA - 如何在VBA中有一个允许我循环访问控件名称的循环

时间:2010-10-12 16:23:28

标签: ms-access vba loops access-vba

我在表单上有大约10个文本框,实际上用于显示而不是输入。它们被命名为txt_001_Nametxt_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>

3 个答案:

答案 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上考虑我的一个长文章。