2014-12-09 2 views
0

Я создаю макрос, сортирующий по возрастанию/убыванию диапазон ячеек в соответствии с его значениями. Проблема заключается в том, что она не работает со следующими данными:сортировать по возрастанию/по убыванию vba excel not working

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, 02, 22. Сортировка будет 01, 02, 11, 22 – PaulFrancis

+0

Если вы поместите эти четыре имени файла в четыре разных ячейки ячеек и попросите Excel отсортировать их в виде AZ, это именно тот порядок сортировки, который вы получите. Затем ваш код _is_ правильный - в том смысле, что он реплицирует поведение таблиц Excel. –

+0

@PaulFrancis, к сожалению, я не могу изменить имена файлов. Он не может содержать 0 с левой стороны. –

ответ

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)? –

+0

Да 'Call MyOrder (.Range (.Cells (3,1) .Cells (lastRow, 1), 1, false) ' – Makah

+0

Извините, это может выглядеть глупо, но где я могу позвонить MyOrder? Могу ли я создать кнопку, а затем просто называть ее передачей ее аргументов ? –

Смежные вопросы