2017-05-27 74 views
0

我想了解如何讓數據庫按字母順序使用列A中的VBA進行排序。聽起來很簡單,但我在頭4行中有標題,並且希望它從第5行向下。我一直在尋找幾天來找到這樣做的代碼。我已經成功了最近與此代碼 -從第5行開始按字母排序使用VBA

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error Resume Next 
    If Not Intersect(Target, Range("A:A")) Is Nothing Then 
     Range("A1").Sort Key1:=Range("A2"), _ 
      Order1:=xlAscending, Header:=xlYes, _ 
      OrderCustom:=1, MatchCase:=False, _ 
      Orientation:=xlTopToBottom 
    End If 
End Sub 

問題是,當我嘗試改變線 Range("A1").Sort Key1:=Range("A2"), _Range("A5").Sort Key1:=Range("A6"), _當我測試它,它仍然排序行到第2和不打算第5行。我知道我錯過了一些東西,但只是看不到我失蹤的是什麼!

+0

您錯過了「from」部分。要排序的範圍不能單獨由「to」部分來定義,並且說要將範圍「排到第5行」是一種誤解,因爲您想從第5行開始。因此,現在您可以看到專家們認爲,如果他們給你錯誤的答案,那將是你的錯。不能責怪他們,或者你能嗎?如果您想要一個有用的答案,請指定您想要排序的範圍,從第5行開始並結束於何處? – Variatus

回答

0

請不要誤用OERN(On Error Resume Next)。這就像告訴密碼:)。正確處理錯誤。

另一個interesting read

這是你想什麼呢?

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim lRow As Long 

    On Error GoTo Whoa 

    '~> Find the last row in Col A 
    lRow = Range("A" & Rows.Count).End(xlUp).Row 

    '~~> Check if it is greater than row 4 
    If lRow > 4 Then 
     Application.EnableEvents = False 

     '~~> Check if the change happened in the relevant range 
     If Not Intersect(Target, Range("A5:A" & lRow)) Is Nothing Then 
      '~~> Sort only the relevant range 
      Range("A4:A" & lRow).Sort Key1:=Range("A4"), _ 
             Order1:=xlAscending, _ 
             Header:=xlYes, _ 
             OrderCustom:=1, _ 
             MatchCase:=False, _ 
             Orientation:=xlTopToBottom, _ 
             DataOption1:=xlSortNormal 
     End If 
    End If 

Letscontinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume Letscontinue 
End Sub 
+0

Siddharth Rout,非常感謝您的幫助!代碼的確如它在錫上所說的那樣。但我只有一個小問題。我想要使​​用它的數據庫必須受到保護,以防止意外更改某些計算。當工作表不受保護時,您的代碼可以正常工作,但在工作表受到保護時不起作用。有沒有解決方法,我可以鎖定某些列,但在運行VBA時將排序所有行(A-H)? –

+0

您可以在代碼本身解鎖和鎖定工作表;)。在排序之前解鎖表格並在排序後立即對其進行保護 –