在Excel中构建工具,作为练习的一部分,我需要根据市值确定前50种证券。
使用RANK()这是一个很容易的事情,但是我有一个超过10,000的宇宙,并且一旦我在这10,000个条目中添加等级,处理其他闪电快速工作簿变得迟钝。
我意识到这种迟缓至少部分是由于Excel需要对条目进行排序才能对它们进行排名所以我想知道要排名的值上的某种索引是否可以加快速度?是否有更好的方法可以通过我不熟悉的Excel功能或使用其他方法来加快速度?
答案 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中使用自动过滤器,这比您可以编写的任何循环都要快。
这是一个如何做到这一点的例子:
工作原理:这是一个管道密封解决方案,但效果非常好。
有很多方法可以改进此代码,例如:
我认为这段代码是一个很好的起点。使用您的数据将列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