Excel VBA报错:用户定义类型未定义——非宏运行时触发
Excel「用户定义类型未定义」错误排查与解决
问题现象
使用Excel工作簿时,并非运行ImportEOD宏时触发错误(该宏运行正常、功能完全符合预期),而是在任意工作表的单元格输入数据时,弹出「用户定义类型未定义」错误提示。已检查「工具/引用」无异常,将原始数据迁移至新工作簿并重新导入宏代码后,错误仍会复现。
错误原因分析
提供的ImportEOD宏代码中未使用自定义类型,因此问题不在该宏本身。触发错误的核心原因大概率是:
- 工作簿中存在工作表事件代码(如
Worksheet_Change、Worksheet_SelectionChange),且事件代码里包含未声明的自定义类型 - 隐藏的模块/类模块中存在未定义的类型声明
排查与解决步骤
- 检查工作表事件代码:右键点击任意工作表标签 → 查看代码,逐一检查所有工作表的事件过程,确认是否存在未定义的自定义类型声明(例如
Dim x As MyCustomType这类代码,其中MyCustomType未被定义) - 清理无效事件代码:如果发现事件代码中存在无用或错误的自定义类型声明,直接删除该代码;若事件代码是误添加的,可直接删除整个事件过程
- 检查所有VBA模块:打开VBA编辑器(快捷键Alt+F11),查看所有标准模块、类模块,确认是否有未定义的类型或引用问题
- 排除加载项冲突:暂时禁用所有Excel加载项(路径:文件→选项→加载项→转到),重新测试是否还会触发错误,排除第三方加载项导致的问题
提供的ImportEOD宏代码
Sub ImportEOD() Application.ScreenUpdating = False Dim wb As Workbook Set wb = Application.ActiveWorkbook Dim rd As Worksheet Set rd = wb.Sheets("RawData") Dim rdlr As Long If IsEmpty(rd.Range("A2")) Then rdlr = 3 Else: rdlr = rd.Range("A1").End(xlDown).Row End If Dim nwb As Workbook Set nwb = Application.Workbooks.Open(Filename:="S:\Hard Wired Measures.....DO NOT DELETE\Data Extracts\Power BI\EOD new data.xlsx") Dim ws As Worksheet Set ws = nwb.Sheets(1) Dim lr As Long lr = ws.Range("A1").End(xlDown).Row ws.Range("A1:BK" & lr).Sort Key1:=ws.Range("O1"), Order1:=xlAscending, Header:=xlYes Dim err As Integer err = Application.WorksheetFunction.CountIf(ws.Range("O2:O" & lr), "<1") If err > 0 Then Dim rngend As Integer rngend = err + 1 Dim rng As Range, cell As Range Set rng = ws.Range("O2:O" & rngend) For Each cell In rng If cell.Value < 1 Then cell.Offset(0, -4).Delete Shift:=xlToLeft End If Next cell End If ws.Range("AJ2:AJ" & lr).Replace What:=" Callout Only", Replacement:="", MatchCase:=False ws.Range("AJ2:AJ" & lr).Replace What:="Tanker Rate - ", Replacement:="" ws.Range("AJ2:AJ" & lr).Replace What:="QUOTED ", Replacement:="" ws.Range("AJ2:AJ" & lr).Replace What:="~*", Replacement:="" ws.Range("AJ2:AJ" & lr).Replace "`", "'" ws.Range("A1:BJ" & lr).Replace What:=" Quoted Works Only", Replacement:="" Dim dt As Date Dim dt2 As Date Dim dt3 As Date dt = Format(Application.WorksheetFunction.Min(ws.Range("P2:P" & lr)), "dd/mm/yyyy") dt2 = Format(DateSerial(Year(dt), Month(dt) + 1, 1), "dd/mm/yyyy") dt3 = Format(DateSerial(Year(dt), Month(dt) + 2, 1), "dd/mm/yyyy") wb.Activate rd.AutoFilterMode = False rd.Range("A1:BJ" & rdlr).AutoFilter Field:=16, Criteria1:=Array(Format(dt, "mmm-yy"), Format(dt2, "mmm-yy"), Format(dt3, "mmm-yy")), Operator:=xlFilterValues rd.Range("A1:BJ" & rdlr).Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Clear rd.AutoFilterMode = False rd.Range("A1:BJ" & rdlr).Sort Key1:=rd.Range("A1"), Order1:=xlAscending, Header:=xlYes rdlr = rd.Range("A1").End(xlDown).Row + 1 nwb.Activate ws.Range("A2:BJ" & lr).Copy Destination:=rd.Range("A" & rdlr) Application.DisplayAlerts = False nwb.Close Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
内容的提问来源于stack exchange,提问作者MatH
相关产品推荐
相关产品推荐

