2014-12-09 107 views
0

我正在构建一个宏,根据它的值升序/降序一系列单元格。 的问题是,它不与下面的数据工作:按升序/降序排序vba excel不工作

11_NR-10.pdf 16_NR-10.pdf 1_NR-10.pdf 6_NR-10.pdf

当我尝试整理,我得到以下结果:

1_NR-10.pdf 11_NR-10.pdf 16_NR-10.pdf 6_NR-10.pdf

是否有人知道如何帮助我吗?

代码:

Dim xlSort As XlSortOrder 
Dim LastRow As Long 

With ActiveSheet 

    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 

    If (.Range("A3").Value > .Range("A" & CStr(LastRow))) Then 
     xlSort = xlAscending 
    Else 
     xlSort = xlDescending 
    End If 

    .Range("A3:A" & LastRow).Sort Key1:=.Range("A3"), Order1:=xlSort, Header:=xlNo, _ 
     OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ 
     DataOption1:=xlSortNormal 


End With 
ActiveWorkbook.Save 
+1

那么排序工作正常。字母排序是1,11,2,22等,而不是现实的1,2,11,22。如果您将文件名更改为01,11,22,22。排序为01,02,11,22 – PaulFrancis 2014-12-09 13:18:03

+0

如果您将这四个文件名放入四个不同的列单元格并要求Excel对它们进行排序,那么这就是您将得到的排序顺序。然后,您的代码是正确的 - 就是说,它正在复制Excel的电子表格行为。 – 2014-12-09 13:22:19

+0

@PaulFrancis不幸的是我不能改变文件名。它不能在左侧包含任何0。 – 2014-12-09 13:25:25

回答

0

我只为这一个附配的功能。全部未经测试的代码如下:

Public Sub MySuperSort() 
    Dim sortType31 As Integer, lastRow As Long 

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row 

    sortType = ([A3] > Cells(lastRow, 1)) 
    Call MyOrder(Range(Cells(3, 1), Cells(lastRow, 1)), 1, False) 

    ActiveWorkbook.Save 
End Sub 

Private Sub MyOrder(ByVal tableRange As Range, ByVal columnIndex As Integer, ByVal ascending As Boolean, Optional ByVal header As Boolean = True) 
    Dim orderBy As Integer, hasHeader As Integer 
    orderBy = IIf(ascending, xlAscending, xlDescending) 
    hasHeader = IIf(header, xlYes, xlNo) 

    With tableRange.Parent 
     .Sort.SortFields.Clear 
     .Sort.SortFields.Add _ 
      Key:=Intersect(tableRange, tableRange.Columns(columnIndex)), _ 
      SortOn:=xlSortOnValues, Order:=orderBy, DataOption:=xlSortNormal 
     With .Sort 
      .SetRange tableRange 
      .header = hasHeader 
      .MatchCase = False 
      .Orientation = xlTopToBottom 
      .SortMethod = xlPinYin 
      .Apply 
     End With 
    End With 
End Sub 
+0

您的意思是:MyOrder(.Range(.Cells(3,1).Cells(lastRow,1),1,false)? – 2014-12-09 13:28:40

+0

是'Call MyOrder .Range(.Cells(3,1).Cells(lastRow,1),1,false)' – Makah 2014-12-09 13:31:20

+0

对不起,它可能看起来很傻,但我在哪里调用MyOrder?我可以创建一个按钮,然后简单地调用它传递它的参数? – 2014-12-09 13:43:58