我创建了一个宏,它调用另一个宏,然后在从工作表 4 开始的每个工作表上运行。该宏在第一个工作表(工作表 4)上运行,但不会在所有其他工作表上运行。
从工作表 4 开始循环遍历所有工作表的初始宏是:
Sub DeleteLoop()
Dim WS_Count As Integer
Dim i As Integer
If MsgBox("Do you want to continue", vbYesNo, "User Input") = vbNo Then
Exit Sub
Else
If MsgBox("Are you sure? Have you taken a backup of your spreadsheet?", vbYesNo, "User Input") = vbNo Then
Exit Sub
Else
ActiveWorkbook.Worksheets(4).Activate
For i = ActiveSheet.Index To Sheets.Count
Call DeleteMacro
MsgBox "I'm currently on sheet " & ThisWorkbook.Sheets(i).Name
Next i
End If
End If
End Sub
每个工作表上运行的宏如下:
Sub DeleteMacro()
Dim x As Integer
Dim y As Integer
Call UnProtectSheet
Range("F12").AutoFilter Field:=6, Criteria1:=Array("Paid", "Cancelled", " "), Operator:=xlFilterValues
y = Cells.Item(3, "L")
x = Cells.Item(8, "E")
If x > 0 Then
Application.Goto Reference:="R12C1"
Call NextVisibleRow
If y > 1 Then
Range(Selection, Selection.End(xlDown)).Select
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.EntireRow.Delete
Else
Selection.EntireRow.Delete
End If
End If
ActiveSheet.ShowAllData
Application.Goto Reference:="R12C1"
Call NextVisibleRow
Selection.End(xlDown).Select
If ActiveCell.Value = "Balance" Then
Selection.End(xlUp).Select
End If
Call NextVisibleRow
Call ProtectSheet
End Sub
你能告诉我我做错了什么吗,导致宏无法在从工作表 4 到最后一张工作表的每个工作表上运行。
答案1
您永远不会更改宏正在运行的工作表。ActiveWorkbook.Worksheets(i).Activate
直接在调用上方添加DeleteMacro
即可。
请注意,使用Select
和Activate
是不好的做法。它效率低下,而且很容易导致类似这样的错误。你应该考虑阅读如何避免使用选择。
答案2
您只是一遍又一遍地运行 For 语句,而从未更改活动工作表。在 For... 之后添加 Worksheets(i).Activate 应该可以解决这个问题。