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

VBA填充公式时出现Application-defined或object-defined错误的解决方法

VBA宏公式赋值报错修复方案

错误原因分析

触发"Application-defined or object-defined error"的核心问题有两个:

  1. 公式字符串语法错误:原代码中COUNTIFS的<>条件拼接方式错误,导致生成的Excel公式不符合语法规范
  2. 最后一行行数取值错误:使用源工作表的最后一行来计算目标工作表的填充范围,两者行数不匹配,可能引发范围越界问题

具体修复步骤

1. 修正BG列公式的字符串拼接

原错误代码:

wsDest.Range("BG5").Formula = "=IF(COUNTIFS(K:K,K5,M:M,""<>" & M5 & ")=0,""1 supplier"",""Multi"")"

修正后代码(确保公式中<>与单元格引用的拼接符合Excel语法,同时正确转义双引号):

wsDest.Range("BG5").Formula = "=IF(COUNTIFS(K:K,K5,M:M,""<>" & M5 & """)=0,""1 supplier"",""Multi"")"

2. 修正lastRow的取值逻辑

原代码取源工作表的最后一行,改为取目标工作表的实际数据最后一行(以BF列为准):

lastRow = wsDest.Cells(wsDest.Rows.Count, "BF").End(xlUp).Row

3. 可选优化:替代AutoFill提升效率

可以直接给整个目标区域赋值公式,避免AutoFill的潜在问题,同时提升执行效率:

wsDest.Range("BG5:BG" & lastRow).Formula = "=IF(COUNTIFS(K:K,K5,M:M,""<>" & M5 & """)=0,""1 supplier"",""Multi"")"
wsDest.Range("BH5:BH" & lastRow).Formula = "=IFERROR(MID($K5,FIND(""/"",$K5)+1,100),"""")"

完整修正后的代码

Sub FillFormulas()
Dim wbCreatingReports As Workbook
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim wsDestPlant As Worksheet
Dim filterValue As Variant
Dim lastRow As Long
Dim destFolder As String
Dim destFile As String
Dim wbDest As Workbook ' 补充声明遗漏的变量

' 打开"Creating reports"工作簿
Set wbCreatingReports = ThisWorkbook

' 打开数据源工作簿
Set wsSource = Workbooks.Open(ThisWorkbook.Path & "\07 Step ME External Production material_report.xlsx").Worksheets("Local_Currency")

' 设置目标文件夹路径
destFolder = ThisWorkbook.Path & "\Final reports\"

' 遍历目标文件夹中的所有Excel文件
destFile = Dir(destFolder & "*.xlsx")
Do While destFile <> ""
    ' 打开目标工作簿
    Set wbDest = Workbooks.Open(destFolder & destFile)
    ' 指定目标工作表
    Set wsDest = wbDest.Worksheets("PPF_Local_CY")
    Set wsDestPlant = wbDest.Worksheets("Cover")
    ' 获取筛选值(目标工作簿Cover表C10单元格)
    filterValue = wsDestPlant.Range("C10").Value
    
    ' 对源数据进行筛选(第7列)
    wsSource.AutoFilterMode = False
    wsSource.Range("A1:BF100000").AutoFilter Field:=7, Criteria1:=filterValue
    
    ' 复制筛选后的可见数据到目标工作表(从A5开始)
    wsSource.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy wsDest.Range("A5")
    
    ' 计算目标工作表BF列的最后一行
    lastRow = wsDest.Cells(wsDest.Rows.Count, "BF").End(xlUp).Row
    
    ' 批量填充BG列公式
    wsDest.Range("BG5:BG" & lastRow).Formula = "=IF(COUNTIFS(K:K,K5,M:M,""<>" & M5 & """)=0,""1 supplier"",""Multi"")"
    
    ' 批量填充BH列公式
    wsDest.Range("BH5:BH" & lastRow).Formula = "=IFERROR(MID($K5,FIND(""/"",$K5)+1,100),"""")"
    
    ' 取消源工作表的筛选
    wsSource.AutoFilterMode = False
    
    ' 保存并关闭目标工作簿
    wbDest.Close SaveChanges:=True
    
    ' 获取下一个文件
    destFile = Dir
Loop
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:32:05