Myパートの契約管理(自社情報と個人情報)
3.フォームの作成について
3.1 フォームの作成ツール
テーブルを元に作成する場合は基本的には「フォーム」か「フォームウィザード」を使用します。
フィールドをそのままフォームに配置してくれますのでその後の編集作業が楽です。
テーブルを使わない場合は、「フォームデザイン」か「空のフォーム」を使用します。
それぞれのパターンのサンプルは以下の通りです。
⑴「フォーム」を使用した場合
縦に1行ずつすべてのフィールドが同じ幅で作成されます。フォームのレイアウトはプロパティシートの
「規定ビュー」で選択します。上記は「帳票フォーム」を選択した例です。
⑵「フォームウィザード」を使用した場合
ウィザードではフォームの作成過程でレイアウトを選択できます。それぞれの作成画面は上記の通りです。
(「データシート」はテーブルを開いて入力する場合と同じなので省略しました。)
このシステムでは、自社情報、個人情報、契約明細の登録画面は単票形式を、検索結果の表示には表形式の
レイアウトを使用しています。
⑶「フォームデザイン」を使用した場合
空のフォームが用意されるだけです。自由にフォームデザインを作成することができます。
このシステムでは、印刷の指定フォームやメニューなどで使用しています。
⑷「空のフォーム」を使用した場合
空フォームが用意されます。少量のコントロールしか使わない場合には手っ取り早いかもしれませんが、
正直なところ「フォームデザイン」との違いはあまり感じられません。
このシステムではログイン画面で使用してみました。
3.2 自社情報の登録
⑴「フォームウイザード」を起動
自社情報テーブルから全フィールドを選択し「単票形式」で作成します。
フォーム名は「自社情報の登録」としました。
上記の例では最後の指定画面で、「フォームのデザインを編集する」を選択していますが、もう一方の
「フォームを開いて入力する」を選択すると下記のようなフォームが表示され、そのまま実行できます。
閉じる(×)か「レコードの移動」で次(▶)を押下すると入力中のレコードが登録されます。
この状態でも運用は可能ですが、あまり使い勝手が良いとは思えません。
➀Accessの作業ウィンドウに展開されるので別のフォームを同時に開くことができない。
➁入力前の元の値に戻すことができない。
➂最後のテキストボックスの入力後は自動的に次レコードへ進んでしまう。
➃見栄えがよくない。
よって、「フォームのデザインを編集する」を選択して、実行前に少し編集したいと思います。
⑵フォームプロパティの変更
➀ 書式タブ
レコードセレクタ:いいえ、 移動ボタン:いいえ、(1件しかないので不要です)
区切り線:はい(ヘッダー、詳細、フッターで区切り線を引く)
➁その他タブ
ポップアップ:はい(フォームを作業ウィンドウから切り離して自由に動かせるようにする)
⑶フッター領域を広げる
フッターの下にカーソルをあわせ、十字に形状が変わったら下に引き下げてフッター領域を広げて下さい。
レコードの保存、内容を元に戻す、フォームを閉じる の3つのコマンドボタンをフッターに配置します。
⑷コントロールウィザードを使用してコマンドボタンを作成する。
コントロールウザードをONにして下さい。(マークが四角で囲われた状態)コマンドを選択して配置したい場所にクリックすると、コマンドウザードが起動します。
➀テーブルにレコードを保存するためのボタンを作成する。
種類:レコードの操作、ボタンの操作:レコードの保存、ボタンの表示:文字列で「保存」、
ボタン名:「保存」
➂入力中のデータを無効とし元に戻すためのボタンを作成する。
種類:レコードの操作、ボタンの操作:レコードを元に戻す、ボタンの表示:文字列で「元に戻す」、
ボタン名:「元に戻す」
➃フォームを閉じるためのボタンを作成する。(フォーム右上の「×」と同じです。)
種類:フォームの操作、ボタンの操作:フォームを閉じる、ボタンの表示:文字列で「閉じる」、
ボタン名:「閉じる」
⑸ボタンの大きさと配置をそろえる
作成した直後は、大きさも位置もバラバラの状態ですので一括選択して形状をそろえます。 参照元に戻る

⑹代表者名の入力後は「保存ボタン」にカーソルを移動させる。
「代表者名」の入力後は「保存」ボタンにカーソルを移動させ、ボタンの押下で保存されるようにします。
「フォーカス喪失時」で「イベントプロシジャー」を選択し 「…」を押下してVBAを起動して下さい。
イベント処理のサブルーチンが作成されているのが確認できます。赤枠が追加したコードです。
「フォーカス喪失時」は「Exit」イベントを使っています。 参照元に戻る
➀Option Compare Database
最初から記述されてます。
➁Option Explicit
変数を明示的に定義することを宣言していています。
Accessは定義せずに変数を使用してもそのまま実行できますが(コンパイル時にはエラーになります)
プログラムのミスを発見しやすくなるので通常は宣言します。
➂ Me.保存.Setfocus
Me: Activeになっているフォームを指しています。 今は「自社情報の登録」フォームです。
「代表者名」がフォーカスを喪失した時は、「保存」ボタンにフォーカスを当てるようにしています。
押下することによってレコードが保存されます。(押下するまでは保存されません)
⑺ マクロの作成(フォーカス取得時/喪失時のプロパティの切替処理)
ボタンにフォーカスが当たっていてもわかりにくいので、プロパティを操作してわかりやすくします
標準モジュールをクリックして、標準モジュールに Functionコードを記述します。
➀Screen.ActiveControl
いま、Activeになっているコントロールを指しています。
コマンドボタンでも、テキストボックスでも適用できます。
➁Function fenter()
fenter はFunction名で()は引数がないことを意味しています。
ここでは、フォーカスが当たった時にプロパティを変更するコードを記述しています。
変わったことが分かりやすいように、表示文字のサイズ・形状・前景色を変えました。
➂Function fexit()
フォーカスを失った時に実行するコードです。
元の形状に戻しています。
⑻保存ボタンにマクロを登録する
➀マクロに実行コードを登録する。
マクロをクリックするとマクロ1が作成され、実行内容を指定する画面が起動します。
「プロシジャーの実行」を選択してプロシジャー名に fenter() を登録します。
同様に、マクロ2には fexit() を登録します。
➁保存ボタンのイベントにフォーカス取得時(Enter)にはマクロ1、
フォーカス喪失時(Exit)にはマクロ2を登録します。 参照元に戻る
⑼保存ボタン押下時の埋め込みマクロにフォームを閉じる機能を追加する。
自社情報は1件のみなので、データの保存後はフォームを閉じるように埋め込みマクロを編集します。
フォームの保存ボタンの表示を、「保存・閉じる」に変更します。
⑽IDフィールドのプロパティを変更する
自社情報の「ID」は、規定値=1、入力規則=1で、1以外は入力できませんので使用不可にします。
IDのテキストボックスの背景色はグレーになり、規定値の1が表示され修正入力不可になります。
自社情報タブを右クリックしてショートメニューの「ホームビュー」をクリックして実行してみてください。
良ければ、最後に「上書き保存」で保存します。
3.4 個人情報の登録
⑴フォームウィザードを起動する
➀テーブル:個人情報 、 レイアウト:単票形式 、フォーム名:個人情報の登録
実行前に編集します。
⑵フォームプロパティを変更する
➀ 書式タブ
レコードセレクタ:いいえ、 移動ボタン:いいえ、 区切り線:はい
➁その他タブ
ポップアップ:はい
➂社員番号のプロパティの使用許可を「いいえ」にする。
テーブルを元にフォームを作成した場合、操作で最も混乱する原因となるのがキー項目への誤入力です。次々と入力していける反面、他のデータに上書きしてしまったり、保存ができなくなったりすることがあります。
当システムでは誤操作をさけるため、社員番号はシステムサイドで管理するようにしています。
また、保存、削除といったレコードの操作はボタンの押下のみで実行するようにしています。
⑶フッターにコマンドボタンを配置する
コマンドウィザードを使用してボタンを作成し、ボタンの大きさと配置をそろえます。
複数の操作を記述しているボタンは、埋め込みマクロを編集してアクションを追加しているボタンです。
⑷閉じるボタンの埋め込みマクロを編集する。
➀ウィザードで作成する時は「元に戻す」を選択します。
➁元に戻す作業が正常に終了したかどうかを判定しています。
➂MacrError<>0 はエラー番号がゼロでない、つまり何らかのエラーがあった時で、
規定のメッセージが表示されます。
通常はデータ内容に変更がなかったので元に戻す作業が行われなかった時です。
➃変更があった時は変更された内容が保存されないことを知らせるメッセージを追加作成しました。
このままフォームを閉じますので確認のためのメッセージを表示するアクションを追加しました。
➄「新しいアクションの追加」でフォームを閉じる機能を追加します。
ウィザードでは「フォームを閉じる」を選択してから「新しいアクションの追加」で「レコードを元に戻す」を追加し、「レコードを元に戻す」アクションを一番上まで移動させてもいいのですが、この場合は、➁の規定のメッセージなども自分で追加する必要があります。そのため、あえて逆にしています。
⑸標準モジュールに、Function 「newcode」を作成する
➀ Dim wkcode as long
長整数の変数 wkcode を定義しています。
➁wkcode=Dmax(”社員番号”、”個人情報”)+ 1
Dmax:個人情報テーブルの社員番号の最大値を取得します。
次に新規で登録する社員番号は、 wkcode + 1 になります。
もし、個人情報に1件もレコードがない場合には、「Null」が返されます。その場合は wkcode=1 です。
➂ 個人情報の登録フォームの社員番号に wkcode を入れています。
⑹保存ボタンの埋め込みマクロを編集する。
マクロコードの最後に、新規レコードに移動して次に登録する社員番号を表示するようにしています。
newcode() は標準モジュールに作成した Function です。
⑺保存ボタンのプロパティを編集する。
➀「フォーカス取得時」にマクロ1、「フォーカス喪失時」にマクロ2を登録する。
⑻追加ボタンの埋め込みマクロを編集する。
今入力中のレコードをキャンセルして、新しいレコードを登録するための準備をします。
⑼リストボックスから社員一覧リストを作成する。
リストボックスを選択してフォーム上にクリックするとリストウィザードが起動します。
個人情報テーブルを元にリストを作成します。
リストに表示する項目は、「社員番号」「在職区分」「氏名」としました。
リストボックスの名称は、「社員一覧」としました。
ラベルも同時に作成されますので、それぞれ適当な位置に配置してください。ラベルとリストボックスは連動
していますので、個別に移動したい場合は、左上の黒い■を右クリックしたまま移動してください。
リストボックスの名前と列幅を項目に合わせて調整します。
値集合ソースに SQL文が作成されているのを確認できます。クエリービルダーを開くと見やすいです。
⑽フォームプロパティにイベント処理を追加する
➀「読み込み時」にイベントプロシジャーを設定し、VBAで最終レコードに移動するコードを記述する。
Private Sub Form_Load()
DoCmd.GoToRecord , , acLast この行を記入する
me.社員一覧=me.社員番号 この行を記入する
End Sub
DoCmd.GoToRecord , , acLast この行を記入する
me.社員一覧=me.社員番号 この行を記入する
End Sub
➁備考テキストの「フォーカス喪失時」は、保存ボタンにカーソルを移動する コードを記述する。
Private Sub 備考_Exit(Cancel As Integer)
Me.保存.SetFocus この行を記入する
End Sub
Me.保存.SetFocus この行を記入する
End Sub
⑾社員一覧リストからのダブルクリックで社員を選択する
➀ Private Sub 社員一覧_DblClick
社員一覧の行をダブルクリックしたときに発生するイベント処理のサブルーチンです。
➁ Dim wkcode as long, wk as long
長整数の変数 wkcode と wk を定義しています。
➂ この先のステップにおいてエラーが発生した場合には、er社員一覧 にジャンプするようにします。
➃ Me.Undo
データ入力を無効にします。
新規レコードの追加に場合は、社員番号に最大値+1が表示されていますので、既にこのレコードへの
入力が発生しているとみなされます。そのため、社員番号の表示を取り消し初期状態に戻しています。
➄ Me.社員一覧.Requery
選択されたデータのレコード順をカウントするため、SQL文を再実行します。
➅wkcode=me.社員一覧
現在選択されている社員コードを変数 wkcode に保存しています。
wk=Dcount("*","個人情報","社員番号<=" & wkcode")
個人情報テーブルで、社員番号が wkcode 以下のレコード数を wk に保存しています。
Access のレコード移動機能は指定値への移動ではなくレコードの登録順番を指しています。
よって、今選択された社員番号より小さい社員番号のレコード数を数えることによって、何番目の
レコードかを調べています。
➆ DoCmd.GotoRecord , , acGoto,wk
wk番目のレコードに移動します。
Exit Sub でサブルーチンから抜け出します。
➇ Cancel=True
エラーがあった場合は、処理をキャンセルしてサブルーチンから抜け出します。
⑿社員一覧リストのクリックで社員一覧を最新の状態にする
➀新規登録や削除を行った場合、リストに反映するように SQL文を再実行します。
Private Sub 社員一覧_Click()
Me.Undo
Me.社員一覧.Requery
End Sub
Me.Undo
Me.社員一覧.Requery
End Sub
⒀社員一覧リストのプロパティを編集する
「タブストップ」を「いいえ」にします。
社員一覧リストにカーソルを移動させる必要は
ないので止めます。
長くなりました。この続きは次回にアップします
社員番号をシステムで管理するため、「新規追加」を止める必要があった、
社員番号を使用不可にしたため社員番号の検索が機能しなくなった、
ためです。
新規追加は、現在の最大社員番号+1を表示する機能を追加したボタンを作成しました。
社員の検索は、社員一覧リストから選択できるようにしました。