Access実践入門 TOPへ
 ■ マイクロソフトアクセス、モジュール(誕生日カード)
モジュール
フォームの中で使うイベントプロシージャは、たくさん出てきましたが、テーブルのデータを直接開いてレコードの内容を見たり、集計したりする場合、モジュールを使う必要があります。

誕生日カードでモジュールを学習します。
データには、年齢のフィールドはありません。
年齢は、日々変わるデータなので、入力しても意味がありません。その都度計算しなければいけません。

ここのサンプルの真似をして、いろんなモジュール作りに挑戦してみてください。

モジュールの内容
データベースウインドのあるモジュールを見てください。
「Module」というのが1つあります。
この中には、現在、入力モードに使う変数の宣言とサンプルのプロシージャが1つあるだけです。
フォームやクエリーのように、ここにたくさんのモジュール名をつけて作らないようにしてください。
1つのモジュールの中に、いくらでもプロシージャが作れるのです。
プロシージャを分類分けして数個すくるくらいでしょう。
1つでも十分です。

新規のプロシージャを追加
モジュールの中に新規で、プロシージャを作る手順を説明します。
「Module」のデザインを開きます。
上のメニューから「挿入」「プロシージャ」

Sub プロシージャと、Function プロシージャとの違いは、値を帰すかどうかの違いですが、モジュールの中に書くプロシージャはFunction プロシージャにしておいてください。

以下のようにして、名前を付けてOKボタンをクリックすると、追加できます。

サンプルの説明
それでは、サンプルで使っているプロシージャの説明をします。

まず、マクロの「ma誕生日ca」のデザインを見てください。

誕生月を選択してもらいます。
その後、該当者の一覧表を表示します。
そこで、一人ずつ、カードを印刷します。

モジュールの中でテーブルやクエリーを直接開くことができますが、次のものは、開くことができません。

1.抽出条件の入ったクエリー
2.リンクテーブルを(dbOpenTableで)直接開ける。
  ただし(dbOpenDynaset)では開けられます。

2の場合はダイナセットで開ければよいので問題ないですが、1の場合は、次の手順を使います。
・作業用のテーブルを準備する
・削除クエリーで作業用のテーブルのレコードを全部削除する。
・追加クエリーで、抽出された結果の入った作業テーブルを作る
・モジュールで使う
以上のような手順です。
テーブルは、わかりやすい名前を付けて、プログラムのmdbの方に直接テーブルを作っておきましょう。

ここでは、「to誕生日ca」トランザクションファイルのtoを先頭に付けて、他のテーブルと区別しています。
テーブルのデザインで、内容を確認しておいてください。


処理の順番は、マクロに書いてあります
削除クエリー「quto誕生日ca削除」(削除クエリー)
削除クエリー「quto誕生日ca追加」(追加クエリー)

ここで追加クエリの作り方を説明します。

データベースウィンドでクエリーを選びます。
新規作成をクリック。
ウィンドが開いて、一番上のデザインピューが規定値で選ばれていますから、OKボタン
テーブルの「ta住所録」を選んで、追加ボタン
閉じるボタンで、テーブルの表示ウィンドを閉じます。
テーブルの表示ボタンは、上のメニューから「クエリー」「テーブルの表示」でいつでも出せます。
白紙のクエリーに「ta住所録」が1つあります。
上のメニューから「クエリー」「追加」で追加クエリーにします。
テーブル「to誕生日ca」を選びます。

「ta住所録」の中の、「to誕生日ca」のフィールドと同じ物、すなわち、次の項目を落とします。
住所録番号、名前、ふりがな、郵便番号、住所、電話番号、生年月日日付
すると、レコードの追加の欄に、自動的に追加のフィールド名も出てきます。
フォームで指定した誕生日の月の抽出条件を設定します。

フィールドの欄に、Format([生年月日日付],"mm")と入れてやります

これは、Format 関数で大変便利な関数です。いろんな使い方ができます。
ここでは、[生年月日日付]から、月を2桁で取り出しています

抽出条件に、[Forms]![fo誕生日ca]![月]と入れます
この追加クエリーで、指定した誕生月のデータのみの入ったテーブル「to誕生日cs」ができあがりました。

追加クエリの後、マクロで、
プロシージャを呼び出しています。

では、プロシージャの内容です。

 1 Public Function tanjyou()
 2  Dim nen As Long
 3  Dim dbs As Database
 4  Dim rsttable As Recordset
 5  Set dbs = CurrentDb
 6  Set rsttable = dbs.OpenRecordset("to誕生日ca", dbOpenTable)
 7  If rsttable.RecordCount = 0 Then
 8   Exit Function
 9  End If
10  rsttable.Index = "PrimaryKey"
11  rsttable.MoveFirst
12  Do Until rsttable.EOF
13  rsttable.Edit
14  rsttable!年齢 = DateDiff("yyyy", rsttable!生年月日日付, Date)
15  rsttable.Update
16  rsttable.MoveNext
17  Loop
18  rsttable.Close
19 End Function


1行目:ファンクションプロシージャの名前です。
2行目:このプロシージャの中で使う変数の宣言(長整数型のnen、integer 型でも可)
3行目:同じく(データベース型のdbs、このように指定すると覚えてください)
4行目:同じく(レコードセット型のrsttable、このように指定すると覚えてください)
5行目:変数dbsに現在使っているデータベースをセットする、このように指定すると覚えてください
6行目:変数rsttableこれから開きたいレコードセットをセットする。

プログラムの中に直接存在する(リンクテーブルでない)テーブルを参照する場合は
  dbs.OpenRecordset("to○○", dbOpenTable)
プログラムの中に無いリンクテーブルを参照する場合は
  dbs.OpenRecordset("ta○○", dbOpenDynaset)
抽出条件の設定されていないクエリーを参照する場合は
  dbs.OpenRecordset("qu○○", dbOpenDynaset)
以上のように覚えてください。

7行目〜9行目:作業テーブルにレコードが無かった場合は、処理を中止します。この処理がないと、エラーで止まってしまいます。

10行目:インデックスを指定しています。このテーブルのどのインデックスの順番でファイルを開けるかを指定します。無くてもいい場合もあるのですが、必ずつけるようにしておきましょう
テーブルのインデックスの名前については、次を見てください

テーブル「ta住所録」のデザイン画面が開いている時に
上のメニューから「表示」「インデックス」を開いてください

主キーは、PrimaryKy という名前になります。
その他、ここに設定されている、インデックス名を、指定することができます。


11行目:テーブルの先頭のレコードに移動します。
12行目:テーブルの最後(rsttable.EOF)を認知するまでLoopとの間を作業をしつずけなさいという命令(ループ)です。くるくる回る処理です。

13行目:今開いているレコードを編集しますという意味

14行目:テーブルの年齢というフィールドに次の値を代入する
DateDiff()関数は、2つの日付の間隔をかえします。
ここでは、何年たっているかを調べます。1月1日でも、12月31日でも、同じ答えになります。
今年の誕生日が来たら、全員この年齢になるはずです。

「○○歳のお誕生日おめでとうございま」すというカードを出します。

Dateは今日の日付をかえしますので、1月のカードを出すときは、1月になってからカードを出さないと、年齢計算がおかしくなります。


15行目:変更された、レコードを上書きします。
16行目:次のレコードに移ります。
17行目:テーブルの最後のレコードでない限り、12行目に戻ります。
18行目:最後のレコードの時に、ここを通りますので、開いたレコードセットを閉じます。
19行目ファンクションプロシージャの終わりです。

ここで、使っているテーブル等のレコードの開け方、読込方法はそのままコピーして使ってください。計算部分が違うだけで、レコードを最初から読んで、使う方法は同じです。
複雑なデータ分析をする場合は、こういったプロシージャの処理が必要になります。

ただ、クエリーを駆使すればかなりのことができますので、必ずしもプロシージャが必要なわけではありません。
作業テーブルを作って追加クエリー、更新クエリーを使えばこの処理はできます。
以降のバージョンで、プロシージャを使わないで、この処理をする方法を紹介します。


レポートの誕生日カード
誕生日カードのデザインを説明しておきます。
これは、ハガキに直接印刷させるようになっています。
ハガキの郵便番号の欄に数字を印刷できるようにしています。

「re誕生日ca表」のデザインを見てください。

郵便番号の枠の数だけ、コントロールを貼っています。
各コンとロースのコントロールソースを見てください。
郵便番号が000−0000の形で入力されているものとして、次のように書いています。

1桁目:=Left([郵便番号],1)
2桁目:=Mid([郵便番号],2,1)
3桁目:=Mid([郵便番号],3,1)
4桁目:=Mid([郵便番号],5,1)
5桁目:=Mid([郵便番号],6,1)
6桁目:=Mid([郵便番号],7,1)
7桁目:=Mid([郵便番号],8,1)・・(=Right([郵便番号],1)でも可)

Left()、Mid()、Right() は文字列の中から、特定の場所の文字を抜き出すための関数です。

住所のコントロールでは”=Trim([住所])”となっています。
Trim() は、文字列の前後に空白文字があったら、削除する関数です。
この場合、無くてもいいものです。

名前のコントロールでは”=[名前]+" 様"”となっています。
名前の後に、様という文字をプラスしています。

このように、コントロールソースに直接式を書くことができます。
”=”を先頭に付けて書きます。

「re誕生日ca裏」のデザインを見てください。
ここでは、特に新しい関数はありません。
印刷指定画面で、空いている場所に印刷したい内容を入力するようにして、その入力データを印刷するようにしてもいいでしょう。