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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:15:55