2016-11-10 2 views
0

Я пытаюсь сортировать диапазон.VBA, workheet.sort.apply метод error

<edit> Но я получаю сообщение об ошибке, когда скрипт (ниже) достигает линии с .apply ближе к концу.

Сообщение об ошибке:

Run-time error '1004': 

The sort reference is not valid. 
Make sure that it's within the data you want to sort, 
and the first Sort By box isn't the same or blank. 

</edit>

<edit> Диапазон для сортировки находится в пределах различной книги, чем тот, который вызывает функцию И Определяя диапазон для сортировки. </edit>

Каждый столбец в этом диапазоне должна быть отсортирован, с колонкой 1 сортируется, а затем колонку 2, а затем 3 comlumn ...

В результате того, что любая строка с одинаковыми значениями в столбце, далее сортируются на основе исходных колонн

например.

A | B | C | D 
----------------------- 
    3 | 9 | 4 | 1 
    4 | 5 | 7 | 7 
    4 | 5 | 3 | 4 
    4 | 1 | 9 | 2 
    2 | 6 | 3 | 8 
    4 | 5 | 3 | 1 

становится ...

A | B | C | D  
----------------------- 
    2 | 6 | 3 | 8 
    3 | 9 | 4 | 1 
    4 | 1 | 9 | 2 
    4 | 5 | 3 | 1 
    4 | 5 | 3 | 4 
    4 | 5 | 7 | 7 

У меня есть сценарий, как это до сих пор:

Private Sub tableSort(ByRef rng As Range) 

    If (rng.Rows.Count > 1) Then 
     With rng.Parent.Sort 

      With .SortFields 
       .Clear 
       .Add key:=rng, _ 
         SortOn:=xlSortOnValues, _ 
         Order:=xlAscending, _ 
         DataOption:=xlSortNormal 

       Dim iCounter As Integer 
       For iCounter = 2 To rng.Columns.Count 

        .Add key:=Range(_ 
          Cells(_ 
           rng.Rows(1).Row, _ 
           rng.Columns(iCounter).Column), _ 
          Cells(_ 
           rng.Rows(rng.Rows.Count).Row, _ 
           rng.Columns(rng.Columns.Count).Column)) _ 
         , SortOn:=xlSortOnValues, _ 
          Order:=xlAscending, _ 
          DataOption:=xlSortNormal 

       Next iCounter 
      End With 

      .SetRange rng 
      .Header = xlNo 
      .MatchCase = False 
      .Orientation = xlTopToBottom 
      .SortMethod = xlPinYin 
      .Apply 

      SendKeys "{ESC}" 

     End With 
    End If 
End Sub 

ответ

1

Что я делаю это первый получает общее количество столбцов в диапазоне объект, который передается. Затем я добавляю поле сортировки для каждого столбца, используя цикл for. Затем я выполняю сортировку.

Private Sub tableSort(ByRef rng As Range) 
    Dim cols as Integer 
    Dim curcol as Integer 
    cols = rng.Columns.Count 

    With rng.Parent 
     For curcol = 1 To cols 
      .Sort.SortFields.Add Key:=rng.Columns(curcol), _ 
       SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     Next curcol 

     With .Sort 
      .SetRange rng 
      .Header = xlNo 
      .MatchCase = False 
      .Orientation = xlTopToBottom 
      .SortMethod = xlPinYin 
      .Apply 
     End With 
    End With 
End Sub 
+0

вы должны заменить 'Worksheets («Лист1»)' 'с rng.Parent' и убедитесь, что вы действуете на том же листе пропущенный' rng' Range принадлежит. Кроме того, это хорошая практика, используя декларацию «Option Explicit» над модулем и, следовательно, добавляя «Dim cols As Long, curcol As Long» сразу после 'Private Sub tableSort (ByRef rng As Range)' – user3598756

+0

Спасибо за ваш ответ. (Вы оба) @ user3598756 ... Опция Явная находится наверху модуля. Я проверил ваше предложение использовать явный рабочий лист; однако проблема возникла. Я хорошо добавляю редактирование сообщения, но, возможно, стоит отметить, что: вызов функции находится в пределах ** 1 ** рабочего листа, а диапазон построен (на листе ** 1 **) для ** отдельного * * рабочий лист. – carl13

+0

Спасибо @ user3598756 за ваше предложение! – cullan

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

  • Нет связанных вопросов^_^