You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用VBA模块时提示“预期变量或过程,而非模块”问题求助

解决VBA调用自定义错误日志函数时的“预期变量或过程,而非模块”错误

嘿,我帮你捋捋这个问题——你碰到的这个错误,十有八九是模块名和函数名撞了,再加上你的错误处理代码里还有几个小语法问题,咱们一步步搞定:

1. 先解决最核心的重名问题

你把Allen Browne的LogError改成了logAutoErrors,但如果存放这个函数的模块也叫logAutoErrors,VBA就会搞混:它会把模块当成你要调用的对象,而不是里面的函数,直接就报“预期变量或过程,而非模块”了。

怎么改?

  • 打开VBA编辑器,找到装logAutoErrors函数的那个模块
  • 按F4调出属性窗口,把模块名改成比如modErrorHandling(随便起个和函数名不一样的就行)
  • 保存模块,然后按Ctrl+G打开立即窗口,输入Compile编译一下项目,确保没有编译错误

2. 修正错误处理流程里的语法bug

你的ImportAttendees_Click过程里有几个小问题,不修复的话就算重名问题解决了,代码也跑不对:

  • 多了个ErrorHandler:标签,和你定义的ImportAttendees_Click_Err冲突了
  • 你用了Resume Exit_ImportAttendees_Click,但根本没定义这个标签
  • 末尾莫名其妙多了个End Select,连对应的Select Case都没有,这会直接导致编译失败

给你改好的代码:

Private Sub ImportAttendees_Click()
On Error GoTo ImportAttendees_Click_Err

Dim SelectedFile As String
Dim FilePicker As FileDialog
Dim SQLdelete As String

Set FilePicker = Application.FileDialog(msoFileDialogFilePicker)
FilePicker.AllowMultiSelect = False
FilePicker.Filters.Add "Excel", "*.xls*", 1
FilePicker.InitialFileName = "C:\Users\"
FilePicker.Title = "Select New Attendee List Location..."
FilePicker.Show

If FilePicker.SelectedItems.Count <> 0 Then
    SelectedFile = FilePicker.SelectedItems(1)
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "tbl_STG_AttendeeImport", SelectedFile, True
    MsgBox prompt:="Data Staged - Ready For Import", buttons:=vbInformation, Title:="Data Loaded"
End If

Me.Refresh

' 定义退出标签,对应后面的Resume语句
Exit_ImportAttendees_Click:
    Exit Sub

' 错误处理的入口标签
ImportAttendees_Click_Err:
    MsgBox prompt:="E-Link encountered an error when processing the last action. E-Link has cancelled the last action and the error has been logged with the system administrator", buttons:=vbInformation, Title:="Database Process Error"
    ' 现在调用函数就不会报错了
    Call logAutoErrors(Err.Number, Err.Description, "ImportAttendees_Click()")
    Resume Exit_ImportAttendees_Click

End Sub

3. 最后检查错误日志表的兼容性

确保你的tbl_ADM_ErrorLog表结构和函数里的字段对应上:

  • ErrNumber:数字类型(用来存错误编号)
  • ErrDescription:文本类型,长度至少设255(函数里用了Left$(strErrDescription, 255))
  • ErrDate:日期/时间类型
  • CallingProc:文本类型(存出错的过程名)
  • UserID:和你的TempVars!AUID类型匹配,比如文本或数字
  • Parameters:可选文本类型,长度255就行

另外别忘了确认TempVars!AUID在调用这个函数之前已经被正确赋值了,不然可能会在写日志的时候出空值错误。

现在你再测试一下,比如故意搞个错误(比如选个格式不对的Excel文件),应该就能正常弹出提示,同时错误信息也会写到你的日志表里,流程也会正确终止啦。

内容的提问来源于stack exchange,提问作者Castiel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:37:58