vba 将控件称为变量语法

vba refer to control as variable syntax

我正在使用 VBA 创建控件,无法通过将它们引用为 控件 来设置 字体 。 我给它们命名,如果我按名称引用它们,可以修改字体 Me.(control variable name).Font.
我需要知道 正确的语法 才能完成这项工作。 我想我已经尝试了所有组合,但 none 已经成功了。

For CountRecords = 0 To rs.RecordCount - 1
    tempLeft = 6
    For countfields = 0 To rs.Fields.Count - 1
        tempname = rs.Fields.Item(countfields).Name & CountRecords
        frmtst.Controls.Add "forms.textbox.1", tempname
        Set ctl = Me.frmtst(tempname)
        Me.test.Font = 14 'set the font on a test textbox
        Me.Controls(tempname).Value.Font = 14 '****Trouble line ********
        ctl.Width = ((columnwidth(countfields) ^ 0.8) * 10) + 25
        ctl.Height = 24
        ctl.Left = tempLeft 'templeft + columnwidth(CountFields) + 18
        tempLeft = tempLeft + ctl.Width + 3
        ctl.Top = 20 * CountRecords + 3
        ctl = rs.Fields.Item(countfields).Value
        If rs.Fields.Item(countfields).Type = 6 Then 
            ctl = Format(ctl, "$#,##0.00")
        end if
    Next countfields
    rs.MoveNext
Next CountRecords

Using Me in a form procedure是对form name的替换,上面好像是frmtst。所以 Me.frmtst(tempname) 是双重引用。 可以参考控件tempnameMe.tempname。使用 Me.tempname.Font.Name = "Lucida Console" 设置字体并使用 Me.tempname.Font.Size = 10

设置字体大小

如何正确引用控件

你可以参考控件

  • 1a) 直接按名称并使用 IntelliSense(例如 Me.Test),
  • 1b) 间接通过 Controls 集合或
  • 2) 通过直接或间接设置一个对象隐式地(例如Set ctl = Me.Controls(tempname)

注意粒子Me总是指当前用户窗体实例 (未命名) 和 can/should 在用户窗体代码模块中使用。 例如,您可以引用 Me.Controls 或控件集合中的给定项目,例如Me.Controls(tempname)。 - 使用不当,但是从该表单的代码后面引用 UserForm 的默认实例(例如 frmtst)。 此外,不可能在同一个语句中引用两者,例如 Me.frmtst(tempname)

建议阅读以加深理解UserForm1.Show?

1a) 在 .Font

的测试分配中缺少 .Size 属性
  ' Direct referencing a control of the current Userform instance - missing .Size property
    Me.Test.Font.Size = 14              ' instead of: Me.test.Font = 14 

1b) .Value 属性 在失败之前插入错误 .Font 属性

  ' Indirect referencing a control of the current Userform instance - bad .Value prop, .Font prop without .Size 
    Me.Controls(tempname).Font.Size = 14        ' instead of: Me.Controls(tempname).Value.Font = 14 

2) 对象引用

但是,如果您更喜欢将对象设置到内存中,则案例 [1b] 中显示的代码行是多余的并且 你应该决定坚持选择的方法。

Dim ctl As MsForms.TextBox              ' declare MSForms object (e.g. TextBox, or Object)
Set ctl = Me.Controls(tempname)         ' instead of: Set ctl = Me.frmtst(tempname)
ctl.Font.Size = 14                  ' instead of: .Font = 14 

进一步说明

始终使用 Option Explicit 检查所有变量的正确和完整声明(如果在您的代码中包含一些就好了)。

顺便说一句,您是否真的通过指数计算了控件的宽度,即 ^ 0.8) * 10) + 25