Excel VBAについてご質問させてください。 素人でVBAはまだまだ勉強中でよくわかりません。 質問に対しての質問や批判は必ずくるのでわざわざ回答されなくて大丈夫です。
Excel VBAについてご質問させてください。 素人でVBAはまだまだ勉強中でよくわかりません。 質問に対しての質問や批判は必ずくるのでわざわざ回答されなくて大丈夫です。 説明を分かりやすくするために簡単な表を添付します。 数字ばかりですみません。 左の表は元データになります。 1~15の赤い数字は固定です。 1列目~5列目はそれぞれの回数です。 回数はその合計です。 順位は回数の多い順です。 右の表は各列の赤い数字のベスト5になります。 上段は左の表と同じ固定の赤い数字 下段はそれに対応した回数 同一回数の場合は若い順位から(回数の多い順)で右の表のようにExcelVBAで実現させたいです。 あくまでもコードで出したいです。 WorksheetFunction.Largeを使って順番で並べることまではできるのですがこの後が続きません。 このレベルなのでほぼ限界です。 また、この逆のワースト5も出したいです。 どうかご教授をよろしくお願いいたします。
Excel | Visual Basic・191閲覧・250
1人が共感しています
ベストアンサー
単純なソートアルゴリズムを実装してみました。 0.[0][0][0][0][0] 1.[5][0][0][0][0] 2.[8][5][0][0][0] 3.[8][5][3][0][0] 4.[8][5][4][3][0] 5.[10][8][5][4][3] 以下同様です。 参考になれば幸いです。 Sub 順位表() '変数定義 Dim InputRange As Variant Dim OutputRange As Range '設定変更箇所 Set InputRange = Range("D2:H16") Set OutputRange = Range("K2:T11") '主処理 Dim InputData As Variant InputData = InputRange Dim OutputData(1 To 10, 1 To 10) As Integer Dim i As Integer Dim j As Integer Dim k As Integer Dim l As Integer For i = 1 To 5 '列目 For j = 15 To 1 Step -1 '番号 For k = 1 To 5 '位 'ワーストの際はここの<=を>=に入れ替えてください。 If OutputData((i * 2 - 1), k * 2 - 1) = 0 Or _ OutputData((i * 2), k * 2 - 1) <= InputData(j, i) Then For l = 4 To k Step -1 '順位が更新される場合はずらす OutputData((i * 2 - 1), l * 2 + 1) = OutputData((i * 2 - 1), l * 2 - 1) '番号 OutputData((i * 2), l * 2 + 1) = OutputData((i * 2), l * 2 - 1) '回数 Next l '値を仮入れする OutputData((i * 2 - 1), k * 2 - 1) = j '番号 OutputData((i * 2), k * 2 - 1) = InputData(j, i) '回数 Exit For End If Next k Next j Next i OutputRange = OutputData End Sub
1人がナイス!しています
遅くなりました。 うまくいきました。 ありがとうございます。 これでも十分にいけるのですが、赤い数字の回数が同一の時、 赤い数字の若い順ではなくて隣の順位の若い順に変更できますでしょうか? 図々しいお願いで大変申し訳ございません。 よろしくお願いいたします。
質問者からのお礼コメント
ご丁寧な回答ありがとうございました。 本当に助かりました。 ほかの皆さんも参考にさせていただいています。 感謝いたします。
お礼日時:6/29 22:35