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