结束 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
。 • 此外,我建议使用描述性变量名称而不是ws1
、ws2
、...
+前三个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
你不能混合它们。
此外,我建议使用描述性变量名,而不是 ws1
、ws2
,... 这使您的代码更具可读性和可维护性。
【讨论】:
感谢您的帮助和解释!代码现在工作正常【参考方案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 编译错误的主要内容,如果未能解决你的问题,请参考以下文章