当我更改表中的任何值时,我正在尝试编写一个宏来自动对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
每当表中的值发生变化时,我该怎么做才能让这个宏连续运行?
答案 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是您创建的表格的范围。