Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Excel中加速RANK()_Excel_Vba - Fatal编程技术网

如何在Excel中加速RANK()

如何在Excel中加速RANK(),excel,vba,Excel,Vba,在Excel中建立一个工具,作为练习的一部分,我需要根据市值确定前50名证券 使用RANK()可以很容易做到这一点,但是我有一个超过10000个的世界,当我将RANK添加到这10000个条目上时,对一个本来轻松的快速工作簿的处理就会变得缓慢 我意识到这种迟钝至少在一定程度上是因为Excel需要对条目进行排序,以便对它们进行排序,所以我想知道,对要排序的值进行某种索引是否可以加快速度?有没有更好的方法来实现这一点,或者通过我不熟悉的Excel函数,或者使用其他方法来加快速度 您可以按照您想要的方式

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

使用RANK()可以很容易做到这一点,但是我有一个超过10000个的世界,当我将RANK添加到这10000个条目上时,对一个本来轻松的快速工作簿的处理就会变得缓慢


我意识到这种迟钝至少在一定程度上是因为Excel需要对条目进行排序,以便对它们进行排序,所以我想知道,对要排序的值进行某种索引是否可以加快速度?有没有更好的方法来实现这一点,或者通过我不熟悉的Excel函数,或者使用其他方法来加快速度

您可以按照您想要的方式对值进行排序,然后使用类似ROW()的函数来简单地按顺序分配秩(尽管您可能需要付费做一些特殊的事情来打破“关系”)

如果您不想对值进行排序,这取决于您需要什么

案例1——您实际上不需要排名,只需要确定前50名的值

假设您的值位于单元格A1:A10000中

在另一个单元格(如E1)中,输入一个公式,计算前50个值的“截止值”,如下所示
=百分位($1:$a 10000,50/计数($a$1:$a$10000))


在单元格B1中,输入一个公式,如果值低于“截止值”,则返回A1中的值,或者输入一个空字符串,否则类似于这样的
=if(A1生成前50名列表的最快方法是使用Excel中的自动筛选,这比您可以编写的任何循环都快

下面是一个如何进行此操作的示例,假设:

  • 第1行是标题列
  • 在本例中,G列是带有市值的行
工作原理:这是一个管道胶带解决方案,但效果非常好

  • 将当前工作表复制到名为“Top 50”的新工作表
  • 应用自动筛选并按降序筛选它(首先是最高数字)
  • 删除第50个条目之后的所有行
  • 选择A1只是为了美观:)
  • 有很多方法可以改进此代码,例如:

    • 关于列结束位置的Sloopy假设
    • 为rank添加一列,并插入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
    

    您如何使用
    RANK
    公式?您是否为前50名复制了
    排名
    ?也许我们可以找到一个好的UDF解决方案,因为vba可以对数组进行排序,然后显示值(我相信Issun会喜欢设计一个:)?你能告诉我们你是如何使用这些结果的吗?您介意我们在单个单元格中给出结果,然后您将不得不拆分吗?以后我将如何使用它或如何实现RANK()?关于第1点,我使用排名作为“ID”,随后将前50名拉到另一张表中。关于实施,它只是排名(单个市值、市值数组)。我对VBA解决方案有一些想法,但只想澄清几件事:我认为市值数据只是一个浮点数?如果第50和第51个rankness的值相同,您希望在off情况下执行什么操作?最后,您是否需要在新的工作表上添加一行来写入排名?这也是生成前50名工作表的主要目的,或者有一个持久性函数来标识列表中每个项目在任何给定时间的排名?(1)是的,市值是一个浮点数。(2) 假设关系不是问题——考虑到两家公司的市值恰好为25205.03亿美元的可能性非常小。(3) 后续工作表上的“排名”列并不重要,但如果可能,我希望如此。(4) 好吧,按照我现在设置的方式,我使用“排名”列作为ID,将前50名拉到不同的工作表中。所以,让我们假设填充一个单独的工作表。有趣的想法,我感谢你的回答。就我而言,你的百分位/等级建议应该有效。我将把这个打开一段时间,看看是否还有其他想法。所以你只需要将前50名的行粘贴到另一张纸上?对于您用来建立排名基础的列,数据类型是什么?你能举一个例子吗?如果你要把前50名复制到另一张工作表上,一个快速而简单的解决方案可能是按照我最初的建议首先对数据进行排序。问题:排名列的数据类型是float/decimal,是的,我需要在单独的工作表中收集前50/100等(这是在别处指定的变量)。我不知道你为什么要求助于VBA,因为唯一的障碍是排名的速度。布莱恩:我没有复制/粘贴任何东西。实际上,我使用“rank”列作为ID,通过索引/匹配将前50个条目拉入相邻的工作表。