【问题标题】:VBA loop thru consecutively numbered namesVBA 循环通过连续编号的名称
【发布时间】:2019-05-17 21:45:42
【问题描述】:

我知道如何遍历括号中的数字,例如

For i = 0 To (ComboBox4.ListCount - 1)
If ComboBox4.Value = ComboBox4.List(i) Then inList = True
Next i

但是我怎样才能遍历不在括号中的数字呢?喜欢连续编号的名字:

Me.ComboBox1.Value = ""
Me.ComboBox2.Value = ""
Me.ComboBox3.Value = ""

我试过了:

for i=1 to 3
"Me.ComboBox"&i&".Value" = ""
next i

但这不起作用。它应该是什么样子?

【问题讨论】:

    标签: vba for-loop


    【解决方案1】:

    您将使用Controls 集合。

    例如:

    Me.Controls("ComboBox" & i)  
    

    编辑:
    由于表单上的控件是集合的一部分,因此您还可以遍历集合,依次拉取每个控件:

        Private Sub UserForm_Initialize()
    
            Dim ctl As Control
    
            For Each ctl In Me.Controls
                If TypeOf ctl Is MSFORMS.ComboBox Then
    '           If TypeName(ctl) = "ComboBox" Then
                    MsgBox ctl.Name
                End If
            Next ctl
    
        End Sub
    

    我添加了两种方法来识别@CallumDA 建议的控件类型。

    Microsoft writes

    • TypeName 函数返回一个字符串,当您需要存储或显示对象的类名时,它是最佳选择。
    • TypeOf...Is 运算符是测试对象类型的最佳选择,因为它比使用 TypeName 的等效字符串比较快得多。

    【讨论】:

    • FWIW 我认为TypeOfTypeName 更好,在某些情况下可能会给您带来误报。例如。 If TypeOf ctl Is MSForms.ComboBox Then... 在这种情况下,我确信 TypeName 可以正常工作。 +1
    • @CallumDA 我使用了TypeName,因为我总是忘记它叫什么,而这是谷歌建议的第一个。 TypeOf 更适合测试对象类型。我会更新我的答案。
    • 我永远不会忘记当我了解控件时。我的代码从数以千计的复制/粘贴容易出错的行变成了少数健壮且易于排除故障的行。肯定会改变游戏规则。
    【解决方案2】:

    您可以使用控制功能:

    Me.Controls("ComboBox" & i).Value = 'your code...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2016-07-25
      • 2011-12-19
      相关资源
      最近更新 更多