如何连续运行Excel VBA宏?

时间:2015-07-25 17:12:16

标签: excel vba excel-vba

当我更改表中的任何值时,我正在尝试编写一个宏来自动对Excel中的表进行排序 这是我的VBA代码

Sub Macro3(ByVal target As Range)
    ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort.SortFields.Add _
        Key:=Range("Table4[Pts]"), SortOn:=xlSortOnValues, Order:=xlDescending, _
        DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort.SortFields.Add _
        Key:=Range("Table4[GD]"), SortOn:=xlSortOnValues, Order:=xlDescending, _
        DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort.SortFields.Add _
        Key:=Range("Table4[GF]"), SortOn:=xlSortOnValues, Order:=xlDescending, _
        DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table4").sort
        .Header = xlYes
        .MatchCase = True
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Sub sort()
    Dim target As Range
    Set target = Range("Table4")
    Call Macro3(target)
End Sub

每当表中的值发生变化时,我该怎么做才能让这个宏连续运行?

2 个答案:

答案 0 :(得分:2)

由于单元格公式从另一个工作表中的更改重新计算而更改单元格值时,不会触发Worksheet_Change事件宏。您需要为此捕获Worksheet_Calculate事件。

这不是模块代码。它属于Sheet1的代码页。右键单击工作簿底部的Sheet1选项卡,然后选择“查看代码”。当VBE打开时,将以下内容粘贴到标题为 Book1 - Sheet1(Code)的窗格中。

Private Sub Worksheet_Calculate()
    On Error Goto bm_Safe_Exit
    Application.EnableEvents = False
    With ListObjects("Table4").Sort
        With .SortFields
            .Clear
            .Add Key:=Range("Table4[[#All],[Pts]]"), Order:=xlDescending
            .Add Key:=Range("Table4[[#All],[GD]]"), Order:=xlDescending
            .Add Key:=Range("Table4[[#All],[GF]]"), Order:=xlDescending
        End With
        .Header = xlYes
        .Apply
    End With
bm_Safe_Exit:
    Application.EnableEvents = True
End Sub

点击 Alt + Q 返回工作表。如果公式重新计算,将使用表4中的数据。事件监视暂时中止,以便排序行为不会触发另一个计算事件。

答案 1 :(得分:0)

要在每次表格/范围中的单元格更改时运行宏,您可以使用events,将其放入工作表的代码中。

在您的情况下,您可能需要以下内容:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, range_of_table) Is Nothing Then
    Call sort
  End If
End Sub

其中range_of_table是您创建的表格的范围。