ここから本文です

vbaマクロについて質問です。 マクロ超初心者です。

pan********さん

2012/5/1111:15:37

vbaマクロについて質問です。
マクロ超初心者です。

問題は
セルA:46
セルA:73
セルA:29
セルA:38
セルA:85

にセルB1~5までに順位をつけなさい。という問題です


VBAマクロの式を教えてください。お願いします。

補足for i = 1 to 5 などを使った感じでお願いします。

閲覧数:
623
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

har********さん

2012/5/1114:26:59

For Nextを使う場合、大きい小さい順かによって違うのですがこんなのは。

Sub sample()
Dim i As Integer
For i = 1 To 5
Range("B" & i).Value = WorksheetFunction.Rank(Range("A" & i).Value, Range("A1:A5")) '大きい順の場合
'Range("B" & i).Value = WorksheetFunction.Rank(Range("A" & i).Value, Range("A1:A5"), 1) '小さい順の場合
Next
End Sub




数式を使うと実質1行で済みます。

Sub sample()
Range("B1:B5").Formula = "=RANK(A1,A$1:A$5)" '大きい順の場合
'Range("B1:B5").Formula = "=RANK(A1,A$1:A$5,1)" '小さい順の場合
Range("B1:B5").Value = Range("B1:B5").Value '式を値にする
End Sub

質問した人からのコメント

2012/5/16 14:01:03

みなさん協力ありがとうございます。harlequin2012さんさんをベストアンサーにさせていただきます。

ベストアンサー以外の回答

1〜1件/1件中

tss********さん

2012/5/1115:09:04

勉強されているみたいなので、

ワークシート関数を使用しない方法をひとつ、

Sub sample()

Dim i As Integer, j As Integer
Dim Rank As Integer

For i = 1 To 5

Rank = 1

For j = 1 To 5

If Cells(i, 1) <> Cells(j, 1) Then

If Cells(i, 1).Value > Cells(j, 1).Value Then
Rank = Rank + 1
End If

End If

Next j

Cells(i, 2).Value = Rank

Next i

End Sub

こちらは、総当たりで確認して順位を付けて行っています。

ループの中で、

1→1,2,3,4,5
2→1,2,3,4,5
3→1,2,3,4,5
4→1,2,3,4,5
5→1,2,3,4,5

と確認しています。(数値はA列のセルです。)

このループの中で、
自分と同じセルを確認する時はスルーして、
自分より小さい数値の場合は、RANKを+1させてる感じです。

ちなみにこのコードは昇順でのRANK付けを行っています。
降順でのRANK付けにしたい場合は、

If Cells(i, 1).Value > Cells(j, 1).Value Then



If Cells(i, 1).Value < Cells(j, 1).Value Then

とすると降順でのRANK付けが可能になります。
(<>を変更するだけです。)

このようにワークシート関数を使用しなくてもできますが、
この場合、データ量が増えてくると処理に時間がかかってしまいますので、
関数の使用も考えながらコードを作成するといいと思います。

総当たりさせるより関数を使用した方がはるかに処理が早いケースはあります。

以上、こんな方法もあるんだな。
って感じで確認してみてください。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる