Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何修复“438-对象不支持属性或方法错误”_Vba_Ms Access - Fatal编程技术网

Vba 如何修复“438-对象不支持属性或方法错误”

Vba 如何修复“438-对象不支持属性或方法错误”,vba,ms-access,Vba,Ms Access,我在access数据库中包含了一个审计跟踪代码,可以调用到两个不同的表单。对于其中一种形式,代码运行良好,但在另一种形式中,它会产生438错误 -使用相同的参数调用两种形式的代码 -调试器突出显示这一行:“如果Nzctl.Value Nzctl.OldValue,则 -我试图注释掉调用该过程的代码,问题似乎出在参数SingleName上 -我已经检查了文本框的控制源和名称,它们看起来都是正确的 Sub AuditChanges(IDField As String, UserAction As S

我在access数据库中包含了一个审计跟踪代码,可以调用到两个不同的表单。对于其中一种形式,代码运行良好,但在另一种形式中,它会产生438错误

-使用相同的参数调用两种形式的代码 -调试器突出显示这一行:“如果Nzctl.Value Nzctl.OldValue,则 -我试图注释掉调用该过程的代码,问题似乎出在参数SingleName上 -我已经检查了文本框的控制源和名称,它们看起来都是正确的

Sub AuditChanges(IDField As String, UserAction As String)
    On Error GoTo AuditChanges_Err
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim ctl As Control
    Dim datTimeCheck As Date
    Dim strUserID As String
    Set cnn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open "SELECT * FROM TBL_AuditTrail", cnn, adOpenDynamic, 
adLockOptimistic
    datTimeCheck = Now()
    strUserID = Environ("USERNAME")
    Select Case UserAction
        Case "EDIT"
            For Each ctl In Screen.ActiveForm.Controls
                If ctl.Tag = "Audit" Then
                    If Nz(ctl.Value) <> Nz(ctl.OldValue) Then
                        With rst
                            .AddNew
                            ![DateTime] = datTimeCheck
                            ![UserName] = strUserID
                            ![FormName] = Screen.ActiveForm.Name
                            ![Action] = UserAction
                            ![RecordID] = 
Screen.ActiveForm.Controls(IDField).Value
                            ![FieldName] = ctl.ControlSource
                            ![OldValue] = ctl.OldValue
                            ![NewValue] = ctl.Value
                           .Update
                        End With
                    End If
                End If
           Next ctl
        Case Else
            With rst
               .AddNew
               ![DateTime] = datTimeCheck
               ![UserName] = strUserID
               ![FormName] = Screen.ActiveForm.Name
               ![Action] = UserAction
               ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                .Update
            End With
    End Select
AuditChanges_Exit:
    On Error Resume Next
    rst.Close
    cnn.Close
    Set rst = Nothing
    Set cnn = Nothing
    Exit Sub
AuditChanges_Err:
    MsgBox Err.Number & Err.Description
    Resume AuditChanges_Exit
End Sub





Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.NewRecord Then
        Call AuditChanges("SingleName", "NEW")
    Else
        Call AuditChanges("SingleName", "EDIT")
    End If
End Sub
表单的BeforeUpdate事件应该调用该过程,并将任何更改、删除或添加发送到TBL_AuditTrail。 输入数据并尝试保存后,出现438错误。
信息仍然被发送到表TBL_AuditTrail

,而没有看到这三个表单,我只能说Screen.ActiveForm.ControlsIDField字段上有所不同。我会比较所有三个字段的属性,看看失败的字段有什么不同。

未绑定控件没有OldValue属性。你可以检查一下:

If ctl.ControlSource <> "" Then
    ![OldValue].Value = ctl.OldValue
Else
    ' Skip unbound control.
End If

好的,它在哪个控件上?这个控件与其他控件有什么不同吗?我在两个控件上试用了它,因为我需要在多个控件上添加审计标记。不过,两者都是文本框。我尝试比较属性,看看是否可以识别任何差异,但没有发现任何差异。尝试了此操作,但不幸的是,我仍然收到错误消息。我也在旧版本的数据库中尝试了该表单,并且审计跟踪在那里工作。然后我尝试导入表单并更新控件。名称发生了一些更改,但它不起作用。然后我尝试将精确的控件添加到另一个窗体,它在那里工作,然后我将控件复制到有问题的窗体,但随后我得到了错误。所以,我猜问题不在于控件,而在于查询。这可能是它吗?它不是查询,从同一个查询中创建了一个虚拟表单,它一个接一个地删除控件,直到错误消失。然后调查上次移动的控制装置。谢谢古斯塔夫!这正是我的想法,所以我正在做这件事。似乎至少有2个控件对其产生影响。我会在找到原因后更新帖子。尝试过这个,但是没有什么突出的地方。你可以发布一个有效而另一个无效属性的截图吗?很遗憾,我无法发布截图。网站上说我的图片必须至少是10分。当你说什么都不突出时,这是否意味着有一些差异看起来并不显著,或者你没有看到任何差异?表单本身的属性略有不同,因为有问题的表单有一个附加的事件过程。当涉及控件时,有问题表单的文本框没有事件过程,但有效的文本框有4个事件过程。