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

VBA代码出现End With/End If编译错误,求修正方案

修正VBA编译错误:解决「End With without With」/「End If without If」问题

修正后的完整代码

Sub ProcessOutgoingSheets()
    Dim wsACH As Worksheet, wsWire As Worksheet
    Dim wsOutgoing As Worksheet
    Dim isACHEmpty As Boolean, isWireEmpty As Boolean
    
    ' 尝试获取目标工作表
    On Error Resume Next
    Set wsACH = ThisWorkbook.Worksheets("OUTGOING ACH")
    Set wsWire = ThisWorkbook.Worksheets("OUTGOING WIRE")
    On Error GoTo 0
    
    ' 判断工作表是否为空(基于UsedRange,可按需调整判断逻辑)
    isACHEmpty = (wsACH Is Nothing) Or (wsACH.UsedRange.Cells.Count = 1 And IsEmpty(wsACH.UsedRange.Value))
    isWireEmpty = (wsWire Is Nothing) Or (wsWire.UsedRange.Cells.Count = 1 And IsEmpty(wsWire.UsedRange.Value))
    
    ' 情况1:两表均为空
    If isACHEmpty And isWireEmpty Then
        If Not wsACH Is Nothing Then wsACH.Delete
        If Not wsWire Is Nothing Then wsWire.Delete
        MsgBox "两个OUTGOING工作表均为空,已全部删除"
        Exit Sub
    End If
    
    ' 情况2:仅ACH非空
    If Not isACHEmpty And isWireEmpty Then
        ' 格式化操作示例
        With wsACH
            .Columns("A:Z").AutoFit
            .Range("A1").Font.Bold = True
            ' 可添加更多格式化代码
        End With
        wsACH.Name = "OUTGOING"
        If Not wsWire Is Nothing Then wsWire.Delete
        Exit Sub
    End If
    
    ' 情况3:仅WIRE非空
    If isACHEmpty And Not isWireEmpty Then
        ' 格式化操作示例
        With wsWire
            .Columns("A:Z").AutoFit
            .Range("A1").Font.Bold = True
            ' 可添加更多格式化代码
        End With
        wsWire.Name = "OUTGOING"
        If Not wsACH Is Nothing Then wsACH.Delete
        Exit Sub
    End If
    
    ' 情况4:两表均非空
    If Not isACHEmpty And Not isWireEmpty Then
        ' 格式化ACH表
        With wsACH
            .Columns("A:Z").AutoFit
            .Range("A1").Font.Bold = True
            ' 可添加更多格式化代码
        End With
        ' 格式化WIRE表
        With wsWire
            .Columns("A:Z").AutoFit
            .Range("A1").Font.Bold = True
            ' 可添加更多格式化代码
        End With
        
        ' 合并WIRE数据到ACH(跳过表头)
        wsWire.UsedRange.Offset(1).Copy Destination:=wsACH.Cells(wsACH.Rows.Count, "A").End(xlUp).Offset(1)
        
        wsACH.Name = "OUTGOING"
        wsWire.Delete
        MsgBox "两个OUTGOING工作表已合并为OUTGOING"
    End If
End Sub

错误原因说明

原代码的编译错误本质是嵌套结构闭合顺序混乱,常见诱因包括:

  • With块未完整闭合就提前写入End With,或多层With嵌套层级错位
  • If语句的分支未一一对应End If,比如漏写/多写闭合语句,或内层If未先闭合就闭合外层If
  • 跳转语句(如GoTo)打乱了代码结构,导致编译器无法识别闭合关系

修正后的代码把逻辑拆分为四个互斥分支,每个分支内的With/If都严格一一对应,避免了深层嵌套,同时清晰实现了需求:

  1. 先判断工作表的存在性与空表状态
  2. 分场景处理空表删除、单表格式化重命名、双表合并等操作
  3. 所有代码块的闭合语句与起始语句严格匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:32:15