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

Excel导入时VBA运行时错误'91'的解决需求

解决VBA跨工作簿提取数据时的运行时错误'91'及缺失数据处理问题

问题根源

运行时错误'91'是因为Range.Find方法找不到匹配值时返回Nothing,此时直接访问rng.Row会触发对象变量未设置的错误。另外原代码未在每次循环初始化变量,导致找不到数据时会保留上一行的变量值,从而出现错误复制的情况。

修改后的代码

Option Explicit
Sub IMPORT()
    'DECLARE VARIABLES
    Dim job As String
    Dim engrdue, dftdue, engrout, dftout As String
    Dim engr, drafter, tosales, PM As String
    Dim loaddate, shopdate, detailer, rapp As String
    Dim atype, edwgs, AB As String
    Dim i As Integer
    Dim rng As Range
    Dim rng2 As Range
    Dim rng3 As Range
    Dim wsTarget As Worksheet
    
    ' 简化目标工作表引用,减少重复代码
    Set wsTarget = Workbooks("PROJECT MANAGEMENT MATRIX A.xlsm").Worksheets("MASTER SCHEDULE")
    
    'CLEAR CELLS - 合并连续范围,简化代码
    wsTarget.Range("B2:F40,H2:J40,K2:N40,P2:Q40").ClearContents
    
    'OPEN WORKBOOKS - 添加容错,避免文件不存在直接崩溃
    On Error Resume Next
    Workbooks.Open ("S:\Scheduling\ASI Master Schedule\ASI Master Schedule.xlsx")
    Workbooks.Open ("S:\Drafting_Detailing\CCCCC_\CCCCC99.xls")
    Workbooks.Open ("S:\Scheduling\ASI Master Schedule\DAILYTONNAGELOG.xls")
    On Error GoTo 0
    
    'SET VARIABLES
    For i = 2 To 40
        ' 初始化所有变量为"No data",确保缺失时显示统一内容
        engrdue = "No data"
        dftdue = "No data"
        engrout = "No data"
        dftout = "No data"
        engr = "No data"
        drafter = "No data"
        tosales = "No data"
        PM = "No data"
        loaddate = "No data"
        shopdate = "No data"
        detailer = "No data"
        rapp = "No data"
        atype = "No data"
        edwgs = "No data"
        AB = "No data"
        
        job = wsTarget.Cells(i, "A").Value
        ' 跳过空job行
        If job = "" Then GoTo NextRow
        
        ' 查找ASI Master Schedule中的job,精确匹配
        Set rng = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Range("R:R").Find(job, LookIn:=xlValues, LookAt:=xlWhole)
        If Not rng Is Nothing Then
            tosales = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "CH").Value
            PM = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "BH").Value
            loaddate = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "L").Value
            shopdate = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "DD").Value
            detailer = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "DB").Value
            rapp = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "CW").Value
            engrdue = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "CJ").Value
            engrout = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "CK").Value
            engr = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "CL").Value
            dftdue = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "CN").Value
            dftout = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "CO").Value
            drafter = Workbooks("ASI Master Schedule.xlsx").Worksheets("Master Schedule").Cells(rng.Row, "CP").Value
        End If
        
        ' 查找CCCCC99.xls中的job,精确匹配
        Set rng2 = Workbooks("CCCCC99.xls").Worksheets("JOB INFO").Range("A:A").Find(job, LookIn:=xlValues, LookAt:=xlWhole)
        If Not rng2 Is Nothing Then
            AB = Workbooks("CCCCC99.xls").Worksheets("JOB INFO").Cells(rng2.Row, "X").Value
            atype = Workbooks("CCCCC99.xls").Worksheets("JOB INFO").Cells(rng2.Row, "AC").Value
            edwgs = Workbooks("CCCCC99.xls").Worksheets("JOB INFO").Cells(rng2.Row, "Y").Value
        End If
        
        ' 赋值到目标工作表
        wsTarget.Cells(i, "B") = tosales
        wsTarget.Cells(i, "Q") = PM
        wsTarget.Cells(i, "P") = loaddate
        wsTarget.Cells(i, "O") = shopdate
        wsTarget.Cells(i, "N") = detailer
        wsTarget.Cells(i, "L") = rapp
        wsTarget.Cells(i, "M") = atype
        wsTarget.Cells(i, "C") = engrdue
        wsTarget.Cells(i, "D") = engrout
        wsTarget.Cells(i, "E") = engr
        wsTarget.Cells(i, "F") = dftdue
        wsTarget.Cells(i, "H") = AB
        wsTarget.Cells(i, "I") = dftout
        wsTarget.Cells(i, "J") = drafter
        wsTarget.Cells(i, "K") = edwgs
        
NextRow:
    Next i

End Sub

关键修改说明

  • 变量初始化:每次循环开始时将所有字段变量设为"No data",确保找不到数据时不会保留上一行的值
  • 空job跳过:如果目标工作表A列当前行是空,直接跳过该行处理
  • Find结果判断:对每个Range.Find的结果用If Not rng Is Nothing Then判断,只有找到匹配值时才赋值,彻底避免错误91
  • 简化代码:用变量wsTarget指代目标工作表,减少重复的长路径引用;合并连续的单元格清除范围,让代码更简洁
  • 文件打开容错:添加简单的错误处理,避免文件不存在时直接崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:52:00