【问题标题】:MS Access VBA call sub works on the first pass but not on the secondMS Access VBA 调用子程序在第一遍有效,但在第二遍无效
【发布时间】: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吗?
  • 这是最简单优雅的解决方案,@Rene
  • Rene,这正是我一直在寻找的东西,而我这辈子都想不通。非常感谢。

标签: sql vba ms-access


【解决方案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。
    猜你喜欢
    • 2019-06-07
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多