如何在Excel中加速RANK()

时间:2011-08-10 18:17:29

标签: excel excel-vba vba

在Excel中构建工具,作为练习的一部分,我需要根据市值确定前50种证券。

使用RANK()这是一个很容易的事情,但是我有一个超过10,000的宇宙,并且一旦我在这10,000个条目中添加等级,处理其他闪电快速工作簿变得迟钝。

我意识到这种迟缓至少部分是由于Excel需要对条目进行排序才能对它们进行排名所以我想知道要排名的值上的某种索引是否可以加快速度?是否有更好的方法可以通过我不熟悉的Excel功能或使用其他方法来加快速度?

2 个答案:

答案 0 :(得分:4)

您可以按照您想要的方式对值进行排序,然后使用像ROW()这样的函数来简单地按顺序分配排名(尽管您可能需要付出特别的代价来打破“关系”)。

如果您不想对值进行排序,则取决于您的需求......

案例1 - 您实际上并不需要排名,但只需要确定前50个值。

假设您的值在单元格A1:A10000中。

在另一个单元格中,例如E1,输入一个公式,计算前50个值的“截止”,如=PERCENTILE($A$1:$A$10000,50/COUNT($A$1:$A$10000))

在单元格B1中,输入一个公式,如果它低于“cutoff”,则返回A1中的值;如果是=IF(A1<=$E$1,A1,""),则输入一个空字符串。

将此公式复制到单元格B2到B10000。

A列中前50个值的行在B列中将包含非空值。

如果有联系,可能会有超过50行。

案例2 - 您需要排名,但仅限前50名。

按照案例1的说明进行操作,然后在单元格C1中输入一个公式,计算B列中非空白值的排名,如=IF(B1="","",RANK(B1,$B$1:$B$10000))

将此公式复制到单元格C2到C10000。

A列中排名前50的行将在C列中排名。

同样,如果有联系,可能会有超过50行。如果存在关系,则排名值也会存在差距。

案例3 - 您需要所有10000个值的等级。

像现在一样使用RANK。

答案 1 :(得分:0)

生成Top 50列表的最快方法是在Excel中使用自动过滤器,这比您可以编写的任何循环都要快。

这是一个如何做到这一点的例子:

  • 第1行是标题列
  • 在示例中,列G是具有市值上限的行

工作原理:这是一个管道密封解决方案,但效果非常好。

  1. 将当前工作表复制到名为“Top 50”的新工作表
  2. 应用自动过滤器并按降序过滤(最高编号)
  3. 删除第50个条目后的所有行
  4. 选择A1只是为了让它赏心悦目:)
  5. 有很多方法可以改进此代码,例如:

    • 关于列末尾的斜率假设
    • 添加排名列并插入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