【问题标题】:Set Control Property While Looping Through Controls在循环通过控件时设置控件属性
【发布时间】:2019-06-26 00:11:16
【问题描述】:

下面的 VBA 代码可用于循环遍历窗体上的所有控件,但是如何使用控件名称 c.name 设置控件的任何属性?

 Dim c As Control
 For Each c In Me.Controls
     If TypeName(c) = "TextBox" Then
         MsgBox "Control Name= " & c.name & " Control Value = " & c.Value

        'I'm looking for this Part:  c.name  .BackColor = 255

     End If
 Next

【问题讨论】:

  • 你为什么要使用 name 属性?为什么不只是c.Backcolor = 255?

标签: vba ms-access userform


【解决方案1】:

最好先定义要更改的控件,然后将其包含在 For 循环中。

Dim c As Control
Dim txt As TextBox

For Each c In Me.Controls
    If TypeOf c Is TextBox Then
        Set txt = c
        txt.BackColor = RGB(255, 255, 255)
    End If
Next c

【讨论】:

  • 谢谢。在预期的应用程序中,我重用一个表单来处理 12 种不同的操作,代码需要查看每个控件并匹配用于特定操作的控件数组并定位它们,如果不使用,则隐藏它们。 BackColor 只是一个例子。
【解决方案2】:

呃,设置属性?

 Dim c As Control
 For Each c In Me.Controls
     If TypeName(c) = "TextBox" Then
         c.BackColor = 255
     End If
 Next

Intellisense 无法工作,因为您使用的是通用 Control 而不是特定的 TextBox 接口,但它会运行良好。

【讨论】:

  • 是的。我在发布这个问题后一分钟回答了我自己的问题。我对 VBA 很生疏——自从头发变白之前就没有看过 VBA 项目。
【解决方案3】:

要设置Textbox 的BackColor,您可以直接访问它:TextBox1.BackColor = 255。

您尝试这样做的方式是通过TextBox 的Name 属性,它只返回一个字符串。

基本上你在做的是TextBox1.Name.BackColor = 255,这会导致错误:

编译错误:限定符无效。

所以正确的做法是这样的:

Dim c As Control
For Each c In Me.Controls
    If TypeName(c) = "TextBox" Then
        c.BackColor = 255
    End If
Next

如果您想使用智能感知,那么您可以设置对临时变量的引用。

Dim c As Control
For Each c In Me.Controls
    If TypeName(c) = "TextBox" Then
        Dim TempTextbox As Access.TextBox
        Set TempTextbox = c
        TempTextbox.BackColor = 255
    End If
Next

这是文本框对象 (Access) 上的 Microsofts Documentation。您可以将其用作其不同方法和属性的参考。

【讨论】:

  • 感谢您的智能提示。我从来没有想过这样做。
【解决方案4】:

我已经很久没有涉足 VBA 了。 我的问题的(明显)正确答案是: c.BackColor = 255

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多