我学习如何使用Excel只需要大约三周的时间,而且我已经拥有它以便我的工作表上的所有表格都会排序,但不会在发生变化时,只有在我实际访问时才会工作表。
因此,如果我从UserForm
之类的其他来源输入数据,则不会再次对表进行排序,直到我返回工作表为止。有没有办法自动对它们进行排序,因此不需要额外的访问?
这是我到目前为止所做的:
Private Sub Worksheet_Activate()
Dim tbl As ListObject
Dim SortCol As Long
Application.ScreenUpdating = False
For Each tbl In ActiveSheet.ListObjects
If tbl.Name = "TableSORT2" Then
SortCol = 2
Else
SortCol = 1
End If
With tbl.Sort
.SortFields.Clear
.SortFields.Add Key:=tbl.DataBodyRange.Columns(SortCol), _
SortOn:=xlSortOnValues, Order:=xlAscending
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next tbl
Application.ScreenUpdating = True
End Sub
我尝试将Private Sub Worksheet_Activate()
更改为Private Sub Worksheet_Change()
,但无济于事,我假设是因为需要更多参考或集成。
答案 0 :(得分:1)
你可以接受D_Zab的建议或尝试下面的内容:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo halt
Application.EnableEvents = False
Dim tbl As ListObject
For Each tbl In Me.ListObjects
If Not Intersect(Target, Me.Range(tbl.Name)) Is Nothing Then
MsgBox "Table Updated"
SortTables Me 'call the sort table routine
End If
Next
moveon:
Application.EnableEvents = True
Exit Sub
halt:
MsgBox Err.Description
Resume moveon
End Sub
因此,上面会检测您放置事件的工作表中任何表格所做的任何更改。
现在,您所要做的就是创建一个对所有表进行排序并调用它的子。
A示例代码(实际上是您拥有的代码)如下所示。
Private Sub SortTables(sh As Worksheet)
Dim tbl As ListObject
Dim SortCol As Long
Application.ScreenUpdating = False
For Each tbl In sh.ListObjects
If tbl.Name = "TableSORT2" Then
SortCol = 2
Else
SortCol = 1
End If
With tbl.Sort
.SortFields.Clear
.SortFields.Add Key:=tbl.DataBodyRange.Columns(SortCol), _
SortOn:=xlSortOnValues, Order:=xlAscending
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next tbl
Application.ScreenUpdating = True
End Sub
这是你正在尝试的吗?顺便说一句,由于某种原因,这也会检测到UserForms
所做的更改。只要目标范围在Range("A2").Value = "something"
范围内,即使像Table Range
这样的简单行也会被检测到。此外,这还会在自动调整大小时检测向表中添加数据。 HTH。