【问题标题】:Access VBA - How would I have a loop in VBA that allows me to loop through control names访问 VBA - 我如何在 VBA 中有一个循环,允许我循环访问控件名称
【发布时间】:2011-04-24 10:19:39
【问题描述】:

我在一个表单上有大约 10 个文本框,它们实际上用于显示而不是输入。它们被命名为txt_001_Nametxt_002_Title 等。使用什么样的循环。

我应该使用哪种 VBA 来实际循环遍历文本框的名称?所以如果我要 debug.print 它看起来像:

txt_001_Title
txt_002_Title
txt_003_Title

这可能很简单,我应该学习如何做!

编辑:对不起,我应该对此进行更多描述。

由于上述命名约定,我希望遍历这些文本框,以便对每个文本框执行一些操作。这 10 个文本框中的每一个实际上代表的是数值,每个文本框后面都有一个在表单的 onload 事件中的 SQL 语句。我还有另一组 10 组,它们包含更加静态的数值,最后还有另外 10 组使用表达式简单地将前 10 中的每一个与相对的“第二”10 相除,并且该值最终以相对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 行,但我确信有更好的方法(循环通过),我应该学习它。

【问题讨论】:

    标签: ms-access loops vba


    【解决方案1】:

    您可以通过如下简单过程列出文本框控件的名称:

    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 并让 Access 为您将正确的值放入 txt_001_result

    作为对您的 cmets 的回应,我建议您将此过程作为您的起点:

    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
    

    【讨论】:

    • 所以我明白你在说什么,但即使我没有在上面提到它,我认为我需要 vba 来解释零,对吧?也是的,你是对的,而不是过度描述,我希望在“结果文本”框中显示将一个文本框的值除以另一个文本框的值的结果。所以实际上有10多个,但它的想法完全相同。并且这些文本框填充了基于用户选择的另一个选择,基于之前的选择等的数字。我一直使用这些“仪表板”,因为这就是人们一直想要的......(我也
    • (cont)..意识到这不是访问的预期想法,但对于我需要完成的工作,它有效)。所以我正在寻找一个循环来增加文本框名称的数量,以便为每个执行基本计算,前提是它们首先包含一个值。
    • @Justin 我对上下文的理解仍然不够,但您不一定需要 VBA 代码来处理零。可能是文本框控件源表达式中的 VBA 函数:IIf(something = 0, "deal with zero", "deal with non-zero")
    • @Justin 尽管我很困惑,TextBoxNames 过程是否至少提供了您想要的一部分?
    • @Hans...是的,我很抱歉。我认为这可能归结为我不明白如何解释它。是的,你给出的第一个例子对我帮助很大。所以我开始只是想必须有一些循环来遍历所有适用于方程的文本框,这样我就不必为每组相关文本框输入方程。我想这个想法是循环遍历文本框的“数字”值。所以循环首先会这样做: txt_001_result = txt_001_value / txt_001_calc 如果两者都不为空/空,则
    【解决方案2】:

    我更喜欢使用 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。

    【讨论】:

    • 请注意,在 Access VBA 中,您希望使用 .Value,而不是 .text(.text 在不同的上下文中使用,然后 VB,并且控件必须具有 .text 的焦点可以使用)。所以,.Value = "some string" 是正确的语法
    • Albert说得对,可以用.text,每次都需要设置焦点,还是用value吧!但 BradC 的回答非常有效!
    【解决方案3】:

    我不能完全理解为什么你需要做你正在做的事情,但是我有类似的表单,我有一个未绑定的表单,我想显示任意数量的字段,所以我可以看到它.如果您仅在表单的 OnOpen 事件中遍历控件集合,那很好。但是,如果您是在绑定表单的 OnCurrent 中执行此操作,或者在未绑定表单中多次执行此操作,您可能会考虑我在 using custom collections to manage groups of controls 上的长帖子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多