2016-11-25 8 views
0

私はVBAの新機能ですので、簡単にどうぞ。VBA Excel WorksheetFunction.Rank issue

私は12のインクリメントでランク付けしたいと思う番号の120,000行のリストを持っています - 最初の12の数字は1から12まで、12から1までの12の数字にランク付けされるべきです。

ランク関数を使って、Excelで1回ずつインクリメントする方法はわかっていますが、手動で行うのは永遠に私にかかるので、私のためにマクロをコーディングしようと決めました。

これまでのところ、これは私が来たところです。

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

あなたの「数字」は、彼らがに属する列と保持する必要がありますどの列、列(他の連続した空白のセルで区切られた12個の細胞のグループ、...)に沿って点在している方法についてのいくつかの詳細を記入してください彼らのランク – user3598756

答えて

0

ここにいくつかの問題:

ActiveCellのは、読み取り専用のプロパティです。 ActiveCellを設定するのではなく、.Activateを使用して移動します。

Rankには、ルックアップ値としてのセル(または値)、その内のランクを見つける範囲、および昇順または降順のランクを設定する値の3つの引数があります。あなたはそれを3つの細胞に渡しました。

最後のコード行は、スプレッドシートに影響を与える唯一のコード行で、別の12個のセルに対してH列の最後の項目をコピーします。私はこれがあなたが探していた効果ではないと思っています...

データはH2で始まり、各ブロック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

素早く答えてくれてありがとう! 1つの問題だけで治療を受けました。順位を逆にする必要があります。今では最も低い数字が最も低いランクになりますが、最も高い数字が最も低いランクになるようにしたいと思います。何か案は? – storaxe

+0

関数の最後に1ではなく0を使用します。前述したように、Rankに渡す3番目のパラメータは順序を決定します。 – bobajob

+0

Gotcha!再度、感謝します! – storaxe