Ms access VBA审核跟踪代码引发参数非可选错误

Ms access VBA审核跟踪代码引发参数非可选错误,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,我已经建立了一个数据库,下面的审计跟踪代码在Access 2010中完美地适用于表单和子表单。但是现在我在另一个数据库中再次使用它,我现在在第一次调用时得到一个错误“argumentnotoptional”。如果两个数据库都以相同的方式创建了子表单,为什么这在一个数据库中有效而在另一个数据库中无效?我不能得到数据库给我更多的信息以外的不是那么有用的错误代码。我最好的猜测是它与子培训ingentryauditchanges(IDField作为字符串,UserAction作为字符串,FormToAu

我已经建立了一个数据库,下面的审计跟踪代码在Access 2010中完美地适用于表单和子表单。但是现在我在另一个数据库中再次使用它,我现在在第一次调用
时得到一个错误“argumentnotoptional”。如果两个数据库都以相同的方式创建了子表单,为什么这在一个数据库中有效而在另一个数据库中无效?我不能得到数据库给我更多的信息以外的不是那么有用的错误代码。我最好的猜测是它与
子培训ingentryauditchanges(IDField作为字符串,UserAction作为字符串,FormToAudit作为表单)有关
,但我真的不知道。就像我说的,它在一个数据库中工作,但由于某种原因,它不能在这个数据库中工作。有什么想法吗

模块代码:

***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

调用例程时,如果该例程所需的参数数目不正确,则会抛出
参数Not Optional

在代码中

Sub TrainingEntryAuditChanges(IDField As String, UserAction As String, FormToAudit As Form)
需要三个参数,
IDField
UserAction
,和
FormToAudit

但是,在您的
通话中

Call TrainingEntryAuditChanges("ID", "NEW") ***ERROR THROWN HERE***
您只传递了两个参数:
ID
NEW
。您需要向它传递第三个参数(看起来它将是
表单
)。尝试使用
me
作为第三个参数来传递正在更新的“当前”表单,从而调用例程

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