Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将3个VBA宏合并为1个(2个删除不同图纸上的行,1个刷新数据)_Vba_Excel - Fatal编程技术网

将3个VBA宏合并为1个(2个删除不同图纸上的行,1个刷新数据)

将3个VBA宏合并为1个(2个删除不同图纸上的行,1个刷新数据),vba,excel,Vba,Excel,我有3个宏,我想合并成一个顺序运行。我要运行的第一个位刷新excel工作簿中的所有数据,接下来的两个位删除工作表中的特定行。我拥有的三个宏单独工作,但我希望将这三个宏组合起来,以便最终用户可以同时运行它们。我认为我遇到的问题是,我错误地使这些宏在特定的工作表上运行,而不是在模块上运行。我一直坚持把它们结合起来,因为宏已经在不同的表中了 第一个宏: Sub Macro1() ActiveWorkbook.RefreshAll Sheets("ManagementDashboard").

我有3个宏,我想合并成一个顺序运行。我要运行的第一个位刷新excel工作簿中的所有数据,接下来的两个位删除工作表中的特定行。我拥有的三个宏单独工作,但我希望将这三个宏组合起来,以便最终用户可以同时运行它们。我认为我遇到的问题是,我错误地使这些宏在特定的工作表上运行,而不是在模块上运行。我一直坚持把它们结合起来,因为宏已经在不同的表中了

第一个宏:

Sub Macro1()
   ActiveWorkbook.RefreshAll
   Sheets("ManagementDashboard").Select
End Sub
第二个宏(在名为“RawDataPltzr”的工作表中运行)

子删除行()
Last=单元格(Rows.Count,“c”)。结束(xlUp)。行
对于i=最后一步-1
'如果单元格值小于100
如果(单元格(i,“c”)值小于100,则
'删除整行
单元格(i,“c”).EntireRow.Delete
如果结束
接下来我
端接头
第三个宏(在名为“RawDataLoader”的工作表中运行),也与第二个宏相同,只是必须在不同的工作表中运行)

子删除行()
Last=单元格(Rows.Count,“c”)。结束(xlUp)。行
对于i=最后一步-1
'如果单元格值小于100
如果(单元格(i,“c”)值小于100,则
'删除整行
单元格(i,“c”).EntireRow.Delete
如果结束
接下来我
端接头

最后,我希望选择工作表“ManagementDashboard”,就像在第一个宏中一样,但我需要先运行第二个和第三个宏,然后再运行它。任何帮助都将不胜感激

工作表模块中应仅包含与工作表事件相关的代码

  • 创建新模块(右键单击>插入>模块)
  • 将所有三个子模块移动到新模块中(重命名具有相同名称的子模块)
  • 只要有
    单元格
    ,您就需要首先参考相应的工作表。例如,
    工作表(“RawDataLoader”).Cells()
  • 根据以下内容添加一个新的sub,它将为您运行所有3个sub

  • 确保您正确理解该方法。在这一点上,您可以将所有三个sub组合成一个sub(无需单独调用它们)

    Sub RunAll()
    ThisWorkbook.RefreshAll
    将ws设置为工作表
    对于此工作簿中的每个ws。工作表(数组(“RawDataPltzr”、“RawDataLoader”))
    Last=ws.Cells(ws.Rows.Count,“c”).End(xlUp).Row
    对于i=最后一步-1
    '如果单元格值小于100
    如果(ws.Cells(i,“c”)值小于100,则
    '删除整行
    ws.Cells(i,“c”).EntireRow.Delete
    如果结束
    接下来我
    下一个ws
    此工作簿。工作表(“管理仪表板”)。激活
    端接头
    
    工作表模块中应仅包含与工作表事件相关的代码

  • 创建新模块(右键单击>插入>模块)
  • 将所有三个子模块移动到新模块中(重命名具有相同名称的子模块)
  • 只要有
    单元格
    ,您就需要首先参考相应的工作表。例如,
    工作表(“RawDataLoader”).Cells()
  • 根据以下内容添加一个新的sub,它将为您运行所有3个sub

  • 确保您正确理解该方法。在这一点上,您可以将所有三个sub组合成一个sub(无需单独调用它们)

    Sub RunAll()
    ThisWorkbook.RefreshAll
    将ws设置为工作表
    对于此工作簿中的每个ws。工作表(数组(“RawDataPltzr”、“RawDataLoader”))
    Last=ws.Cells(ws.Rows.Count,“c”).End(xlUp).Row
    对于i=最后一步-1
    '如果单元格值小于100
    如果(ws.Cells(i,“c”)值小于100,则
    '删除整行
    ws.Cells(i,“c”).EntireRow.Delete
    如果结束
    接下来我
    下一个ws
    此工作簿。工作表(“管理仪表板”)。激活
    端接头
    
    任何时候,只要您不引用某个位置,excel就会获取当时处于活动状态的内容并与之一起运行。例如,
    Cells(i,“C”).EntireRow.Delete
    被解读为
    ActiveWorkbook.ActiveWorksheet.Cells(i,“C”).EntireRow.Delete
    。通过使用
    Dim
    我们不必选择或激活任何工作表或单元格。有关更多信息,请参阅。我把最后的
    .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
    
    Sub All_Three()
    将wbk设置为工作簿
    Dim MD作为工作表,RDP作为工作表,RDL作为工作表,ws作为工作表
    暗淡的持续时间一样长,我的持续时间一样长,我的持续时间一样长
    设置wbk=ActiveWorkbook
    设置MD=wbk.工作表(“管理仪表板”)
    设置RDP=wbk.工作表(“RawDataPltzr”)
    Set RDL=wbk.Worksheets(“RawDataLoader”)
    “宏观1
    wbk.RefreshAll
    对于myCount=1到2
    选择案例myCount
    案例1
    设置ws=RDP
    案例2
    设置ws=RDL
    结束选择
    '宏2和宏3
    与ws
    Last=.Range(“C”和.Rows.Count).End(xlUp).Row
    对于i=最后一步-1
    如果单元格(i,“C”)值小于100,则
    .单元格(i,“C”).EntireRow.Delete
    如果结束
    接下来我
    以
    下一个我的帐户
    MD.激活
    端接头
    
    任何时候,只要您不引用某个位置,excel就会获取当时处于活动状态的内容并与之一起运行。例如,
    Cells(i,“C”).EntireRow.Delete
    被解读为
    ActiveWorkbook.ActiveWorksheet.Cells(i,“C”).EntireRow.Delete
    。通过使用
    Dim
    我们不必选择或激活任何工作表或单元格。有关更多信息,请参阅。我把最后的
    .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
    
    Sub All_Three()
    将wbk设置为工作簿
    Dim MD作为工作表,RDP作为工作表,RDL作为工作表,ws作为工作表
    暗淡的持续时间一样长,我的持续时间一样长,我的持续时间一样长
    设置wbk=
    
    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
    
    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