2016-11-25 209 views
0

我很新的VBA所以请去容易在我身上。VBA的Excel WorksheetFunction.Rank问题

我有一个数字120个000行久,我想在12的增量排名的名单 - 这意味着前12个数字应该从1排至12时,下列12个号码从1到12等。

我知道如何在Excel中使用Rank函数每次增加一次,但由于它需要我永远手动完成,所以我决定尝试编写一个宏来为我做这件事。

这是据我已经来了。

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个细胞。我不认为这是相当你要找的人...

以下假设你的数据在下半年启动,并放置在一列12的各块内的排名的效果是这样的越多,你是什么寻找?

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

嘿!再次感谢! – storaxe