问题描述
我有一个由MS Access生成的默认总机,我想一次自定义列表的每个条目。
“配电盘”表单默认设置为“连续表单”,并且条目的控件是一个文本框(ItemText
),该文本框通过VBA标识为OptionLabel1
。
我在默认的“总机项目”表中添加了一个名为“ SecLevel
”的新字段,在该字段中,我为每个条目/记录都添加了诸如Admin
,Operator
和{{1 }}。
现在,我希望“总机”表单列表中的每个项目都基于“ User
”值更改其文本颜色,例如Admins为红色,Operators为蓝色。
所以我尝试这样:
SecLevel
这不起作用。
解决方法
-
错误的
Dlookup
条件。您要使用与SecLevel
中存储的相同的Switchboard Item
来获取Item Number
的{{1}}。使用:TempVars!CurrentItemNumber.Value
或
DLookup("[SecLevel]","Switchboard Items","[Item Number] = TempVars!CurrentItemNumber.Value")
转换为True(如果 0,则获取所有值,因为所有行的条件都为true)ot False(如果= 0,则不获取任何值) -
错误事件。每次将表单记录集光标移动到另一个记录时,都会触发
TempVars!CurrentItemNumber.Value
事件。要在表单启动时执行代码,如果您不需要绑定查询/字段中的值(例如,检查特权并在特权不足时将其关闭),请使用Form_Current
,因为它会在获取数据之前触发。 但是当您需要Form_Open
使用[ItemNumber].Value
事件时(加载带有数据的表单时会触发。 -
在连续的Form上,Details-Section中的控件将为每条记录复制,但名称仍相同。在
Form_Load
事件中,Form_Current
始终引用实际选择的行中的控件。所有其他副本均不受影响。 要解决此问题,请使用Conditional Formatting或使用Me.OptionLabel1
事件。
其他一些改进可以是:
-
如果您知道控件名称,则无需循环整个Controls集合,只需使用
Detail_Paint
进行引用即可。 -
使用Select Case来区分表达式的不同值。例如
Me.Controls("NameOfControl")
如果设置了常规的Option Compare Database,请注意不区分大小写的字符串比较。
-
使用正确的命名约定!甚至您似乎都不会倾向于丑陋的ungarian符号
Select Case DLookup("[SecLevel]","[Item Number] = " & TempVars!CurrentItemNumber.Value) Case "Admin" ' ' code on Admin here Case "Operator" ' code on Operator here Case Else ' code executed if no match in cases End Select
是一个很差的标识符,没有告诉我们任何有用的东西。有关一些良好的信息,请参见variable names(也请检查网站的其余部分,因为它包含很多好的建议!)。在表/字段名称中,避免使用特殊字符,只需使用字母,数字和下划线,则不需要方括号!还习惯于重命名从查询/表中删除的控件,否则控件和数据字段的名称相同,这可能会引起麻烦!关于vba编码的另一个重要资源是RubberduckVBA插件(尝试:))和他们的博客。即使他们非常关注Excel,也没有更好的资源来学习OOP vba编码。也许从bad habbits开始,然后继续在您喜欢的位置(我建议OOP Battleship Part 1: The Patterns)