|

|
|
 |
12.データの指定〜入力画面の表示 |
 |
|
|
|
|
|
さあ、いよいよです。やっとフォームから名前やら住所やらを入力するところまできました。いやぁ〜、長かった(笑)
変更したいデータを指定して、その内容をフォームへ表示してやるのはVBAでテーブルを読んだり書いたりする方法が分かってしまえば超簡単。
それでは、さっそく始めましょう!
|
|
|
|
|
|
|
|
|
|
変更データ指定フォームで選択したデータを入力フォームへ表示させるためにはさまざまな方法(流れ)が考えられますが、ここでは次のような流れで処理を行いたいと思います。
変更データ指定フォームでデータの選択、選択されたデータを抽出するクエリーを創成後、入力フォームを表示。入力フォームでは、そのクエリーを基にレコードの内容を表示、更新などを行います。
ここで創成するクエリーは、レコードキー(フィールド名)を基準で抽出するので抽出されるレコードは必ず1件(選択したデータ)です。
|
|
|
|
|
|
|
|
|
|
VBAの記述はフォーム中へもできますが、テーブルへの読み書き等に関わる処理は全てモジュールへ作成することにします。なぜなら、いろんなフォームでテーブルの処理をしてると、あとで変更を加えたい時に修正漏れとかが怖いと思わない?バグの原因にもなりかねないですよ!
モジュールは、Accessの画面のモジュールタブをクリックして、新規作成でOKです。この辺はフォームとかと同じだから大丈夫でしょ?
モジュールを新規作成するとこんな画面が表示されます。
画面の上の方に(General)と(Declarations)っていうのがありますが(Declarations)の方がミソです。ここは、主に定数や変数を宣言する為に使用します。
変数等の宣言はプロシジャの中でも可能ですが、(Declarations)で宣言した変数・定数とプロシジャの中で宣言した変数・定数には以下の違いがあります。
(Declarations)で宣言したとき
モジュール内の全てのプロシジャや関数で使えるようになる。しかも、ここで宣言しておくとAccessを終了させるまで、ず〜〜〜〜っと入れた値を保持しといてくれる。
でも、なるべく各プロシジャ間で共通で使用するものや、どうしても値を保持したい変数だけに絞っておかないと後で管理が大変です。
各プロシジャ中で宣言したとき
プロシジャ中で宣言した変数等は、そのプロシジャの中でのみ有効です。他のプロシジャからは参照することはできません。さらに、プロシジャ中で宣言した変数は、プロシジャ終了と同時に消滅します。だから、使えるのは宣言したプロシジャの中だけです。
プロシジャが実行されている間のみ使えればいいような使い捨て変数などは、プロシジャの中で宣言するようにしましょう。
|
|
|
|
|
|
|
|
|
|
これは、「変数を使うときは、Dim文などでちゃんと宣言しなさい。そうじゃない変数は、使わせないよ!」って意味です。この指定は、モジュールに限らず、各フォームの中にコードを書く場合も必ず書いておいて下さい。書く場所は(General)(Declarations)です。
何の為にかというと、早い話がバグ対策・・・・・本当は「氏名」なのに、タコな日本語変換辞書のおかげで「指名」って変換されたのを気がつかないでプログラムを書いちゃったとき、Option Explicitを宣言しておかないと、「指名」も変数として認められてしまう。
でも、本当は「氏名」が正しいから、プログラムは動かない!下手をすりゃ永久ループ天国に突入!(汗)こうなると、[Ctrl]+[Alt]+[Delete]のお世話になるしかないぜ!保存してない部分は全部パーだ。もちろん、○ートンの○ンチ○リーズだってお手上げだ(笑)
と、おバカなことを書きましたが、変数はちゃんと宣言しましょうってことです。
ちなみに、Option Compare Databaseは気にしたことが無いので知りません(爆)
|
|
|
|
|
|
|
|
|
|
変数の宣言にはDimを使います。宣言方法は次の通りです。
Dim 変数名 As データ型
データ型で、わりとよく使う物をまとめてみました。これだけ知ってれば、ほとんど大丈夫でしょう。
Dim 変数名 As Integer
整数型(Integer)の変数です。整数型は、-32,768〜32,767の数値が使えます。小数は使えません。
Dim 変数名 As Long
長整数型(Long)の変数です。長整数型は、-2,147,483,648〜2,147,483,647の数値が使えます。小数は使えません。
Dim 変数名 As Single
単精度浮動小数点型(Single)の変数です。単精度浮動小数点型は負の値が-3.402823E38〜-1.401298E-45、正の値は1.401298E-45 〜 3.402823E38の数値が使えます。もちろん、小数も使えます。
Dim 変数名 As Double
倍精度浮動小数点型(Double)の変数です。倍精度浮動小数点型は負の値は-1.79769313486231E308〜-4.94065645841247E-324、正の値は4.94065645841247E-324〜1.79769313486232E308の数値が使えます。もちろん、小数も使えます。
Dim 変数名 As String
文字列型(String)の変数です。アルファベットや数字、漢字など、文字列なら何でも入れることができます。ただし、計算には使えません。
Dim 変数名 As Date
日付/時刻型(Date)の変数です。その名の通り、時刻や日付を入れるための変数です。
|
|
|
|
|
|
|
|
|
|
まず、オープン処理とクローズ処理、これに伴うデータベース型変数とレコードセット変数の定義を行います。
各変数の定義は、モジュールの(General)(Declarations)へ次のように記述します。
Option Compare Database
Option Explicit
'記述場所:モジュール「AddressBookModule」
'記述箇所:(General)(Declarations)
'Access97での定義
Dim db As Database
Dim tbl As Recordset
|
※Access97の場合
※太字の部分を記述。
Option Compare Database
Option Explicit
'記述場所:モジュール「AddressBookModule」
'記述箇所:(General)(Declarations)
'Access2000以降での定義
Dim db As DAO.Database
Dim tbl As DAO.Recordset
|
※Access2000以降の場合
※太字の部分を記述。
ここでは、dbとtblという変数名にしました。特に「こうしなさい」という指定ではないので、自分が分かりやすい名前にするといいでしょう。
次は、オープン処理とクローズ処理ですが、この処理はいろいろなプロシジャから共通で使用できるので、プロシジャとして独立させます。これもモジュールへ記述しましょう。
まずは、オープン処理です。
Sub テーブルオープン()
'記述場所:モジュール「AddressBookModule」
'Access97での手順
Set db = DBEngine.Workspaces(0).Databases(0)
Set tbl = db.OpenRecordset("住所録テーブル", DB_OPEN_DYNASET)
End Sub
|
※Access97の場合
Sub テーブルオープン()
'記述場所:モジュール「AddressBookModule」
'Access2000以降での手順
Set db = CurrentDb
Set tbl = db.OpenRecordset("住所録テーブル", dbOpenDynaset)
End Sub
|
※Access2000以降の場合
同じように、クローズ処理も作ります。
Sub テーブルクローズ()
'記述場所:モジュール「AddressBookModule」
tbl.Close
db.Close
End Sub
|
ちなみに、Subの後のテーブルオープンやテーブルクローズが、プロシジャ名となります。
|
|
|
|
|
|
|
|
|
|
変更データ指定フォームで選択したデータを、テーブルから抽出するクエリーを創成します。この処理は、変更データ指定フォームでOKボタンがクリックされたときに行います。
まずは、VBAでクエリーを創成するためのプロシジャを見てみましょう。
Sub 処理対象抽出クエリー創成(抽出レコードキー As Long)
'記述場所:モジュール「AddressBookModule」
On Error GoTo エラー処理
Call テーブルオープン
Dim tq As QueryDef
Set tq = db.CreateQueryDef("汎用クエリー", _
"SELECT レコードキー,漢字氏名,カナ氏名," & _
"性別,関係,生年月日," & _
"郵便番号,住所,加入電話番号," & _
"FAX番号,携帯等電話番号,メールアドレス," & _
"備考,ステータス " & _
"FROM 住所録テーブル " & _
"WHERE レコードキー =" & 抽出レコードキー & ";")
Call テーブルクローズ
Exit Sub
エラー処理:
'2003/12/17:既存クエリーの削除手順を変更
'db.QueryDefs.Delete "汎用クエリー"
If Err.Number = 3012 Then 'クエリーが存在している場合
db.QueryDefs.Delete "汎用クエリー"
Else
'それ以外のエラーは、内容を表示し強制終了
Debug.Print Err.Number
Debug.Print Err.Description
MsgBox "クエリー創成処理でエラーが発生しました" & vbCrLf & _
"エラー番号 : " & Err.Number & vbCrLf & _
"エラー詳細 : " & Err.Description
End '強制終了
End If
Resume
End Sub
|
「なんだこれは?」って思った人は安心してください!内容は思ったより簡単です(笑)
詳しい(?)説明はここを見てください。
|
|
|
|
|
|
|
|
|
|
入力フォームへの変更対象データの設定プロシジャも作成しておきましょう。これさえ完成すれば、とりあえずフォームから「データ選択→選択データの表示」までが行えます。
VBAからのフォームのコントロールへの値の設定は、
Froms!フォーム名!コントロール名 = 設定したい値
で行います。また、設定したいフィールドが複数ある場合(っていうか、普通は複数あるが・・)、いちいちFroms!フォーム名!コントロール名と記述してるのは面倒なはず。しかし、ダンナぁ・・いいのありまっせ!(笑)
こんな場合はWith 〜 End Withステートメントを使うと非常に便利です。
With Forms!フォーム名
!コントロール名1 = 設定値
!コントロール名2 = 設定値
・
・
!コントロール名X = 設定値
End With
|
Withの所へ省略したい部分を記述します。例ではForms!フォーム名。これで、End Withまでは、フォームのコントロールの指定時にForms!フォーム名を省略できます。コントロールの指定は!コントロール名のように記述します。
これを踏まえてプロシジャを作成すると以下の様になります。抽出クエリーは、このプロシジャでオープンするようにしました。
Sub 入力フォーム設定()
'記述場所:モジュール「AddressBookModule」
'Access97での手順
Call テーブルオープン
Dim qry As Recordset
Set qry = db.OpenRecordset("汎用クエリー", DB_OPEN_DYNASET)
With Forms!登録変更
!漢字氏名 = qry!漢字氏名
!カナ氏名 = qry!カナ氏名
!性別 = qry!性別
!関係 = qry!関係
!生年月日 = qry!生年月日
!郵便番号 = qry!郵便番号
!住所 = qry!住所
!加入電話番号 = qry!加入電話番号
!FAX番号 = qry!FAX番号
!携帯等電話番号 = qry!携帯等電話番号
!メールアドレス = qry!メールアドレス
!備考 = qry!備考
!ステータス = qry!ステータス
End With
qry.Close
Call テーブルクローズ
End Sub
|
※Access97の場合。太字の部分がAccess2000以降との違い。
Sub 入力フォーム設定()
'記述場所:モジュール「AddressBookModule」
'Access2000での手順
Call テーブルオープン
Dim qry As DAO.Recordset
Set qry = db.OpenRecordset("汎用クエリー", dbOpenDynaset)
With Forms!登録変更
!漢字氏名 = qry!漢字氏名
!カナ氏名 = qry!カナ氏名
!性別 = qry!性別
!関係 = qry!関係
!生年月日 = qry!生年月日
!郵便番号 = qry!郵便番号
!住所 = qry!住所
!加入電話番号 = qry!加入電話番号
!FAX番号 = qry!FAX番号
!携帯等電話番号 = qry!携帯等電話番号
!メールアドレス = qry!メールアドレス
!備考 = qry!備考
!ステータス = qry!ステータス
End With
qry.Close
Call テーブルクローズ
End Sub
|
※Access2000以降の場合。太字の部分がAccess97との違い。
|
|
|
|
|
|
|
|
|
|
必要なプロシジャが揃った所で、こんどはフォームからこれらのプロシジャを呼び出す処理を加えます
まず、変更データ指定ですが、OKボタンのクリックイベントへクエリーの創成プロシジャの呼び出しと、フォーム登録変更を開く処理を作成します。
Private Sub OK_Click()
'記述場所:フォーム「変更データ指定」
'記述箇所:「OK」ボタンのイベント「クリック時」
Call 処理対象抽出クエリー創成(処理対象)
DoCmd.OpenForm "登録変更"
End Sub
|
クエリー創成プロシジャの呼び出し時の処理対象は、呼び出しプロシジャへ引き渡す値(抽出するレコードのレコードキー)です。
|
|
|
|
|
|
|
|
|
|
登録変更フォームへは、入力フォーム設定プロシジャを呼び出す処理を加えます。
加える場所は、フォームのイベントの開く時です。これで、このフォームが開かれたときに、フォーム上の各コントロールへテーブルから取り出した内容が設定されます。
Private Sub Form_Open(Cancel As Integer)
'記述場所:フォーム「登録変更」
'記述箇所:イベント「開くとき」
DoCmd.Maximize
Call 入力フォーム設定
End Sub
|
|
|
|
|
|
|
|
|
|
|
フォーム変更データ指定を開いて、これまでの部分が正常に動作するか、ここへ書いてあることがウソじゃないかを(?)試してみては?データを選択してOKをクリック、その後、入力フォームが表示されテキストボックス等にテーブルの内容が表示されていればここまでの内容は成功です。ただし、各コントロールにテーブルから取得したフィールドが正しく設定されているか、ちゃんと確認してくださいね〜。
あと、各フォームやモジュールを保存することもお忘れ無く。モジュールは「AddressBookModule」という名前で保存してくださいね。
|
|
|
|
|