自动对表格中的多个表格进行排序
问题描述:
我只学习了三个星期的时间来学习如何使用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()
但无济于事,我假设,因为有更多的参考或整合需要。
答
您可以采取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
所以上述检测的任何表中你把事件表所做的任何更改。
现在,您只需要创建一个将所有表格排序并调用它的子文件。
下面是一个示例代码(实际上就是您所拥有的)。
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
所做的更改。只要目标范围在Table Range
内,即使是一条简单的线路,如Range("A2").Value = "something"
也会被检测到。此外,它还会在自动调整大小时检测向表中添加数据。 HTH。
你有没有尝试过ActiveSheet.EnableCalculation = True,或者你在想更像或Pivot.RefreshTable? – jamesC 2015-02-11 21:22:55
你可以直接将这种排序写入宏,然后每当你从用户表单添加数据时调用宏?你做的每件事都包含在一个工作簿中吗? – 2015-02-11 21:31:42
我不确定这些是什么意思,但第一个看起来像它需要活动的工作表来更新,而不仅仅是一个自动化的响应。我发现这一点,它只更新表单中的一行,但它没有任何额外的交互:Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Not Intersect(Target,Range(“ A:A“))是Nothing Then Range(”A8“)。Sort Key1:= Range(”A9“),_ Order1:= xlAscending,Header:= xlYes, OrderCustom:= 1,MatchCase:= False , Orientation:= xlTopToBottom End If End Sub' – Tayloryouno 2015-02-11 21:33:10