Как ускорить RANK () в Excel - PullRequest
       8

Как ускорить RANK () в Excel

3 голосов
/ 10 августа 2011

Создание инструмента в Excel, и в рамках этого упражнения мне нужно определить 50 лучших ценных бумаг на основе рыночной капитализации.

Это довольно легко сделать с помощью RANK (), но у меня есть вселенная, насчитывающая более 10000, и обработка быстро просматриваемой рабочей книги становится медленной, когда я добавляю ранг к этим 10000 записей.

Я понимаю, что медлительность вызвана, по крайней мере, частично тем, что Excel нужно отсортировать записи для их ранжирования, поэтому мне интересно, может ли какой-то индекс на значениях, которые нужно ранжировать, ускорить процесс? Есть ли лучший способ сделать это, либо с помощью функции (ов) Excel, с которыми я не знаком, или с помощью какого-либо другого подхода, чтобы ускорить процесс?

Ответы [ 2 ]

4 голосов
/ 11 августа 2011

Вы можете отсортировать значения так, как вы хотите, а затем использовать функцию, подобную ROW (), чтобы просто назначить ранг последовательно (хотя вам может потребоваться заплатить, чтобы сделать что-то особенное, чтобы разорвать «связи»).

Если вы не хотите сортировать значения, это зависит от того, что вам нужно ...

Случай 1 - вам на самом деле не нужен ранг, а нужно только определитьверхние 50 значений.

Предположим, что ваши значения находятся в ячейках A1: A10000.

В другой ячейке, например, E1, введите формулу, которая вычисляет «отсечение» для верхних 50 значений, например=PERCENTILE($A$1:$A$10000,50/COUNT($A$1:$A$10000)).

В ячейку B1 введите формулу, которая возвращает значение в A1, если оно ниже «обрезания», или пустую строку, аналогичную этой: =IF(A1<=$E$1,A1,"").

Копироватьэта формула вплоть до ячеек с B2 по B10000.

В строках с верхними 50 значениями в столбце A будут непустые значения в столбце B.

Может быть более 50 таких строк, если имеетсяявляются галстуками.

Дело 2 - Вам нужен ранг, но только для тЛучшие 50 значений.

Следуйте инструкциям для случая 1, затем в ячейку C1 введите формулу, которая вычисляет рейтинг непустых значений в столбце B, например: =IF(B1="","",RANK(B1,$B$1:$B$10000)).

Скопируйте эту формулу в ячейки от C2 до C10000.

Строки с верхними 50 значениями в столбце A будут ранжироваться в столбце C.

Опять же, таких строк может быть более 50если есть связиТакже будут пробелы в значениях ранга, если есть связи.

Случай 3 - Вам нужен ранг для всех 10000 значений.

Используйте RANK, как выТеперь.

0 голосов
/ 13 августа 2011

Самый быстрый способ создать список из 50 лучших - использовать автофильтр в Excel, который работает быстрее, чем любой цикл, который вы можете написать.

Вот пример того, как это сделать, если:

  • Строка 1 - столбец заголовка
  • В этом примере столбец G - это строка с рыночной капитализацией

Как это работает: это решение для воздуховодов, но оно работает очень хорошо.

  1. Копирует текущий лист на новый лист с именем «Top 50»
  2. Применяет автофильтр и фильтрует его в порядке убывания (сначала по старшим числам)
  3. Удаляет все строки после 50-й записи
  4. Выберите A1 только для того, чтобы сделать его приятным для глаз:)

Существует множество способов улучшить этот код, например:

  • Склонность предположения о том, где конец столбца
  • Добавьте столбец для ранга и вставьте от 1 до 50

Я думаю, что этот код - хорошее место для начала. Настройте столбец G на столбец с вашими данными и попробуйте!

Sub FilterbyDescending()
' filter row G in desceneding order
Dim filter As Range
Set filter = Range("A1:G100000")
    filter.Sort Key1:=Range("G2:G1000000"), _
    Order1:=xlDescending, _
    Header:=xlYes, _
    Ordercustom:=1, _
    MatchCase:=False, _
    Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End Sub

Sub CreateBackup()

Application.ScreenUpdating = False
'Create the Top 50 sheet, paste current sheet to it
Dim top50sheet As Variant
Application.ActiveSheet.Copy After:=Sheets(Application.Worksheets.Count)
Set top50sheet = Application.ActiveSheet
top50sheet.Name = "Top 50"

Dim rowCount As Long
Dim columCount As Long

Call FilterbyDescending
' Time to delete everything after the top 50
Range("A52").CurrentRegion.Select
rowCount = Selection.Rows.Count
columnCount = Selection.Columns.Count
Range(Cells(52, 1), Cells((rowCount), columnCount)).Delete

Cells(1, 1).Select
Application.ScreenUpdating = True

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...