结束 IF 没有块 IF 编译错误

Posted

技术标签:

【中文标题】结束 IF 没有块 IF 编译错误【英文标题】:End IF without block IF compile error 【发布时间】:2018-06-11 06:09:37 【问题描述】:

我正在尝试运行此宏以在删除行后将数据上移到多张工作表上。我不断收到编译错误

如果没有阻塞则结束

这是我的 VBA 代码:

Sub shiftmeup()
    Dim ws As Worksheet
    Dim wb As Workbook
    Set wb = ThisWorkbook
    Set ws = wb.Sheets("contactunder") '/// The underhood of my contacts
    Set ws1 = wb.Sheets("Deposits")
    Set ws2 = wb.Sheets("Lending")
    Set ws3 = wb.Sheets("Client Notes")

    With ws.Range("D11:BJ392")
        For i = .Rows.Count To 1 Step -1
            If IsEmpty(.Cells(i, 1)) Then .Rows(i).Delete Shift:=xlUp
        Next

    With ws1.Range("E11:l392")
        For i = .Rows.Count To 1 Step -1
            If IsEmpty(.Cells(i, 1)) Then .Rows(i).Delete Shift:=xlUp
        Next


    With ws2.Range("E11:Y392")
        For i = .Rows.Count To 1 Step -1
            If IsEmpty(.Cells(i, 1)) Then .Rows(i).Delete Shift:=xlUp
        Next

    With ws3.Range("E11:E392")
        For i = .Rows.Count To 1 Step -1
            If IsEmpty(.Cells(i, 1)) Then .Rows(i).Delete Shift:=xlUp

            End If
        Next
    End With
End Sub

【问题讨论】:

总是正确地格式化和缩进你的代码,否则你看不到你的问题(我在你的问题中为你做了)。现在您看到前 3 个With 没有End With。还有一个End If 太多了,因为你所有的If 语句都是1-liners,然后不需要End If。 • 此外,我建议使用描述性变量名称而不是ws1ws2、... +前三个if也没有end if @Pierre44 1-liner If 语句不允许有End If。第4个With中的End If太多了,需要去掉。 @Pᴇʜ 你是对的,先生。我删除了最后一个 End if 并在最后添加了 3 个“End With”,我的代码现在运行正确!感谢您的所有帮助! 【参考方案1】:

始终正确格式化和缩进你的代码,否则你看不到你的问题(我在你的问题中为你做了)。

现在您看到前 3 个With 没有End With。每个With 都需要自己的End With

还有一个 End If 太多了,因为你所有的 If 语句都是 1-liners,然后不需要 End If

If 语句有 2 种类型:

    1-liners If … Then … Else

    If IsEmpty(.Cells(i, 1)) Then .Rows(i).Delete Shift:=xlUp
    

    请注意,在 1 行语句中不允许使用 End If

    多衬

    If IsEmpty(.Cells(i, 1)) Then 
        .Rows(i).Delete Shift:=xlUp
    End If
    

你不能混合它们。


此外,我建议使用描述性变量名,而不是 ws1ws2,... 这使您的代码更具可读性和可维护性。

【讨论】:

感谢您的帮助和解释!代码现在工作正常【参考方案2】:

@Peh 已经告诉过你你的问题

这是您的代码的可能重构

首先,将重复性任务分配给特定的例程:

Sub DeleteSheetRows(rng As Range)
    If WorksheetFunction.CountBlank(rng) > 0 Then rng.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

然后从您的“主”代码中调用该特定例程:

Sub shiftmeup()
    Dim ws As Worksheet
    Dim sheetNames As Variant, rangeAddresses As Variant
    Dim i As Long

    sheetNames = Array("contactunder", "Deposits", "Lending", "Client Notes")
    rangeAddresses = Array("D11:BJ392", "E11:l392", "E11:Y392", "E11:E392")

    With ThisWorkbook ' reference desired workbook
        For i = 1 To UBound(sheetNames) ' loop through sheet names
            DeleteSheetRows .Worksheets(sheetNames(i)).Range(rangeAddresses(i)) ' call rows deleting routin passing current worksheet proper range
        Next
    End With
End Sub

【讨论】:

我喜欢您对我的模块的编辑,它的代码更少,并且通过数组调用多个工作表。我也试试看!

以上是关于结束 IF 没有块 IF 编译错误的主要内容,如果未能解决你的问题,请参考以下文章

C 语言中#if 0

remove_if() 编译错误

编译器错误`在if语句中分配不兼容的类型`[重复]

为啥没有返回语句时没有编译器错误?

为啥使用“if-else”语句会在看似相同的三元运算符构造不会产生 TypeScript 编译器错误?

为啥我的代码在 else 语句后出现编译错误?