• ベストアンサー

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

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

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

  • ベストアンサー
回答No.5

> 順位の項を最後の列に付け加えようと思ったのですが、 vlookup関数ではB列で検索してA列を返すことは出来ません。そうい う時はmatch関数で検索値を見つけた場所を返してもらい、そこからA 列の値を引っぱり出します。 =INDEX(INDIRECT("[日々の成績]"&TEXT($B6, "m月d日")&"!"& "$a:$a"), MATCH($H$3,INDIRECT("[日々の成績]"&TEXT($B6, "m月d日 ")&"!"&"$B:$B"), 0)) といった感じですね。あぁ、なんだか長くて嫌になってきた。A列あ たりに非表示で ="[日々の成績]"&TEXT($B6,"m月d日")&"!"&"" とかやっといて、 =VLOOKUP($H$3,INDIRECT($A6&"$B:$E"), 4, FALSE) =INDEX(INDIRECT($A6&"$a:$a"), MATCH($H$3,INDIRECT($A6& "$B:$B"), 0)) ですませたい気持ち。 > なにぶんエクセルは全部独学で、 私も独学です。ズボラな性格なので本を買って読んで勉強するなんて とんでもないです。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

>簡単にうまくいきました。と言うことですので、今更言うべきことはないようですが、関数で解決できたから良かったものの、私にはそう簡単といえるかどうか???です。 エクセルはとっつきやすく、データが見えたまま処理できて良いのですが本件のように、レコードを組替えて(クラス別->個人別など)加工しようとするととたんに難しくなります。現状のファイルを利用しなければならない本件の解決には役立ちませんが、 (1)成績管理ソフトを探すことです。ソフトは作る時代でなく、使う時代です。各学校、各先生は必ず何かを使っているものとおもいます。 (2)自分で自由にやるなら、今後はアクセスなどの利用をお勧めします。 先生ならアカデミックパック(ソフト)が12000円で買えます。 一般に、関数の利用でレコードを検索し抜き出してくる解決は相当複雑になり、思いつくこと、理解することも難しいものになりがちです。 ある時のニーズでは、クラス別の成績表がピッタリですが 日付順にワークシートを作ったと言うのも他への変更を難しくしています。アクセスなら目的別にデータを固定してデータを持つので無く、後のことも考えて、汎用的に(緩い秩序で)データレコードを記録するでしょう。 そして(A)必要なものを抜き出す。例えばテスト日とか 何回目テストとか、ある科目とか。(B)そして集計する。順位を振る、平均を出すなど加工をする(C)最後に印刷する、表示する。などを行います。データベースソフトは(A)に適した機能があります。 今後はそういう方向にするにしても、今纏まって持っている情報を使って何とかしなければならないわけですが。 (3)そこでオフラインバッチ処理の方法を述べます。 これは必要な時に毎回時間をかけて処理するので、その後の変更は盛りこまれていないですが、ソートを多用する方法で、わかりやすく、データが多いとトータル処理時間が早いです。ワークシートのデータを1つのファイルデータにまとめます。その際見出しや集計行が邪魔ですので省きます。 一本化した後に、生徒番号順(かつ日付け順)にソートします。これでテストのレコード(エクセルで行に相当)は生徒別に固まります。 そして初めからそのファイルを読んで生徒番号が変るまで行(毎回テスト成績)を印字します。 生徒番号が変ると、前の生徒の合計を出したり、平均を出したりの処理をして印刷した紙を排出します。そして次ぎの生徒の紙シート印刷にかかります。 見出しや罫線などは、プログラムで印刷します。 またはエクセルの見だし付き罫線表の行のデータ用セルにデータをセットし、読んだレコードの生徒番号が変ると、前の生徒分をPrintOutし、データ範囲をクリアします。差し替え印刷的な処理です。 シートの演算式は使えます。しかしVBAの利用になります。

回答No.4

元になる成績表が「日々の成績」ブックに「8月5日」、「8月6日」の ように日付をシート名として整理されているとします。 新しく「個人成績」ブックを作り、シート名を生徒の氏名にします。 もちろん、配付する時のためにどこかのセルに =MID(CELL("filename", A1),FIND("]",CELL("filename", A1))+1,99) のようにしてシート名を取り出します。例としてH3にしておきまし た。 「個人成績」ブックのメインは日付と各教科成績の列ですね。日付は 手入力して下さい。日付をB6に書いたとしてシート名の生徒の該当す る日の1教科めの成績は、 =VLOOKUP($H$3,INDIRECT("[日々の成績]"&TEXT($B6, "m月d日")&"!"& "$B:$G"), 2, FALSE) となります。以下第3パラメータを増やしていくと、2教科目以降も表 示されます。 1日分出来たらオートフィルを駆使して1人分完成させ、後はシートを 複製してシート名を書き換えれば全員分完成します。

composer
質問者

補足

ありがとうございます。簡単にうまくいきました。 あとひとつ、順位の項を最後の列に付け加えようと思ったのですが、順位の項は前述したようにA列にあるので、数値を増やしていくだけでは表示されません。負の値を入れてみたら、「#VALUE」と表示されます。 この場合どうすればいいのでしょうか? なにぶんエクセルは全部独学で、ヘルプを頼りに今までやってきたのでそろそろちゃんと勉強したいと思っています。いろいろな関数やVBとか。お勧めの本などあったらお教え願えませんか?

  • mohenjo
  • ベストアンサー率37% (125/335)
回答No.3

No.1の方が言われる様に日付フィールドを設け、1枚の シートで1行目を、日付、順位、名前、・・・・と見出し にする場合(C列が名前)ノーマルなブック仕様(シート名)でSheet4以降に各自のデータが出る筈ですが! Sub test() Dim rngS As Range Set rngS = ActiveSheet.UsedRange Dim rngT As Range Set rngT = Sheets(2).Range("A1:A2") Dim rngI As Range rngS.Columns("C").AdvancedFilter action:=xlFilterCopy, _ copytorange:=rngT.Range("A1"), unique:=True For Each rngI In rngT.Worksheet.Range(rngT.Range("A2"), rngT.End(xlDown)) rngI.Copy rngT.Range("A2") rngS.AdvancedFilter action:=xlFilterCopy, criteriarange:=rngT, _ copytorange:=Worksheets.Add(after:=Worksheets(Worksheets.Count)).Range("A1"), _ unique:=False Next rngI End Sub  思惑違いならすいません。

  • lilact
  • ベストアンサー率27% (373/1361)
回答No.2

もっとよい方法があるかもしれませんし、マクロではありませんが。 個人の表を作るシートを個人シートとして、日付ごとのある人のもとデータがA1から始まっているとしたら。 個人シートのあるセルに「=」と入力してからある日付のシートA1のセルをクリックしてエンターを押します。 そのセルを「+」ポインター状態で右にドラッグしていけば一人分のある日の順位から平均までがコピーされます あるセルの下のセルにも「=」と入力して、別の日のシートA1のセルをクリックしてエンター。それを右にドラッグ。これを日付分やります。 こうやって、一人分の複数のシートにあるデータをまとめます。 この一人分のデータを範囲選択して、下の空きスペースに人数分貼り付けます。もとデータの行番号が飛び飛びになりますので、あとで「置換」を使って一人ずつ修正します。 これで、個人ごとの別々のシートにあるデータが人数分の個人の表にまとまります。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

日付毎にシートを別けずに、日付フィールドを加えて同一シートにした方が処理しやすいと思います。 例えば 日付 順位 名前 国語 英語 算数 理科 社会 合計 平均 Accessとかでやった方が無難な気もしますし。。

関連するQ&A

  • excelでの成績処理

    ある一人の生徒では、様々な観点の得点を入力して、それを別のシートに表として表して、得点の合計が何点以上なら5段階の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 という具合に、できれば、別シートにマクロで出すコードを教えてください。 勝手ながら、人数が増えても応用しやすいものだと助かります。 現在はオートフィルでの手作業をしています。

  • エクセルでも三四郎でもいいんだけど、成績表を出したいのぉ

    小さな進学塾に勤めてます。で、毎週行う英・数・国のテストの結果を、毎月集計して、クラスごとに平均点と順位を出したいんですね。あと、個人成績表も。だけど、教科によってクラスが違ったりする子もいるんで、シートにしにくいんです。 できれば、おおもとのデータ(生徒の名前、保護者名、住所とか全部入ったもの)を使ってなんとか1枚のファイルで作りたいんです。 で、三四郎で言うVLookupとかも使ってみたんですけど、うまくいきません。 エクセルだと関数がよくわかんないし、ソートを使おうにもいちいち1教科出すたびに、結局メモしなくちゃならないんで、なんとかならないかなぁと思って。 誰か、その手のソフトとかでもご存じの人はいませんかぁ…

  • 成績処理を行う場合、エクセル関数は何をどのように使う?

    エクセル初心者で、初めて関数で処理しようとしています。エクセルを使って成績処理(生徒個票)を打ち出したいのですが。例えば、〔シート1〕は、通知表の様式(コピーしたいセルは空欄)。〔シート2〕は、生徒個々のデータ(行ごとに一人分)があります。この場合、〔シート1〕のセル(仮に”D5”)に、〔シート2〕の”鈴木”という生徒(6行目)のあるデータ(仮に”F6”の得点)をそのままコピーしたいのです。その際、〔シート2〕の特定の生徒(鈴木)を選択して必要なデータをすべて〔シート1〕の所定のセルにコピーし、次の生徒(田中)を示すとその生徒(田中)のデータ・・・・。という具合に設定するには、どのような関数を用いればよいのでしょうか。また、その場合、〔シート1〕を一回一回プリントアウトしないで一括印刷する方法はないのでしょうか? 初歩的な質問で申し訳けありません。どなたか教えてください。よろしくお願いします。

  • COBOLで内部ソートをしたいです

    COBOLで内部ソートをしたいです 生徒一人ひとりの成績データから上位点数のものを3教科得点としたいです。 項目名 変数名 国語 wk-kok 算数 wk-san 社会 wk-sha 理科 wk-rik 体育 wk-tai 3教科合計 wk-3kei これで3教科の合計を点数が高い順に上位3教科で合計としたい場合、 単純に国語と算数を比べて、次は国語と社会を比べて・・・とそんなやり方しか思いつかないのですが 何か良い方法はないでしょうか。 使用しているのは富士通のNETCOBOLです。

  • Excelで文字列をまとめたい

    こんにちは いつもお世話になります。 このカテへの投稿は初めてですが、今頼まれて簡単な集計表を作ろうとしています。 あるシートを入力専用のシートにし、たとえばA列に日付、B列には品名、C列には数量を入れるとします。 これを1ヶ月続けたあと、品名でまとめた集計表を作ります。 100行くらいのデータのうち、種類としては10数種類であり、その数は毎月変動します。(行数も) 集計表に重複せずに整理するため、今まではB列だけを別にコピーし、手動でソートして重複しているデータを削除していました。 これをなんとかもっと簡単に行う方法はないものでしょうか? 残りの数字の部分はSUMIF関数を使って合計させていますので簡単なのですが、前処理にいい方法が思いつきません。 ぼちぼち頭の柔軟性に疑問符がつき始めた小生になにかいいヒントをいただけましたら幸いです。 よろしくお願いいたします。

  • エクセルでうまく複雑な合計を求めたいのですが

    受けた教科ごとの生徒の面談日数ごとに何人いるか合計をだせますでしょうか? エクセル以下のように表を作りました。 ・まずA列に生徒の名前一覧 ・B列に算数:受けたら1、受けなかったら0  ・C列に社会など同様 ・そしてE列に面談日時:20日なら20 と1-30まで記載 そして今回、例えば算数を受けたひとで20日面談の人は何人いるか?をだしたいのですが、ひとつひとつsum関数で数えていたら膨大な時間がかかりそうです。sumif関数でもうまくいきませんでした。 何か方法はありますでしょうか??

  • EXCELで表を抽出する

    ・A列に日付、B列に件名を入力した表があります。 ・A列の日付は、ランダムに、繰り返し現れます。 この表から、たとえば7月だけの、A列に日付、B列に件名の表を抽出する場合、 手動でする場合は、最初の表を日付順にソートし、黙視で7月分をコピーし、別表に貼り付ける、というやり方でできますが、 数式や関数で自動的にやる方法はないでしょうか? マクロが必要になりますか?

  • エクセルのVBAで並べ替えの処理

    1つの表に日付、数値、文字列のデータがあります。 優先順位を(1)日付(2)数値(3)文字列とし、全て昇順での処理を書きたいのですが、お分かりの方がいらっしゃいましたら、処理方法をご教授下さい。よろしくお願いします。

  •  エクセルで中学校の成績処理を行っています。

     エクセルで中学校の成績処理を行っています。  ブックはシート3枚構成で、シート1はメニュー画面、シート2には生徒番号(1組1番の生徒は101)、学年、組、氏名、各教科の成績データが入力されており、シート3は、特定のセルに入力した値(生徒番号)を参照するvlookup関数を使った個票形式になっています。 マクロを使って、メニューシートにクラスを入力し、そのクラスの生徒の個票が連続で印刷されるプログラムを使っています。生徒数は学級によって違います。また、生徒番号は転出等により途中欠番があります。  今まで次のようなプログラムを使っていました。 Sheets("menu").Select For 行 = Range("E17").Value To Range("G17").Value Sheets("個票").Select Range("ak5").Value = 行 ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Next Sheets("menu").Select  E17セルには開始生徒番号(1組の場合は101)、G17セルには最終生徒番号が自動計算で出てくるようにしています。  この方法だと欠番のところに1つ前の生徒のデータが重複して印刷されます。 そこで、メニューシートに入力した組を、データシートの組列の上から順番に検索し、一致するセルの行を開始行とし、その行の生徒番号の値を個票シートにコピーし、個票を印刷。次にその行の1つ下の行の生徒番号をコピーし印刷。これを該当クラスだけ続けて、組が別の組になったら終了するというような形に変えたいと思います。  たぶんdo loopなどでできると思うんですが。よろしく御願いします

専門家に質問してみよう