2016-11-25 2 views
0

Я очень новичок в VBA, поэтому, пожалуйста, пройдите ко мне.VBA Excel WorksheetFunction.Rank issue

У меня есть список номеров длиной в 120 000 строк, которые я хочу ранжировать с шагом 12 - это означает, что первые 12 чисел должны быть ранжированы от 1 до 12, следующие 12 чисел от 1 до 12 и т. Д.

Я знаю, как это сделать в Excel, по одному приращению за раз, используя функцию Ранга, но так как мне понадобилось навсегда сделать это вручную, я решил попробовать закодировать макрос, чтобы сделать это для меня.

Это насколько я уже пришел.

Sub Rank() 

    Range("H1").End(xlDown).Offset(1, 0).Select 
    ActiveCell = Application.WorksheetFunction.Rank(ActiveCell.Offset(0, 1), ActiveCell.Offset(0, 1), ActiveCell.Offset(12, 1)) 
    Range("H200000").Select 
    Selection.End(xlUp).Select 
    Selection.Copy 
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(11, 0)).Select 
    ActiveSheet.Paste 
End Sub 

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

+0

просьба дать некоторые подробности о том, как ваши «номера» разбросан вдоль колонн (группы из двенадцати ячеек, разделенные пустыми клетки, подряд, другие ...), какой столбец они принадлежат и какой столбец должны держать их рейтинг – user3598756

ответ

0

Несколько вопросов здесь:

ActiveCell является свойством только для чтения. Вы перемещаете его, используя .Activate, а не установку ActiveCell.

Ранг принимает три аргумента: ячейку (или значение) в качестве значения поиска, диапазон для поиска ранга внутри и значение для установки возрастающего или нисходящего ранга. Вы передали ему три ячейки.

Окончательные строки кода, которые являются единственными, которые влияют на электронную таблицу, копируют последний элемент в столбце H вниз для еще 12 ячеек. Я не думаю, что это тот эффект, который вы искали ...

Следующее предполагает, что ваши данные начинаются с H2 и помещают ранг в каждый блок из 12 в столбце I. Это больше, чем вы были находясь в поиске?

Sub Rank() 
    Dim i As Long 
    Dim j As Long 
    Application.ScreenUpdating = False 
    For i = 1 To 10000 
     For j = 1 To 12 
      Cells((i - 1) * 12 + (j + 1), 9).Value = WorksheetFunction.Rank(Cells((i - 1) * 12 + (j + 1), 8), Range(Cells((i - 1) * 12 + 2, 8), Cells((i - 1) * 12 + 13, 8)), 1) 
     Next j 
    Next i 
    Application.ScreenUpdating = True 
End Sub 
+0

Спасибо за быстрый ответ! Он работал с удовольствием, только с одним икотой - мне нужно отменить порядок рангов. Теперь самое низкое число получает самый низкий ранг, тогда как я хотел бы, чтобы это было так, чтобы наибольшее число получило самый низкий ранг. Есть идеи? – storaxe

+0

Используйте 0, а не 1 в конце функции - как я уже упоминал, третий параметр, который вы передаете Rank, определяет порядок. – bobajob

+0

Gotcha! Еще раз спасибо! – storaxe