在更改时自动对工作表中的多个表进行排序

时间:2015-02-11 20:58:32

标签: excel vba excel-vba

我学习如何使用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(),但无济于事,我假设是因为需要更多参考或集成。

1 个答案:

答案 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。