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)
是双重引用。
可以参考控件tempname
和Me.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
?
我正在使用 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)
是双重引用。
可以参考控件tempname
和Me.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
?