Kag*_*nar 5 ms-access vba access-vba
我编写了一个表单,在文本输入文本框时异步执行查询,但是我有点随意地抛出以下错误:"除非控件具有焦点,否则无法引用控件的属性或方法."
直接相关的代码是:
Dim UpdateRequested As Boolean
Dim qryText As String
.
.
.
Private Sub txtBox_Change()
qryText = txtBox.Text
UpdateRequested = true
End Sub
Run Code Online (Sandbox Code Playgroud)
省略号中的一些位置是处理动态加载ADODB记录集,填充本地表和刷新子表单的代码.但是,即使我禁用此代码,问题仍然存在:有时我得到错误.有时我没有.
通过关闭数据库并重新打开它似乎是持久的.每次它再次开始工作时,都是因为我一直在调试器中使用代码,但我不确定究竟是什么导致它神奇地"正常工作"或导致它根本无法工作的原因.
为了让事情更令人费解,我添加了几个简单的事件处理程序:
Private Sub txtBox_GotFocus()
MsgBox "Got focus"
End Sub
Private Sub txtBox_LostFocus()
MsgBox "Lost focus"
End Sub
Run Code Online (Sandbox Code Playgroud)
我运行表格.我点击测试框.我收到"有焦点"的消息.一旦我输入,我就会看到如上所述的错误.如果我重新打开表单,我可以在有问题的文本框(它本身是未绑定的)和子表单中的绑定文本框之间单击,并且可以看到"获得焦点"和"丢失焦点"消息.此外,显示一个当前值为"Screen.ActiveControl.Name"的消息框显示了访问Text属性之前的预期名称.
小智 6
我知道这是一个旧线程,但它是我遇到同样问题时发现的第一个.除了Kaganar自己的解决方案之外,没有任何答案有所帮助,这使我指向了正确的方向.我猜测人们在复制错误时遇到麻烦的原因是Kaganar的描述中缺少一些重要的细节:
因为我相信完整的答案是......
当表单具有没有要编辑的记录的记录源时,任何控件的Text属性都是不可访问的
我认为有部分Access没有意识到文本框存在:)要了解它可能会如何发生...
嘿presto!没有文字框.
退回记录,或允许添加,或删除记录源,等等!你的文本框有文字.
我添加了一个名为txtFoomy form 的文本框.以下是其更改事件的过程.
Private Sub txtFoo_Change()
Debug.Print "Value: " & Nz(Me.txtFoo.value, "*Null*") & _
"; Text: " & Nz(Me.txtFoo.Text, "*Null*")
End Sub
Run Code Online (Sandbox Code Playgroud)
然后,txtFoo当我输入"abc"时,没有任何内容(IOW,其值为Null)txtFoo,这是我在立即窗口中看到的内容.
Value: *Null*; Text: a
Value: *Null*; Text: ab
Value: *Null*; Text: abc
Run Code Online (Sandbox Code Playgroud)
基本上,我添加到文本框的每个字符都会触发其更改事件,并将文本框的当前内容打印到立即窗口.
据我所知,你想做类似的事情...除了你想要一个不同的行动代替Debug.Print.再看看你的变更事件程序,并将其与我的进行比较.
Private Sub txtBox_Change()
qryText = txtVendorName.Text
UpdateRequested = true
End Sub
Run Code Online (Sandbox Code Playgroud)
这是名为的控件的更改事件txtBox.在该过程中,您引用.Text名为的控件的属性txtVendorName.但是txtBox,它的更改事件代码运行时是活动控件...因此您无法访问.Text属性,txtVendorName因为它不是活动控件.
鉴于此问题只针对一个表单,而不是其他新表单,我怀疑问题表单已损坏.阅读这个SO问题的2个答案,并尝试反编译以治愈腐败:如何反编译和重新编译.在开发过程中,通常建议将反编译作为常规实践.
您还可以使用未记录的Application.SaveAsText方法将表单另存为文本文件.删除错误的表单,然后使用Application.LoadFromText导入保存的文本副本.
确保您有db文件的备份副本,以防出现任何问题.