• ベストアンサー

エクセルで自動的にセルを移動したい場合

例えば、A、B、Cという三つのランク付けをする必要があり、そのランクが日々変化する場合、セルの上位にAランクのもの、その下にBその下にCと並べるとすれば、どのようなマクロ(計算式)が必要でしょうか? 例)昨日Cランクであったユーザーが、今日の評価ではAに変わった。ランクのセルをCからAと書き換えるだけで、下位にあったこのユーザーの表示を上位に上げたい。 恐れ入ります。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 134
  • ベストアンサー率27% (162/600)
回答No.1

前提として、以下のようにします。 1.関数により、ご希望に近いものを作る。 2.既存の表の前に4列挿入する。 3.ランキングのシートと入力シートは、別とする。 4.ユーザーは99人以下とする。  ということで、A~D列までを計算用に使用させて頂きます。 E列をユーザー名、F列をランクとします。 A列に入力する関数 =if(f2="","",if(f2="A",1,if(f2="B",2,if(f2="C",3,"")))) これにより、ABCランクを1,2,3に変換させます。 B列に入力する関数 =if(a2="","",countif(a2:$a$2,a2)) これにより、ランクA,B,Cが何個目かを表示させます。 C列に入力する関数 =if(a2="","",a2*100+b2) これにより、ランクAを100番台、Bを200番台、Cを300番台として連番を表示させます。 100人をこえる場合は「a2*1000+b2」 とでもして下さい。 D列に入力する関数 =if(a2="","",rank(c2,c2:c301,1)) これにより、C列の数字を小さい順に付番します。 A~Dの関数を下のセルに、コピーします。 シート2に目的の表を作るとします。 1行目を見出しとして、2行目から、データとします。  また、参照元をシート1とします。 A2セルに =vlookup(row()-1,sheet1!$e$2:$f$300,2,0) とするとAランク最初のユーザー名が表示されます。 以降は、表のフォーマットに合わせて、VLOOKUP文のパラメーターを調整して下さい。 なお、入力シートA~D列は、「非表示」にしておくと、邪魔にならないと思います。 また、 =if(iserror(vlookup(row()-1,sheet1!$e$2:$f$300,2,0),"",vlookup(row()-1,sheet1!$e$2:$f$300,2,0)) というふうに、エラー回避をさせると、より見やすくなるでしょう。 いかがでしょうか?

nazokun
質問者

お礼

ご丁寧なご回答をいただきまして、誠にありがとうございます。 早速この後チャレンジしてみます! 簡単な言葉ですみません。

その他の回答 (2)

  • mz80
  • ベストアンサー率46% (13/28)
回答No.3

ランクのセルが更新されたらソートすればよいと思います。マクロは、ランクのsheetのchangeイベントプロシージャとして作成します。 ソートするので、一応、以下を前提、制約があります。 1.見出しが1行目に1行ある。2行目以降をソート対象とする。 2.ランク順、ユーザー名順にソートする。このため、ユーザーを新規追加するとソートが実行さる。 3.同一ランクの同一名のユーザーがどの順になるかは、excelのソートのロジックに依存する。 マクロは… Private Sub Worksheet_Change(ByVal Target As Range) 'ランク、ユーザー変更ならソート(昇順) If ((Target.Column = 1) Or (Target.Column = 2)) Then Range("a:b").Sort Key1:=Range("A2"), Order1:=xlAscending, _ Key2:=Range("B2"), Order2:=xlAscending, _ Header:=xlYes, _ OrderCustom:=1, _ MatchCase:=True, _ Orientation:=xlTopToBottom, SortMethod:=xlStroke, _ DataOption1:=xlSortNormal, DataOption2:=xlSortNormal End If End Sub

nazokun
質問者

お礼

ご丁寧なご回答をいただきまして、誠にありがとうございます。 早速この後チャレンジしてみます! 簡単な言葉ですみません。

  • 134
  • ベストアンサー率27% (162/600)
回答No.2

訂正 >また、 > >=if(iserror(vlookup(row()-1,sheet1!$e$2:$f$300,2,0),"",vlookup(row()-1,sheet1!$e$2:$f$300,2,0)) > >というふうに、エラー回避をさせると、より見やすくなる>でしょう。 これでは、カッコが足りませんでした。 >=if(iserror(vlookup(row()-1,sheet1!$e$2:$f$300,2,0)),"",vlookup(row()-1,sheet1!$e$2:$f$300,2,0)) と、iserror文のカッコ閉じを追加して下さい

関連するQ&A