2015-02-11 66 views
1

我只学习了三个星期的时间来学习如何使用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

你有没有尝试过ActiveSheet.EnableCalculation = True,或者你在想更像或Pivot.RefreshTable? – jamesC 2015-02-11 21:22:55

+1

你可以直接将这种排序写入宏,然后每当你从用户表单添加数据时调用宏?你做的每件事都包含在一个工作簿中吗? – 2015-02-11 21:31:42

+0

我不确定这些是什么意思,但第一个看起来像它需要活动的工作表来更新,而不仅仅是一个自动化的响应。我发现这一点,它只更新表单中的一行,但它没有任何额外的交互: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

回答

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 

所以上述检测的任何表中你把事件表所做的任何更改。
现在,您只需要创建一个将所有表格排序并调用它的子文件。
下面是一个示例代码(实际上就是您所拥有的)。

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。

相关问题