2015-02-11 105 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。

相關問題