VBA Audit Trail 代码抛出 Argument Not Optional 错误

VBA Audit Trail code throwing Argument Not Optional error

我已经建立了一个数据库,其中下面的审计跟踪代码对 Access 2010 中的表单和子表单都可以完美地工作。但是现在我在另一个数据库中再次使用它,我现在得到一个错误 "Argument Not Optional" 在第一个 Call。如果它们都以完全相同的方式创建子表单,为什么这会在一个数据库中工作而不在另一个数据库中工作?除了不太有用的错误代码之外,我无法让数据库给我更多信息。我最好的猜测是它与 Sub TrainingEntryAuditChanges(IDField As String, UserAction As String, FormToAudit As Form) 有关,但我无法确定。就像我说的,它在一个数据库中工作,但出于某种原因不适用于这个数据库。有什么想法吗?

模块代码:

***ABOVE CODE OMITTED INTENTIONALLY***
'Audit module code for employee training entry form's sub form
Sub TrainingEntryAuditChanges(IDField As String, UserAction As String, FormToAudit As Form)
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 tblAuditTrail", cnn, adOpenDynamic, adLockOptimistic
datTimeCheck = Now()
strUserID = Forms!Login!cboUser.Column(1)

'Get computer IP address
Dim myWMI As Object, myobj As Object, itm
Set myWMI = GetObject("winmgmts:\.\root\cimv2")
Set myobj = myWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True")
    For Each itm In myobj
        getMyIP = itm.IPAddress(0)
    Next

'If user is editing an existing record:
Select Case UserAction
    Case "EDIT"
        For Each ctl In FormToAudit
            If ctl.Tag = "Audit" Then
                If Nz(ctl.Value) <> Nz(ctl.OldValue) Then
                    With rst
                        .AddNew
                        ![DateTime] = datTimeCheck
                        ![UserName] = strUserID
                        ![UserComputer] = getMyIP
                        ![FormName] = FormToAudit.Name
                        ![Action] = UserAction
                        ![RecordID] = FormToAudit.Controls(IDField).Value
                        ![FieldName] = ctl.ControlSource
                        ![OldValue] = ctl.OldValue
                        ![NewValue] = ctl.Value
                        .Update
                    End With
                End If
            End If
        Next ctl

    'If a user is creating a new record:
    Case Else
        With rst
            .AddNew
            ![DateTime] = datTimeCheck
            ![UserName] = strUserID
            ![UserComputer] = getMyIP
            ![FormName] = FormToAudit.Name
            ![Action] = UserAction
            ![RecordID] = FormToAudit.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

'If error then:
AuditChanges_Err:
Dim strError As String
Dim lngError As Long
Dim intErl As Integer
Dim strMsg As String
strError = Err.Description
lngError = Err.Number
intErl = Erl
strMsg = "Line : " & intErl & vbCrLf & _
       "Error : (" & lngError & ")" & strError
MsgBox strMsg, vbCritical
Resume AuditChanges_Exit

End Sub

Before_Update 子表单上的代码:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.NewRecord Then
    Call TrainingEntryAuditChanges("ID", "NEW") ***ERROR THROWN HERE***
Else
    Call TrainingEntryAuditChanges("ID", "EDIT")
End If
End Sub

当您使用该例程所需的不正确数量的参数调用例程时,将抛出 Argument Not Optional

在你的代码中

Sub TrainingEntryAuditChanges(IDField As String, UserAction As String, FormToAudit As Form)

需要三个参数,IDFieldUserActionFormToAudit

但是,在您的 Call

Call TrainingEntryAuditChanges("ID", "NEW") ***ERROR THROWN HERE***

您只传递了两个参数:IDNEW。您需要向它传递第三个参数(看起来应该是 form)。尝试使用 me 作为第三个参数来传递正在更新的 'current' 表单,从而调用例程。