2017-05-27 44 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

您可以在代码本身解锁和锁定工作表;)。在排序之前解锁表格并在排序后立即对其进行保护 –