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].Valuewith[Forms]![Portal_02_Cut]![WO_Num].Text。在 KeyUp-Event 中可能没有设置 Value 属性,但是如果您使用该按钮,则控件会失去焦点。值设置为.Text。

以上是关于MS Access VBA 调用子程序在第一遍有效,但在第二遍无效的主要内容,如果未能解决你的问题,请参考以下文章

VBA (Ms-Access) 从宏调用成员函数

MS Access VBA 和 SQL Server - 记录集更新时 ODBC 调用失败

MS Access VBA,只有在所有必需的文本框都包含有效数据后才启用按钮的有效方法

如何在 MS Access 应用程序中每周的特定时间之间运行我的 VBA 代码

VBA 导入 MS Access 到 MS Word

在 MS Access (VBA) 中使用 ADODB 将非 ASCII 插入 MySQL 数据库时出现“不正确的字符串值”,但重试有效