今回の連載はVBAの基本を確認することにある。
前回、クロス集計クエリを作成すれば成績処理としては目的を達成できるという話をした。しかし、それでは実際の現場での運用はできないのである。なぜなら、最終的にレポート機能で成績一覧表を印刷することになるが、一覧表の見出しになる科目名と科目数は1種類ではないからだ。
小生が関係した高校では、多い時で3学年で一覧表のパターン(科目名の並び)は10種類以上にもなる。年度によってもまた変化する。そのようなパターンすべてに対応するレポートのテンプレートを作成しなければならない。
クロス集計クエリを元にしたレポートでは、科目名見出しや成績のデータソースが固定してしまう。1種類のレポート形式で済むならよいが、おそらくそういうケースはまれであろう。高校で単一課程で全員が同じ科目を履修したとしても、3学年なので最低でも3種類は必要である。教育課程の改訂があればその都度変化する可能性もある。
とりあえず単純化した例で説明を進めるが、実際の運用場面で役に立つ説明も最後に付け加えるつもりだ。まずは基本のVBAをしっかりおさえていこう。
フォームを作成し、コマンドボタンを1つ配置し、クリックイベントに次のコードを記述すると、T_ichiranテーブルが作成される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
Dim cn As ADODB.Connection ‘—- この連載では最終的に4つのテーブルを使用します —- Dim r1 As ADODB.Recordset Dim r2 As ADODB.Recordset Dim r3 As ADODB.Recordset ‘今回はこれだけ Dim r4 As ADODB.Recordset ‘———————————– Dim i, j, k ‘カウンター Dim kname(30) ‘科目名を入れる配列 Dim st_SQL As String ‘sql用文字列 Dim all_k As String ‘科目名をフィールド名にするための文字列、sql文で使用 Dim all_k_i As String ‘フィールド名にするための文字列、sql文で使用 Dim all_k_h As String ‘フィールド名にするための文字列、sql文で使用 Dim k_name(30) As String Dim k_n As Integer ‘科目数を入れる変数 k_n = DCount(“*”, “T_kamoku”) ‘科目数を取得 all_k_i = “生徒名 varchar,” ‘生徒名フィールド定義゛ all_k_h = “平均点 Double” ‘平均点フィールド定義 Set cn = CurrentProject.Connection Set r3 = New ADODB.Recordset ‘—– 科目名を取り出し、フィールド定義用文字列を作成する処理 —– ‘— 科目名テーブルを開く r3.Open “T_kamoku”, cn, adOpenForwardOnly, adLockReadOnly i = 1 Do Until r3.EOF k_name(i) = r3!科目名 all_k = all_k & k_name(i) & ” Double,” r3.MoveNext i = i + 1 Loop ‘ ————————————————————————————— ‘最終的にフィールド名とするための処理 ‘先頭に生徒名、最後に平均点を付加 all_k = all_k_i & all_k & all_k_h ‘処理前にテーブルを削除 On Error Resume Next DoCmd.DeleteObject acTable, “T_ichiran” On Error GoTo 0 ‘テーブル作成のSQL文およびSQL実行 st_SQL = “CREATE TABLE T_ichiran(“ & all_k & “);” DoCmd.RunSQL st_SQL ‘———–レコードセットを閉じる———————————————— r3.Close Set r3 = Nothing cn.Close Set cn = Nothing End Sub |
この処理で、一覧表の見出しとなる
生徒名 国語 算数 理科 社会 英語 平均点
というフィールド並びのテーブルが作成される。
実際の学校現場では、科目にはコードが振られているので、コード順に並べるなどの処理が必要となる。
尚、このテーブルは一時(作業用)テーブルでなので、作成前に既存を削除処理を行う。なぜ一時テーブルなのかと言えば、点数入力等に誤りがあった場合、最新のデータを呼び出す必要があったり、複数のクラス等があった場合にはパラメータを切り替え連続処理をするためにその都度テーブルを新規に作成する必要があるからだ。