2017-04-15 69 views
0

好吧,所以我是VBA的新手(動作沒有問題 - 所以不是新的編碼,只是VBA),一直在努力學習我能做些什麼,並得到一些代碼爲我工作。我在Excel中有一個報告。第6行是標題,第7行是空白,第8行是附加信息;實際數據從第9行開始(B9:D9)向下。 Colum C包含我想要排序的數據。隨着新數據在後續行中輸入,我希望報告在完成D#中的數據輸入後自動重新排序。 (希望這是有道理的)Excel自動排序

這可能在VBA中嗎?還是我問太多?

非常感謝。

這就是我一直在使用:

`Private Sub Worksheet_Change(ByVal Target As Range) 
Dim CCell As Range 
Dim ActiveCellInTable As Boolean 
Dim r As Single 
Dim Value As Variant 
Rows("9:38", "B:E").Select 
Set CCell = Target 
On Error Resume Next 
ActiveCellInTable = (CCell.ListObject.Name = "Table2") 
On Error GoTo 0 
If ActiveCellInTable = True Then 
    r = Target.Row - Target.ListObject.Range.Row + 9 
    For c = 1 To ActiveSheet.ListObjects(CCell.ListObject.Name).Range.Columns.Count 
     If ActiveSheet.ListObjects(CCell.ListObject.Name).Range.Cells(r, c).Value = "" Then Exit Sub 
    Next c 
    With ActiveSheet.ListObjects(CCell.ListObject.Name).Sort 
     .SortFields.Clear 
     .SortFields.Add _ 
      Key:=Range("Table2[[#All],[Item number]]"), SortOn:=xlSortOnValues, Order _ 
      :=xlAscending, DataOption:=xlSortNormal 
     .Apply 
    End With 
End If 
End Sub` 

回答

0

是的,它是可能的,這裏是我的版本你想要做什麼。 'Worksheet_Change'必須在Sheet1代碼中執行,並且每當工作表中的任何單元發生更改時都會執行。爲了安全起見,您應該禁用事件,否則代碼可能會因不同的電子表格事件過早中斷:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim lastRow As Integer 
    Dim entireRange As Range, sortRange As Range 

    Application.EnableEvents = False 

    lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "B").End(xlUp).row 
    If Not Intersect(Target, Me.Range("D9:D" & lastRow)) Is Nothing Then 
    Set entireRange = Range("B9:D" & lastRow) 
    Set sortRange = Range("C9:C" & lastRow) 

    entireRange.Sort Key1:=sortRange, Order1:=xlAscending, Header:=xlNo 
    End If 

    Application.EnableEvents = True 
End Sub