简化Excel VBA代码

时间:2015-06-10 06:40:02

标签: excel vba excel-vba

我有一个工作簿,可以为各个客户端创建数据报告,每个客户端在工作簿中都有一个特定的工作表。原始数据存储在工作表RawData中。在每个客户特定的工作表上,原始数据是重复的,例如A129客户端工作表对所有相关行和列说=RawData!A1

在每个客户端工作表中,原始数据然后由客户端名称(以下代码中的T51)和相关月份(T52)自动过滤。这是由每个客户端工作表上的宏(下面)维护的。每次更新单元格时都会运行宏。因此,一旦原始数据更新,它将自动流入相关的客户报告。

虽然这非常有效地仅在其报告中填写相关客户的特定数据;由于有+20个客户报告,它运行缓慢。在对原始数据或所需月份进行更改后,需要25分钟才能完成并更新所有电子表格中的所有自动过滤器。

如果有人可以提供帮助,我希望能够将代码放在一个工作表(例如RawData表)上,然后循环遍历所有工作表并以这种方式更新自动过滤器。我的猜测是,这样做会使整个过程更快 - 通过一个代码连续运行20张而不是20个试图同时运行。

任何帮助或任何关于如何做得更好的想法将非常感激。谢谢。

Private Sub Worksheet_Calculate()

    If Me.FilterMode = True Then
        With Application
            .EnableEvents = False
            .ScreenUpdating = False
        End With

        With ActiveWorkbook
            .CustomViews.Add ViewName:="Mine", RowColSettings:=True
            Me.AutoFilterMode = False
            .CustomViews("Mine").Show
            .CustomViews("Mine").Delete
        End With

        With ActiveWorkbook
        Range("$A$129:$I$33602").AutoFilter Field:=2, Criteria1:=Range("T51").Value
        Range("$A$129:$I$33602").AutoFilter Field:=5, Criteria1:=Range("T52").Value
        End With

        With Application
            .EnableEvents = True
            .ScreenUpdating = True
        End With

    End If

End Sub

更多信息:T51T52由与数据透视图相关联的切片机控制。例如,更改Month切片器会更改所有客户端工作表中的所有数据透视表以及T52,然后更新过滤器。 T51和客户名称也是如此,尽管这只是特定于工作表的

1 个答案:

答案 0 :(得分:-1)

循环浏览工作表:

Sub ertdfgcvb()
Dim ws As Worksheet

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

For Each ws In ActiveWorkbook.Worksheets

    If ws.FilterMode = True Then

        With ActiveWorkbook 'I don't know what this view does, you might need to select the sheet beforehand
            .CustomViews.Add ViewName:="Mine", RowColSettings:=True
            ws.AutoFilterMode = False
            .CustomViews("Mine").Show
            .CustomViews("Mine").Delete
        End With

            ws.Range("$A$129:$I$33602").AutoFilter Field:=2, Criteria1:=ws.Range("T51").Value
            ws.Range("$A$129:$I$33602").AutoFilter Field:=5, Criteria1:=ws.Range("T52").Value
    End If
Next ws

With Application
        .EnableEvents = True
        .ScreenUpdating = True
End With

End Sub