vba 将控制称为变量语法

Posted

技术标签:

【中文标题】vba 将控制称为变量语法【英文标题】:vba refer to control as variable syntax 【发布时间】:2019-06-20 15:13:15 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

如何正确引用控件

你可以引用控件

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

注意,粒子 Me 总是引用 当前的 UserForm 实例 (不是它的名字) 并且可以/应该在用户表单代码模块中使用。 例如,您可以参考Me.Controls 或控件集合中的给定项目,例如Me.Controls(tempname)。 - 不好的使用,但是从该表单的代码中引用用户表单的默认实例(例如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) 在 .Font 属性失败之前错误插入 .Value 属性

  ' 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

【讨论】:

【参考方案2】:

在表单过程中使用 Me 是表单名称的替换,它似乎是上面的frmtst。所以Me.frmtst(tempname) 是双重参考。 您可以参考控件tempnameMe.tempname。用Me.tempname.Font.Name = "Lucida Console"设置字体,用Me.tempname.Font.Size = 10设置字体大小

【讨论】:

很棒的信息,问题解决了。这是我想要的“.size”。衷心感谢所有输入。是的,我使用了指数来确定大小。以前我为所有记录的每个字段建立了一个最大字符长度的数组。当我尝试使用比例公式时,我最终会在长公式上留下太多空白。因此,通过指数计算,结果恰到好处。

以上是关于vba 将控制称为变量语法的主要内容,如果未能解决你的问题,请参考以下文章

VBA,语法,将单元格范围组合在一起以获取公共变量

sql的vba代码中''附近的语法不正确

将 ConcatRelated() 与变量一起使用

vba 语法

我的Java学习笔记-语法

VBA语法