使用DLookup将全局变量名(字符串)返回到赋予.BackColor(long)属性的RHS时,我收到类型不匹配错误。
如何通过记录查找(string
)传递变量名称(text
/ DLookup
)并在表达式的RHS上评估其内容。
“告诉我名称与此字符串”
匹配的变量的值我尝试了各种版本的转义(使用"
或'
),评估(使用Eval()
),类型转换(使用Clng
和Cstr
),并检查适当的范围,但没有成功。请参阅“调试立即输出”部分
从下面的代码中,特别是这一行:Me.cboSelect.BackColor = DLookup("[BackColor]", "myTable", "[myTableID] = " & Me.cboSelect.value)
如果Me.cboSelect.value=1
代码因类型不匹配而中断。
如果Me.cboSelect.value=2
,则代码可以正常运行。
我想在我的表中定义一些我可以存储的常见颜色(作为全局变量名而不是晦涩的数字代码)以及需要突出显示的数据。我不想使用条件格式,因为每个表单都需要使用GUI来设置条件,我更喜欢使用VBA进行突出显示以及表单中的数据输入(这也会导致更一致的用户界面。
基本上我希望能够存储全局变量名称和我的数据。即使有更好的解决方案在VBA中进行条件格式化,我仍然想知道如何通过记录查找传递变量名称并评估其内容。
myTableID(autoNum) mainData Backcolor(text)
1 "str1" glngOrange
2 "str2" 52479
Global glngOrange As Long
Public Sub initGlobals()
glngOrange = RGB(255, 204, 0) ' 52479
End Sub
Private Sub Form_Open(Cancel As Integer)
Call initGlobals
End Sub
Private Sub cboSelect_LostFocus()
Debug.Print "A) Check that global is in scope. glngOrange = ", glngOrange
Debug.Print "B) Dlookup ", DLookup("[BackColor]", "myTable", "[myTableID] = " & Me.cboSelect.value)
Debug.Print "C) Type ", TypeName(DLookup("[BackColor]", "myTable", "[myTableID] = " & Me.cboSelect.value))
'The following line works if .value=2, fails if .value=1
Me.cboSelect.BackColor = DLookup("[BackColor]", "myTable", "[myTableID] = " & Me.cboSelect.value)
End Sub
A) Check that global is in scope. glngOrange = 52479
B) Dlookup glngOrange
C) Type String
答案 0 :(得分:1)
看起来你正在尝试像"给我一个名称与此字符串匹配的变量的值" 。
在这条路上,我建议你考虑一种不同的方法。
使用Scripting.Dictionary
代替一组全局变量,Dim dct As Object
Set dct = CreateObject("Scripting.Dictionary")
dct.Add "glngOrange", 52479
' and so forth ...
' later you can retrieve the number associated with a given key ...
Debug.Print dct("glngOrange")
将您的名称作为其键,相应的数字作为其值。
{{1}}
答案 1 :(得分:1)
HansUp已经为您的问题提供了一个时尚的解决方案。我个人会编辑 myTable ,为表示颜色名称的实际长号添加另一个字段。这将使您有机会远程控制颜色代码(如果表是链接表,则为。)
回答您的上一个问题如何将字符串/文本转换为vba代码。一种方法是使用" Microsoft Visual Basic For Applications可扩展性库"构造和执行(.Run)字符串到vba代码。
在此处阅读更多内容:http://www.cpearson.com/excel/vbe.aspx