将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 

最后,我希望工作表“管理仪表板“被选中,就像在第一个宏中一样,但是我需要第二个和第三个宏在运行之前运行。任何帮助,将不胜感激!

+0

完全限定您的工作表参考。现在的代码的方式,它假定ActiveSheet,这可能会导致很多问题。 – braX

只涉及到工作表的事件应该是在工作表模块

  1. 创建一个新的模块代码(右键单击>插入>模块)
  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 
+1

非常感谢!很棒! – 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 
+0

您可能有兴趣使用工作表名称数组来避免计数器和select语句(请参阅我的答案) – CallumDA

+2

@CallumDA我完全同意。当我第一次进入VBA阵列时,我的脑子一阵子崩溃了。我想让这个开始的人更简单。 – BerticusMaximus