• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文: エクセルで中学校の成績処理を行っています。)

エクセルで中学校の成績処理を効率化する方法

このQ&Aのポイント
  • エクセルを使用して中学校の成績処理を行っていますが、現在の方法では欠番の生徒のデータが重複して印刷されてしまいます。
  • そこで、新しい方法として、メニューシートに入力した組をデータシートで検索し、一致する行の生徒番号を個票シートにコピーして印刷する方法を考えています。
  • この方法を実装するためには、ループ処理などのプログラミング技術を利用することが必要です。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

アイデア次第で,いろんな取り組みが考えられます。 ところで「重要な」状況説明の不足として,いま一つ問題になっている「欠番の生徒」の,シート2の実際の行のデータがどうなっているのかですが。 状況から推測すると「空行が1行入っている」か,もしくは最低でも「(不明の列番号の)該当の行に番号の数字が記入されていない」と思われます。 すると,ひとつの簡単なやり口としては For 行 = 始まりの番号 to 終わりの番号  If workshseets("Sheet2").cells(行,番号列)<>"" then   worksheets("個票").Range("ak5").Value = 行   worksheets("個票").PrintOut copies:=1, collate:=true  end if next 行 のようにして,実際にデータが有れば印刷するし,なければその番号はスキップするという仕込みが考えられます。 次の課題として「クラス番号だけを指定して印刷対象データをすくい上げたい」ですが。 こちらも,具体的なサンプルマクロを誰かに書いて貰うにも,「クラスって何列ですか,どんなデータで記入してあるのですか」といった具体的な事実が情報提供されていません。 まぁ,最低でも「同じクラスの子供達はヒトカタマリの行範囲にまとめて並べてある(途中に抜け等はあるにせよ)」というお話しで間違い無ければ ・「開始行」はクラス番号が「最初に出てきた行」である ・「終了行」はクラス番号が「最後に出てきた行」である といった工夫が出来そうです。 仮にシート2のA列にクラス番号。menuのA1セルにクラス番号として  dim 開始行 as range  dim 終了号 as range  if application.countif(Worksheets("Sheet2").range("A:A"), worksheets("menu").range("A1")) = 0 then   msgobox "class name is not exist in data list"   exit sub  end if  set 開始行 = worksheets("Sheet2").range("A:A").find(what:=worksheets("menu").range("A1"))  set 終了行 = worksheets("Sheet2").range("A:A").findprevious(開始行) のような所でしょうか。 すると,前述のマクロにつないでみるなら  始まりの番号 = 開始行.value  終わりの番号 = 終了行.value といった具合になります。

yoshi_u
質問者

補足

欠番生徒のデータは削除されています。たとえば1組の9番の生徒が転出したとすると、データシートは生徒番号108のデータの下の行は110の生徒データの行になります。 データシートの並びはA列が生徒番号、B列が組、C列が出席番号、D列が氏名、E列が性、F列からが各教科の成績になっています。1組のデータの下に2組データ、3組データと組ごとに生徒番号順にデータがあります。

その他の回答 (2)

  • Saturn5
  • ベストアンサー率45% (2270/4952)
回答No.3

他の方が書いておられますが、欠番かどうかを判定する文を 入れるのが楽でしょう。 全く違ったアプローチとしては、印刷用シートのVLOOKUPを 完全一致にするのです。 VLOOKUP(検索値,範囲,列番号,検索の型) の検索の型に[true]を入力してください。 省略されていると範囲内の一番大きな値になるので、 出席番号が1つ前の生徒のデータが出るのです。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

なるべく今のまま手を加えない方法で…… シート2の生徒番号の列(A列?)に、該当する生徒番号があるかを確認しましょう。 シート名や列は実際の物に合わせてください。 Sheets("menu").Select For 行 = Range("E17").Value To Range("G17").Value  rtn = Application.WorksheetFunction.CountIf(Worksheets("Sheet2").Range("A:A"), 行) 'Sheet2のA列に該当生徒番号があるか確認  If rtn > 0 Then 'Sheet2に生徒番号がある場合処理続行   Sheets("個票").Select   Range("ak5").Value = 行   ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True  End If Next Sheets("menu").Select

関連するQ&A