エクセルでの成績処理

このQ&Aのポイント
  • エクセル2003で成績処理を行う際のマクロについて教えてください。
  • 表から各教科の点数の上位3位までのクラス別順位表を作成する方法を教えてください。
  • 現在はオートフィルで手作業を行っていますが、応用しやすいマクロがあれば助かります。
回答を見る
  • ベストアンサー

エクセルでの成績処理

こんにちは いつもお世話になっています。 エクセル2003です。 成績処理のマクロを教えてください。 以下の表があります。 NO.   名前   国   算   理   国語クラス  算数クラス  理科クラス 1     A   100   75   80    1       2   2 2     B   70    85   90    2       3   1 3     C   100   75   95    1       1   1 4     D   85    95   85    3       2   3 5     E   75    80   75    2       1   2 6     F   85    70   90    3       2   1 7     G   100   90   80    1       1   3 8     H   95    85   90    2       3   2 9     I   100   85   70    1       3   3 数字がずれてすみません。 A列に連番、B列に名前、C-E列に教科ごとの点数、F-H列に教科ごとの所属クラス 実際は150名分のデータでクラスも多いですが。 この表から各教科の点数の上位3位までのクラス別順位表を作りたいのです。 その際に、順位も名前の左側につけたいです。(同セル内でも、名前セルの左でもかまいません) 同順位であれば連番の昇順で。 つまり 国語1クラス 1 A 2 C 3 G 4 I 国語2クラス 1 H 2 E 3 B という具合に、できれば、別シートにマクロで出すコードを教えてください。 勝手ながら、人数が増えても応用しやすいものだと助かります。 現在はオートフィルでの手作業をしています。

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

  • ベストアンサー
noname#192382
noname#192382
回答No.2

マクロでやってみました。すごく行数が多くて、ここに乗せることが許されるか心配ですが、一応お送りします。シート1のデータをシート2にコピーしてしーと2を使って計算し、答えをしーと3に書くようにしています。 Sub Macro3() ' ' Macro3 Macro ' マクロ記録日 : 2011/2/26 ユーザー名 : ' ' Application.CutCopyMode = False Sheets("Sheet2").Select Range("A1:H10").Select Selection.AutoFilter Selection.AutoFilter Field:=6, Criteria1:="1" Selection.Sort Key1:=Range("C2"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A2:B10").Select Selection.Copy Sheets("Sheet3").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=6, Criteria1:="2" Range("A3:B9").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet3").Select Range("A7").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=6, Criteria1:="3" Range("A5:B7").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet3").Select Range("A12").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=6 Selection.AutoFilter Field:=7, Criteria1:="1" Range("A4:H8").Select Application.CutCopyMode = False Selection.Sort Key1:=Range("D4"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A4:B8").Select Selection.Copy Sheets("Sheet3").Select Range("D1").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=7, Criteria1:="2" Range("A2:B7").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet3").Select Range("D7").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=7, Criteria1:="3" Range("A3:H10").Select Application.CutCopyMode = False Selection.Sort Key1:=Range("D3"), Order1:=xlDesce

その他の回答 (4)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.4です! 続きのコードです。 'ここから前回のコードの続きになります。 For j = 13 To 19 Step 3 For i = 2 To k On Error Resume Next ws1.Cells(i, j) = WorksheetFunction.Rank(ws1.Cells(i, j - 1), _ Range(ws1.Cells(2, j - 1), ws1.Cells(k, j - 1))) Next i Next j For j = 13 To 19 Step 3 For i = ws1.Cells(Rows.Count, j).End(xlUp).Row To 3 Step -1 If ws1.Cells(i, j) > 3 Then Range(ws1.Cells(i, j - 2), ws1.Cells(i, j)).Delete (xlUp) End If Next i Next j For j = 11 To 17 Step 3 Range(ws1.Cells(2, j), ws1.Cells(k, j + 2)).Sort key1:=ws1.Cells(2, j + 2), order1:=xlAscending Next j For j = 11 To 17 Step 3 For i = 1 To ws1.Cells(Rows.Count, j).End(xlUp).Row With ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = ws1.Cells(i, j) If ws1.Cells(i, j + 1) = "" Then .Offset(, 1) = "" Else .Offset(, 1) = ws1.Cells(i, j + 2) & "位" End If End With Next i Next j ws1.Range("I:S").Delete Next H ws2.Columns("A:B").AutoFit For i = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row If ws2.Cells(i, 2) = "" Then ws2.Cells(i, 1).Interior.ColorIndex = 6 End If Next i End Sub 'この行まで こんなんではどうでしょうか? 他に良い方法があればごめんなさいね。m(__)m

imokenpiE
質問者

お礼

tom04 様 ありがとうございました。 無学なもので無茶なお願いをしてしまいました。 大変なお手間を取らせて申し訳ありませんでした。 勉強しながら大切に使わせていただきます。 簡単で恐縮ですが、お礼申し上げます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんばんは! 無理矢理って感じでやってみました。 Sheet1にデータがありSheet2に表示するようにしています。 For~Nextを多用していますので、時間がかかるかもしれません。 尚、人数が増えても対応できると思いますが、科目数が増える場合はコードの手直しが必要になります。 それから、2000文字を超えるようなので2度に分けてコードを投稿してみます。 まず前半のコードです。 Sub test() 'この行から Dim ws1, ws2 As Worksheet Dim H, i, j, k As Long Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") Dim c As Range For Each c In ws2.UsedRange c.Clear Next c k = ws1.Cells(Rows.Count, 1).End(xlUp).Row For H = 6 To 8 For i = 2 To k ws1.Cells(i, 9) = ws1.Cells(1, H) & ws1.Cells(i, H) If WorksheetFunction.CountIf(Range(ws1.Cells(2, 9), ws1.Cells(i, 9)), ws1.Cells(i, 9)) = 1 Then ws1.Cells(Rows.Count, 10).End(xlUp).Offset(1) = ws1.Cells(i, 9) End If Next i Range(ws1.Cells(2, 10), ws1.Cells(k, 10)).Sort key1:=ws1.Cells(2, 10), order1:=xlAscending For i = 2 To ws1.Cells(Rows.Count, 10).End(xlUp).Row ws1.Cells(1, Columns.Count).End(xlToLeft).Offset(, 3) = ws1.Cells(i, 10) Next i For i = 2 To k For j = 11 To 17 Step 3 If ws1.Cells(i, 9) = ws1.Cells(1, j) Then With ws1.Cells(Rows.Count, j).End(xlUp).Offset(1) .Value = ws1.Cells(i, 2) .Offset(, 1) = ws1.Cells(i, 3) End With End If Next j Next i '2000文字を超えるようなのでここで一旦切ります まずはここまで・・・m(__)m

noname#192382
noname#192382
回答No.3

 まくろを全部乗せられませんでしたので続きを少しダブって載せます。 Range("A3:H10").Select Application.CutCopyMode = False Selection.Sort Key1:=Range("D3"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A3:B10").Select Selection.Copy Sheets("Sheet3").Select Range("D12").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=7 Selection.AutoFilter Field:=8, Criteria1:="1" Range("A3:H8").Select Application.CutCopyMode = False Selection.Sort Key1:=Range("E3"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A3:B8").Select Selection.Copy Sheets("Sheet3").Select Range("G1").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=8, Criteria1:="2" Range("A2:H9").Select Application.CutCopyMode = False Selection.Sort Key1:=Range("E2"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A2:B9").Select Selection.Copy Sheets("Sheet3").Select Range("G7").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=8, Criteria1:="3" Range("A4:H10").Select Application.CutCopyMode = False Selection.Sort Key1:=Range("E4"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A4:B10").Select Selection.Copy Sheets("Sheet3").Select Range("G12").Select ActiveSheet.Paste Sheets("Sheet2").Select Selection.AutoFilter Field:=8 End Sub

imokenpiE
質問者

お礼

optimumsoup 様 ありがとうございました。 素人の怖さで無茶な依頼をしてしまいました。 大変お手間を取らせて申し訳ありません。 勉強しながら大切に使わせていただきます。 簡単で恐縮ですが、お礼申し上げます。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

マクロではありませんが 関数の組み合わせで処理してみました 仮に 別シート(シート名 成績順位として)に   A  B   C 1   科目  国 2   クラス 1 3   点数  氏名 4 と準備します。 C1セルに 表示したい 科目  例では 国 C2セルに 表示したい クラス 例では 1 と入れておきます。 実際のデータのシート(仮に シート名 データ として) NO.   名前   国   算   理   国語クラス  算数クラス  理科クラス の後に(仮に J列に) J2セルに =IF(OFFSET(E2,0,MATCH(成績順位!C$1,C$1:E$1,FALSE))=成績順位!C$2,OFFSET(B2,0,MATCH(成績順位!C$1,C$1:E$1,FALSE))-A2/1000,"") 一番下までコピーしておきます。 ここで 成績順位のシートに 科目に 国 クラスに 1と入れた場合 その条件にあった点数が出るはずです。 更に その点数は 微妙に差をつけるため 連番の1/1000を引き算しておきます。 科目とクラスを 算 とか 2 とかにして表示の違いを確認してみてください。 OFFSET関数と MATCH関数を何度も使っていて複雑にみえますが 良く考えてみると あっそ~ と思われると思います。 それぞれの関数の意味は Helpで確認してみてください。 もし意味が難しかったら K列に =MATCH(成績順位!C$1,C$1:E$1,FALSE) と入れて下までコピーしてみてください。 出したい科目のデータが左から何列ずれた列にあるかが 数字で出ます。 J列は =IF(OFFSET(E2,0,K2)=成績順位!C$2,OFFSET(B2,0,K2)-A2/1000,"") とすることも出来ます。 あとは 成績順位のシートの B4セルに =IF(ISERROR(LARGE(データ!J:J,ROW(A1))),"",LARGE(データ!J:J,ROW(A1))) C4セルに =IF(B3="","",INDEX(データ!B:B,MATCH(B3,データ!J:J,FALSE))) といれて下までコピーしてください。 成績順に点数と名前が出ます。 点数が端数まで出るので 表示形式で 小数点以下を表示しない にすればOKです。 シートも データと結果表示のための成績順位というシートの2枚で完成できます。 データを入れるだけで結果が出ますしマクロで実行するより使いやすいと思います。 印刷などで 列や行を挿入したときも自動で関数式が変わってくれるので便利です。

imokenpiE
質問者

お礼

hallo-2007 様 ありがとうございました。 関数を作っていただき助かりました。 関数ではできないと思い込んでいたものですから。 マクロより使いやすいとのことで勉強になりました。 大切に使わせていただきます。

関連するQ&A

  • excelでテストの成績処理をしたいのですが

    私は塾の講師をしているのですが、毎日、生徒に5教科の小テストを行っています。 それで、毎日、5教科のそれぞれの点数と合計点数を打ち込んで、壁に張り出しています。 そのデータは、一つのブックに日付けごとでシートを分けて保存してあります。 今回、その日付別の表のデータから、毎回の成績を生徒別の表に変えて、プリントにして生徒一人一人に配ろうかと考えています。ですが回数と人数がとても多いので、一人一人「コピー→貼り付け」を繰り返していたのでは時間がかかりすぎます。 なので、マクロで自動的にやりたいと考えたまではいいんですが、実際どういうプログラムにすればいいのか皆目検討がつきません。 表の形はすべて、A列に順位、B列に名前、C列からG列までが各教科の点数、H列にSUM関数で合計点数。最後の行に各教科と合計の平均点を関数で出している。という表です。 表はすべて名簿の順にソートしてあります。 これらの表から一人一人の毎回の点数を取り出して、自分の毎回の点数が縦に並んでいる別の表を作成したいのです。 どういうやり方をすればいいのでしょうか?

  • Excel 成績表の作成

    クラス40名の成績を4月を基準に半期の順位を エクセルで順位つけしたいと思います。 今は月別にトップから名前、点数をひとつの エクセルにまとめてあります。     4月     5月   ・・・・ No. 名前 点数 名前 点数  ・・・ 1  Aさん 100 Cさん 100  2  Bさん  95 Bさん  94  3  Cさん  92 Aさん  90   これを4月の順位を基準に、5月以降の順位を つけていきた No. 名前 4月 5月  1  Aさん 1  3  2  Bさん 2  2  3  Cさん 3  1   となるようにしたいのですが、どのような関数を 用いると、作成できますでしょうか。 ご教授ください。

  • エクセルでの連番の処理

    お世話になります。 1行目に入力されたデータをルールに沿って2行目以下にどんどん追加していきたいと思っています。 まずD1、E1のセルに数字を入れます。 例:D1に3、E1に25 を入れてマクロを実行するとD列の2行目以下に3,4,5,6…25と連番で入力出来るようにしたいのです。 この例ではD列は24行目まで入力されています。そこで2行目から24行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。なおA,B,C列は数字、文字列どちらもあります。空白の場合もあります。 この状態でA~E列の1行目のデータを変更し、仮にD1を2、E1を15としたとします。ここで再度マクロを実行すればD25に2、そして順に連番が入りD38に15が入るようにします。 同時に25行目から38行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。 これの繰り返しです。 つまり2行目以下のD列で空白の行以下にどんどん連番を入れていく具合です。 前提としてD1、E1は整数しか入りません。またE1の数字はD1より大きいです。ただD1,E1に同じ数字が入った場合、その数字の1行分だけが入力されるようにします。 以上の処理が自動化できるマクロはできますか? アドバイス願います。

  • Excelで順位をつけたい

     お世話になります。よろしくお願いいたします。    エクセルでの順位の付け方です。  例えば、  国語、数学の2教科のテストの結果で順位をつけるとします。     列A  列B   列C   列D 行1      国語   数学  合計点 行2  A君  40    60   100 行3  B君  50    50   100 行4  C君  60    40   100  上記のような結果の時に普通に「RANK」を使うと、3人全員が「一位」になりますが、  合計点が同じ場合は、国語の点数が良い者から、「一位・二位・三位」になるようにしたいのです。  したがって、C君が「一位」・B君が「二位」・A君が「三位」になるようにするには、 どのようにすればよろしいですか?お教えください。

  • 計算式教えてください

    エクセル2010 A      B    C     D    E 名前   科目   科目   合計  順位がはいっています。 別の表のB列とC列に1位から5位までの合計点数と名前をいれたいのですがどういう式にすればよいでしょう?合計と順位は関数をいれてあります。 A      B    C      順位   合計   名前

  • エクセルでの成績処理の式について

    Aが名前、Bが中間、Cが期末、Dが平常点の列とします。BCが35%ずつ、Dが30%としてE列に合計点を返す式を教えて下さい。(例えばB~Dが全て100とした場合、E列の値も100になる式です)

  • エクセルで成績処理をするのに・・・

    いつもお世話になっております。 文章だけで書くのは難しく、伝わりにくいかもしれませんが、今、このようなことで悩んでいます。いい方法があれば、教えてください。 成績一覧表をエクセルで作りました。 B1のセルから横に(C1、D1…と)、氏名を入力しました。 A2のセルから下へ(A3、A4…と)、評価項目を入力しました。 そして、氏名と、項目とのクロスする部分に◎、○、△のいずれかの記号を入力しました。 1学期にこれを作り、2学期には、1学期のものをコピーして、評価した部分(◎、○、△)だけを全部クリアし、新たに2学期の分を入力し直しました。 3学期も、同じようにして、3学期の分を作ろうと思うのですが、それとは別に、一人の子について、1学期、2学期、3学期が一度にわかるようなものも作りたいと思います。 つまり、例えばB1、C1、D1のセルを結合し、ここに氏名を入れ、B2には1学期の評価、C2には2学期の、D2には3学期の評価が入るようにしたいのです。新たに作るよりもと思い、1学期のものを加工したのですが、まず、列を2列ずつ挿入し、次に氏名のところを結合し、次に一人ずつ2学期の評価をコピーして、加工したシートに貼り付けるという作業を行いました。これですと、クラスの人数分、同じ作業を繰り返すことになりますよね。マクロを使えば何とかなるのかもしれませんが、マクロについては全く知識がないので、もっといい方法があればと思います。 わかりにくいかもしれませんが、いいアドバイスがあれば、よろしくお願いします。

  • エクセルの並べ替えについておねがいします。

    名前 点数1 点数2 合計 点数1順位 点数2順位 総合順位 A  20  20  40   3     2     2 B  30  10  30   2     3     3 C  40  30  70   1     1     1 のような表があります。 総合順位順に並べ替えて別シートに表示したいのですが、 順位  名前 合計 1   C  70 2   A  40 (このように)    どうしたらいいでしょうか。 ちなみに点数1、2、合計も 表示できれば幸いです。 あと、別件で、「#N/A」とはどんなエラーメッセージなんでしょう? 表示させないようにするにはどうしたらいいですか。 宜しくお願いします。 

  • エクセルでの順位の並び替えについて

    現在以下のような表があります。 順  位  1  2  4  2 点数合計 15  10  8  10 内  訳  (省略) 名  前 A氏 B氏 C氏 D氏 (内訳を入れると合計点数及び順位がでる) これを 順位  名前 1位  A氏 2位  B氏 2位  D氏 4位  C氏 という表に並びなおしたいのですが どのようにしたらよろしいでしょうか 現在は 順位  名前 1位  A氏 2位  B氏 3位  #N/A 4位  C氏 となってしまっております。 当方いろいろ調べつつがんばって表作っておりますが ど素人のため意味もわからず作っております。 初めての質問ですのでいろいろとご迷惑をおかけするかもしれませんがなんとか教えていただけますようよろしくお願いいたします。

  • エクセルで、セルに同じ数字が入っている列を表示したいんですが?

    初心者です。よろしくお願いします。 エクセルで検索したいと考えているんですが、下記のようなことは可能でしょうか? Aの列に人の名前を記入 Bの列に国語の点数を入力 Cの列に算数の点数を入力 BとCの点数が同じ人を調べることができるようにしたいのです。 カーソルが該当するAの列に飛ぶ形でもけっこうですし、理想的には 該当したデータを一覧で表示できればより良いのですが・・・ データが300以上もあるため、調べるのが大変です。 たぶんマクロなどで可能なのかとは思うのですが、よくわかりません。 どのように記述したらよいか、教えていただけませんか?

専門家に質問してみよう