VBA使用循环引用文本框或标签

VBA使用循环引用文本框或标签,vba,excel,excel-2007,Vba,Excel,Excel 2007,我正在尝试替换以下内容: txt1.Text = "" txt2.Text = "" txt3.Text = "" txt4.text = "" ...continues for quite awhile 与: 如何使用通用的“控件”引用文本框?您的控件已在cCont中 Dim cCont As Control For Each cCont In Me.Controls If TypeOf cCont Is MSForms.TextBox Then cCont.Text = "h

我正在尝试替换以下内容:

txt1.Text = ""
txt2.Text = ""
txt3.Text = ""
txt4.text = ""
...continues for quite awhile
与:


如何使用通用的“控件”引用文本框?

您的控件已在cCont中

Dim cCont As Control

For Each cCont In Me.Controls
  If TypeOf cCont Is MSForms.TextBox Then
    cCont.Text = "hi"
    MsgBox cCont.Name
  End If
Next
如果您对没有从IntelliSense获得
Text
属性感到困惑,只需将
控件转换为更派生的类型:

Dim cCont As Control

For Each cCont In Me.Controls
  If TypeOf cCont Is MSForms.TextBox Then
    Dim cText As MSForms.TextBox

    Set cText = cCont

    cText.Text = "hi"
    MsgBox cText.Name
  End If
Next

这将使用早期绑定而不是后期绑定,您将得到您的代码建议。

最好在子或函数头之后立即声明所有局部变量。“在过程(如For循环)中块内声明的变量在进入过程时初始化。无论代码是否执行过块,这些初始化都会生效。”@ray023您的评论与此高度无关。它涉及VB.NET,与VBA不同,它不影响
cText
的使用方式。当您进入程序时,没有人关心
cText
是否自动设置为
Nothing
。关键是,在你进入循环之前,它不会被设置为
cCont
。我是重要人物,我在乎,该死的!!:D链接可能是VB.NET,但链接中提到的变量生存期也适用于VBA。关键是cText存在于过程中,而不是FOR EACH循环中。那么,您是否更愿意将所有变量组合在一个漂亮、紧凑的包中?我知道这是吹毛求疵,但我仍然给出+1 FWIW。@ray023您似乎把生存期和作用域混淆了:)生存期=整个过程,作用域=?在VBA中,它是“从声明点到过程的结尾”。在VB.NET中,它是“从声明点到封闭块的结尾”。变量存在于某一时刻并不意味着您可以使用它。您只能在生命周期和范围重叠的地方使用它。这就是为什么我经常发现在使用变量的地方声明变量很有用的原因。@Oneide将枚举表单上的所有控件,而不仅仅是文本框。要提取非文本框时,它无法分配给
textbox
变量。但是所有控件都可以分配给
控件
变量,该变量是它们的基类。
Dim cCont As Control

For Each cCont In Me.Controls
  If TypeOf cCont Is MSForms.TextBox Then
    Dim cText As MSForms.TextBox

    Set cText = cCont

    cText.Text = "hi"
    MsgBox cText.Name
  End If
Next