2014-11-21 2 views
1

Я, кажется, получаю ошибку 1004 около половины времени, когда я запускаю этот кусок кода, и я не совсем уверен, почему:Runtime Ошибка 1004 рода функции VBA

Dim ranged As Range 
Set ranged = Range("AJ2") 
Set ranged = Range(ranged, ranged.End(xlDown)) 


Sheets(i).Select 
ActiveWorkbook.Worksheets(i).Sort.SortFields.Add Key:=ranged, _ 
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 
With ActiveWorkbook.Worksheets(i).Sort 
    .SetRange ranged 
    .Header = xlNo 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 

End With 

Код бежится по серии рабочих листов и диапазону в столбце AJ различаются по размеру на каждом листе, и поэтому определение диапазона в начале необходимо. Цель состоит в том, чтобы отменить порядок диапазона. Может ли кто-нибудь помочь с тем, что здесь ошибка?

ответ

0
  1. В большинстве случаев вам не нужно выбирать рабочий лист. Вы можете посмотреть THIS

  2. Не используйте xlDown, чтобы построить свой диапазон. Используйте xlUp, чтобы найти последнюю строку с данными. Вы можете увидеть THIS

Сочетание обоих указанных выше, код может выглядеть ниже. Попробуйте. (UNTESTED)

Dim ranged As Range 
Dim lRow As Long 

' 
'~~> Rest of the code 
' 

With ThisWorkbook.Sheets(i) 
    '~~> Find Last row in Col AJ which has data 
    lRow = .Range("AJ" & .Rows.Count).End(xlUp).Row 

    '~~> Construct your range 
    Set ranged = .Range("AJ2:AJ" & lRow) 

    '~~> Sort 
    .Sort.SortFields.Add Key:=ranged, _ 
         SortOn:=xlSortOnValues, _ 
         Order:=xlDescending, _ 
         DataOption:=xlSortNormal 
    With .Sort 
     .SetRange ranged 
     .Header = xlNo 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
End With 

' 
'~~> Rest of the code 
' 

испытанный версия

Sub Sample() 
    Dim ranged As Range 
    Dim lRow As Long, i As Long 

    For i = 1 To ThisWorkbook.Sheets.Count 
     ' 
     '~~> Rest of the code 
     ' 

     With ThisWorkbook.Sheets(i) 
      '~~> Find Last row in Col AJ which has data 
      lRow = .Range("AJ" & .Rows.Count).End(xlUp).Row 

      '~~> Construct your range 
      Set ranged = .Range("AJ2:AJ" & lRow) 

      '~~> Sort 
      .Sort.SortFields.Add Key:=ranged, _ 
           SortOn:=xlSortOnValues, _ 
           Order:=xlDescending, _ 
           DataOption:=xlSortNormal 
      With .Sort 
       .SetRange ranged 
       .Header = xlNo 
       .MatchCase = False 
       .Orientation = xlTopToBottom 
       .SortMethod = xlPinYin 
       .Apply 
      End With 
     End With 

     ' 
     '~~> Rest of the code 
     ' 
    Next i 
End Sub 
+0

Спасибо за вашу помощь. Я скопировал этот код именно в мой, и он по-прежнему сталкивается с «Ошибка времени выполнения 1004: ссылка на сортировку недействительна. Убедитесь, что она находится в пределах данных, которые вы хотите отсортировать, и первое поле Sort By не является такой же или пустой. " Что действительно странно, так это то, что когда я запускаю его на одном листе, только изменяя его с помощью этой книги. Таблицы (i) с помощью этого рабочего стола. Таблицы («Имя листа») отлично работают, но когда я помещаю его в указанную выше структуру для запуска нескольких в соответствии с вашим кодом это не так. Есть идеи? – mm123

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