2016-11-25 239 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