将3个VBA宏组合到1中(2个删除不同的表中的行,1个刷新数据)
我有3个宏,我想将它们合并为一个按顺序运行的宏。我想运行的第一位刷新Excel工作簿中的所有数据,接下来的两个删除工作表中的特定行。我有三个宏单独工作,但我想结合所有三个,因此最终用户可以一次运行它们。我认为我遇到的问题是我错误地使这些宏运行在特定的工作表上,而不是模块。我坚持把它们结合起来,因为宏已经在不同的工作表中。将3个VBA宏组合到1中(2个删除不同的表中的行,1个刷新数据)
第一宏:
Sub Macro1()
ActiveWorkbook.RefreshAll
Sheets("ManagementDashboard").Select
End Sub
第二宏
Sub DeleteRows()
Last = Cells(Rows.Count, "c").End(xlUp).Row
For i = Last To 1 Step -1
'if cell value is less than 100
If (Cells(i, "c").Value) < 100 Then
'delete entire row
Cells(i, "c").EntireRow.Delete
End If
Next i
End Sub
第三个宏(名为 “RawDataLoader” 片材运行时,也将(在名为 “RawDataPltzr” 片材运行)与第二个宏相同,只需要在不同的工作表中运行)
Sub DeleteRows()
Last = Cells(Rows.Count, "c").End(xlUp).Row
For i = Last To 1 Step -1
'if cell value is less than 100
If (Cells(i, "c").Value) < 100 Then
'delete entire row
Cells(i, "c").EntireRow.Delete
End If
Next i
End Sub
最后,我希望工作表“管理仪表板“被选中,就像在第一个宏中一样,但是我需要第二个和第三个宏在运行之前运行。任何帮助,将不胜感激!
只涉及到工作表的事件应该是在工作表模块
- 创建一个新的模块代码(右键单击>插入>模块)
- 移动全部三艘潜水艇到新的模块(重命名这些与相同的名称)
- 任何地方你有
Cells
你需要先参考适当的工作表。例如。Worksheets("RawDataLoader").Cells()
- 添加一个新的子按照下面将运行所有3为你
Sub RunAll()
Macro1
DeleteRowsPltzr
DeleteRowsLoader
ThisWorkbook.Worksheets("ManagementDashboard").Activate
End Sub
确保你明白,方法正确。此时您可以将所有三艘潜水艇合并为这一子(无需单独称呼他们)
Sub RunAll()
ThisWorkbook.RefreshAll
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets(Array("RawDataPltzr", "RawDataLoader"))
Last = ws.Cells(ws.Rows.Count, "c").End(xlUp).Row
For i = Last To 1 Step -1
'if cell value is less than 100
If (ws.Cells(i, "c").Value) < 100 Then
'delete entire row
ws.Cells(i, "c").EntireRow.Delete
End If
Next i
Next ws
ThisWorkbook.Worksheets("ManagementDashboard").Activate
End Sub
非常感谢!很棒! – Lampoa
任何时候,你不引用位置擅长采取一切在当时活跃,并与它运行。例如Cells(i, "C").EntireRow.Delete
被读作ActiveWorkbook.ActiveWorksheet.Cells(i,"C").EntireRow.Delete
。通过使用Dim
,我们不必选择或激活任何工作表或单元格。参考Here获取更多信息。我在那里离开了最后的.Activate
,但这是非常糟糕的做法。把这段代码放到它自己的模块中,它应该运行良好。
Sub All_Three()
Dim wbk As Workbook
Dim MD As Worksheet, RDP As Worksheet, RDL As Worksheet, ws As Worksheet
Dim Last As Long, i As Long, myCount As Long
Set wbk = ActiveWorkbook
Set MD = wbk.Worksheets("ManagementDashboard")
Set RDP = wbk.Worksheets("RawDataPltzr")
Set RDL = wbk.Worksheets("RawDataLoader")
'Macro1
wbk.RefreshAll
For myCount = 1 To 2
Select Case myCount
Case 1
Set ws = RDP
Case 2
Set ws = RDL
End Select
'Macro 2 and 3
With ws
Last = .Range("C" & .Rows.Count).End(xlUp).Row
For i = Last To 1 Step -1
If .Cells(i, "C").Value < 100 Then
.Cells(i, "C").EntireRow.Delete
End If
Next i
End With
Next myCount
MD.Activate
End Sub
您可能有兴趣使用工作表名称数组来避免计数器和select语句(请参阅我的答案) – CallumDA
@CallumDA我完全同意。当我第一次进入VBA阵列时,我的脑子一阵子崩溃了。我想让这个开始的人更简单。 – BerticusMaximus
完全限定您的工作表参考。现在的代码的方式,它假定ActiveSheet,这可能会导致很多问题。 – braX