MS Access VBA 调用子程序在第一遍有效,但在第二遍无效
Posted
技术标签:
【中文标题】MS Access VBA 调用子程序在第一遍有效,但在第二遍无效【英文标题】:MS Access VBA call sub works on the first pass but not on the second 【发布时间】:2020-01-01 23:04:02 【问题描述】:我碰壁了,完全不知所措。
所以我在 MS Access 中有一个表单。其中我有一个文本框和一个按钮。当我在文本框中输入一个数字然后单击按钮时,它会打开一个公共子程序,然后运行一些查询,更新数据库,显示一个文本框,然后清除文本框。这一切都很完美。
我的问题是尝试在文本框中按 Enter 来做完全相同的事情。最奇怪的是,代码在我打开表单后就可以正常工作,但是所有后续尝试都会出现以下错误,直到我关闭表单并重新打开它:
Data type mismatch in criteria expression.
对于我的生活,我无法弄清楚为什么它第一次做我想要的,然后在我身上分崩离析。
这是完整的 VBA 代码供参考:
Option Compare Database
Public Sub Cut_Update()
On Error GoTo Cut_Update_Err
DoCmd.OpenQuery "UPDATE_WIP_Cut", acViewNormal, acEdit
DoCmd.OpenQuery "UPDATE_LastRun", acViewNormal, acEdit
MsgBox "Database Updated"
[Forms]![Portal_02_Cut]![WO_Num].Value = ""
Cut_Update_Exit:
Exit Sub
Cut_Update_Err:
MsgBox Error$
Resume Cut_Update_Exit
End Sub
'------------------------------------------------------------
' Return in Textbox
'
'------------------------------------------------------------
Private Sub WO_Num_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
Call Cut_Update
Me.Refresh
End If
End Sub
'------------------------------------------------------------
' Command2_Click
'
'------------------------------------------------------------
Private Sub Command2_Click()
Call Cut_Update
End Sub
【问题讨论】:
你是不是用断点调试,一步步运行每条语句?这会将问题缩小到特定的代码行。 你试过没有Me.Refresh
吗?
这能回答你的问题吗? Press enter in textbox and execute button function in VBA
这是最简单优雅的解决方案,@Rene
Rene,这正是我一直在寻找的东西,而我这辈子都想不通。非常感谢。
【参考方案1】:
您在表单中的调用之间唯一要做的事情是:
[Forms]![Portal_02_Cut]![WO_Num].Value = ""
所以,请尝试以下任何一种:
[Forms]![Portal_02_Cut]![WO_Num].Text = ""
或:
[Forms]![Portal_02_Cut]![WO_Num].Value = Null
【讨论】:
【参考方案2】:我唯一的猜测是更新尝试使用非数值进行更新。 告诉我
Option Compare Database
Public Sub Cut_Update()
On Error GoTo Cut_Update_Err
'' Make sure it is numeric
If IsNumeric([WO_Num].Value) Then
DoCmd.OpenQuery "UPDATE_WIP_Cut", acViewNormal, acEdit
DoCmd.OpenQuery "UPDATE_LastRun", acViewNormal, acEdit
MsgBox "Database Updated"
[Forms]![Portal_02_Cut]![WO_Num].Value = ""
End If
Cut_Update_Exit:
Exit Sub
Cut_Update_Err:
MsgBox Error$
Resume Cut_Update_Exit
End Sub
'------------------------------------------------------------ ' Return in Textbox '
'------------------------------------------------------------
Private Sub WO_Num_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
Call Cut_Update
Me.Refresh
End If
End Sub
'------------------------------------------------------------ ' Command2_Click '
'------------------------------------------------------------
Private Sub Command2_Click()
Call Cut_Update
End Sub
【讨论】:
好吧,这让我更接近了。因此,当我添加您的小支票时,我能够像以前一样第一次运行它。当我输入数字然后按Enter键时它清除后,它只会突出显示文本。如果我再次按回车,它会成功运行代码。不知道为什么它必须让我两次回车....已经很晚了,但我可能会看看我明天是否可以通过循环蛮力通过。 比较[Forms]![Portal_02_Cut]![WO_Num].Value
with[Forms]![Portal_02_Cut]![WO_Num].Text
。在 KeyUp-Event 中可能没有设置 Value 属性,但是如果您使用该按钮,则控件会失去焦点。值设置为.Text。以上是关于MS Access VBA 调用子程序在第一遍有效,但在第二遍无效的主要内容,如果未能解决你的问题,请参考以下文章
MS Access VBA 和 SQL Server - 记录集更新时 ODBC 调用失败
MS Access VBA,只有在所有必需的文本框都包含有效数据后才启用按钮的有效方法
如何在 MS Access 应用程序中每周的特定时间之间运行我的 VBA 代码
在 MS Access (VBA) 中使用 ADODB 将非 ASCII 插入 MySQL 数据库时出现“不正确的字符串值”,但重试有效