将3个VBAmacros组合到1中(2个删除不同表中的行,1个刷新数据)

我有3个macros,我想合并成一个顺序运行。 我想运行的第一位刷新Excel工作簿中的所有数据,接下来的两个删除工作表上的特定行。 我有三个单独的工作,但我想结合所有三个,所以最终用户可以一次运行它们。 我认为我遇到的问题是我错误地使这些macros运行在特定的工作表,而不是模块。 我被困在组合它们,因为macros已经在不同的工作表。

第一个macros:

Sub Macro1() ActiveWorkbook.RefreshAll Sheets("ManagementDashboard").Select End Sub 

第二个macros(在名为“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 

第三个macros(在名为“RawDataLoader”的表中运行,也与第二个macros相同,只需在不同的工作表中运行)

 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 

最后,我想要select“ManagementDashboard”表,就像第一个macros一样,但是我需要第二个和第三个macros在运行之前运行。 任何帮助,将不胜感激!

只有与工作表事件相关的代码应该在工作表模块中

  1. 创build一个新模块(右键单击>插入>模块)
  2. 将所有三个子目录移动到新模块中(重命名具有相同名称的目录)
  3. 你有任何Cells你需要先参考适当的工作表。 例如Worksheets("RawDataLoader").Cells()
  4. 根据下面添加一个新的子将运行所有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 

任何时候,当你没有引用一个位置的时候,excel会把当前的任何活动和它一起运行。 例如Cells(i, "C").EntireRow.Delete被读为ActiveWorkbook.ActiveWorksheet.Cells(i,"C").EntireRow.Delete 。 通过使用Dim我们不必select或激活任何工作表或单元格。 参考这里获取更多信息。 我离开了最后的。在那里.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