前回は、カレンダーの作成を行いましたが今回は、当直順を決めるまでのフォームの作成を目標にします。
そのためにはまず、在籍している技師のテーブルを作成し、当直順のテーブルを作成します。その後、効率的に登録できるフォームを作成していきます。
Contents
技師テーブルの作成
この作業は簡単に終わらせてしまいましょう。
まずはメニューバーから「作成」タブを選択しフィールドを以下の図のように作成します。ちなみに、「在籍」のフィールドは今後の拡張を考えて作成していますので、今回は作成しなくても問題ありません。
テーブル名は「技師」としました。
メニューバーの「ホーム」を選択し、一番左の「表示」をクリックします。
分かりやすいようにIDが1番の人は名前を「一番」として付けてみました。これで、順番に登録されているか分かりやすくなります。私は35人分ほど登録しました。
「技師」のテーブルの作業はこれで終了です。
当直順のテーブルを作成
それでは、当直順のテーブルを作成していきます。
今回も、メニューバーの「作成」タブよりテーブルを作成します。
今回は前回とはちょっとことなり、当直IDはオートナンバー型は使用せず、整数型とします。理由としては、当直順は技師の退職や異動といったことで変更することになります。オートナンバー型にしておくと、テーブルの登録を一度全部削除して再度登録し再度登録すると削除する前の番号を引き継いでしまいます。これはちょっと面倒なことになるので今回はオートナンバー型を使用しませんでした。
今回、このテーブルには直接データを登録することはしません。フォームを使用して登録していきますので、ここまでで終了です。
日当直順を決めるフォームを作成
日当直順を登録するフォームを作成します。登録方法としてはフォーム上にボタンを配置し、そのボタン上に技師名を表示、ボタンを押すことで日当直順を登録できるフォームを作成します。
ボタンの配置
まず、私のいる職場で技師数は最大で45名ぐらいだろうと予想していますので、とりあえず、45個のボタンを配置しておきます。
縦15行、横3列で合計45個のボタンを配置しました。その際、一番初めのボタンは「ボタン1」として配置しその後は連番となるように配置しました。
理由としては、テーブル「技師」のレコード番号と一致させるためです。
まずは、このフォームを保存しておきましょう名前は「F_当直順設定」としました。
リストボックスの配置
右側にリストボックスを配置します。リストボックスは以下となります。
このリストボックスは登録した順番を表示するためのものです。
適当な大きさに設定しておきましょう。
フォームが開かれた時の動作
それでは、フォームが開かれた時にボタンに技師の名前が表示されるように設定しましょう。
フォームのどこかで右クリックします。「イベントのビルド」 ⇒ 「コードビルダ―」を選択します。
VBAの画面が表示されるので、上部の左側選択部分で「Form」右側を「Load」もしくは「Open」を選択します。
一度、すべてのボタンを初期化しておきます。初期化の条件としてすべてのボタンが押せる状態に変更し、ボタン上の表示を「–」しておきます。
これをボタン45個に設定していきます。
1 2 3 4 |
For ini = 1 To 45 Me(“コマンド” & ini).Enabled = True Me(“コマンド” & ini).Caption = “–“ Next ini |
初期化が終わったら、技師のテーブルに登録されている技師名を表示していきます。
その際、技師のテーブルを参照するコードはDlookupというコードを使います。
Dlookup(”探したいフィールの値”,”参照するテーブル”,”検索条件”)
今回の場合、技師のテーブルの名前が知りたいので初めに「名前」、真ん中にテーブル名ですので「技師」、そして検索条件で技師IDが「i」番目のレコードということになるので
gishi_name = DLookup(“[名前]”, “技師”, “[技師ID] = ” & i)
という感じになります。
技師の登録が無い場合、ボタンの表示を消すコードも足しておきました。
1 2 3 4 5 6 7 8 9 10 11 12 |
For i = 1 To 45 gishi_name = DLookup(“[名前]”, “技師”, “[技師ID] = “ & i) If IsNull(gishi_name) Then Me(“コマンド” & i).Visible = False Else Me(“コマンド” & i).Caption = gishi_name End If Next i |
フォームが開かれた時のコードをまとめると以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Private Sub Form_Load() DoCmd.SetWarnings WarningsOn:=False For ini = 1 To 45 Me(“コマンド” & ini).Enabled = True Me(“コマンド” & ini).Caption = “–“ Next ini For i = 1 To 45 gishi_name = DLookup(“[名前]”, “技師”, “[技師ID] = “ & i) If IsNull(gishi_name) Then Me(“コマンド” & i).Visible = False Else Me(“コマンド” & i).Caption = gishi_name End If Next i リスト52.Value = 1 End Sub |
日当直順のクエリを作成
フォームに戻り、リストに当直順を表示する準備をします。しかし、当直順テーブルをそのまま表示すると当直IDと技師IDだけの表示となり技師名が表示されません。なので、クエリを作成します。
「クエリデザイン」をクリックします。
テーブルの一覧が表示されるので「技師」と「当直順」のテーブルをダブルクリックします。
「当直順」テーブルの「技師ID」と「技師」テーブルの「技師ID」を繋ぎます。ドラックドロップの要領で繋ぎます。すると線でつながれますのでその線をクリックして右クリック「結合プロパティー」を選択します。この結合は当直順から技師のテーブルを見に行きますので下の図のような選択となります。
完了したら、「当直順」テーブルの「当直ID」、「技師」テーブルの「技師ID」、「技師」テーブルの「名前」をダブルクリックしていくと下の図のようになります。
また、表示は当直順に表示したいので当直IDの並び替えの部分を「昇順」に設定しておいてください
そしたら、保存します。名前は「K_日当直順」としました。
フォームに戻り、当直順のリストを選択します。プロパティーでデータタブ内の「値集合タイプ」で「テーブル/クエリ」を選択し、その上段「値集合ソース」で先ほどのクエリを選択します。
日当直順を登録する
続いてフォームのボタンを押した日当直順ときに登録できるコードを書いていきます。
流れとしては、日当直担当者文のレコードを作成し、技師のボタンを押すことでテーブルに技師コードを登録していく流れにしますのでまずは、日当直担当者分のレコードを作成する作業に入ります。
まずは、日当直担当者数を指定できるコンボボックスを作成します。また、その右隣にボタンを設置しておきます。
先ほど作成したリストボックスの上あたりに私は設置しました。
コンボボックスは下図のアイコンで作成できます。
設置をしたら、値を設定します。プロパティーシートで「値集合ソース」に数値を「,」で区切って入力していきます。
また、既定値を適当な数字に設定しておきましょう。
それでは、動作設定に入っていきます。
先ほど設置したボタン上で右クリックし、「イベントのビルド」⇒「コードビルダ―」を選択します。
このボタンの動作は、当直順のテーブルを一度全部削除し、当直担当者分のレコードを作成するコードを書いていきます。
ボタンが押された時にいきなり削除するのではなく、メッセージボックスで確認をとることにします。
1 2 |
ans = MsgBox(“リセットしてもいいですか?”, vbOKCancel) If ans = 2 Then Exit Sub |
上記コードではansという変数にメッセージボックスの戻り値を格納しています。この場合、キャンセルボタンが押された時は「2」という値が返ってくるので、もしansの値が「2」だった場合はコードを終了します。
メッセージボックスの戻り値が「2」以外の場合に当直順のテーブルのレコードを削除します。これもSQL文を使います。
1 2 |
sql_delete = “delete from 当直順” DoCmd.RunSQL sql_delete |
次に当直担当者分のレコードを作成していきます。
SQL文を使います。コードは以下となります。以下コードで「テキスト56」となっていますが、当直担当者名を入力する部分を、はじめテキストボックスで作成してしまったので、このような表記になっていますがここは、先ほど作成したコンボボックス名を入力してください。
1 2 3 4 5 6 |
For i = 1 To テキスト56 sql_insert = “INSERT INTO 当直順 VALUES(“ & i & “, null)” DoCmd.RunSQL sql_insert Next i リスト52.Requery |
sql_insert = “INSERT INTO 当直順 VALUES(” & i & “, null)”
の「null」ですが、当直順テーブルには「当直ID」、「技師ID」のフィールドがあって技師IDの部分には値を入力しないということを意味しています。ここの部分は、技師のボタンを押すことで埋めていきます。
リスト52.Requery
は当直順を表示しているリストを更新するコードです。
技師ボタンの動作設定
それでは、技師ボタンの動作設定をしていきます。
ボタンが押された時に行う動作は、押されたボタンに表示されている技師の技師IDを当直順のテーブルに登録していきます。IDはボタンの番号と一致するように設定してきました。
一つ一つのボタンに登録のコードを書いていくと変更があったときに大変な作業になるので、登録するコード部分だけ別でプロシージャ―を作成して、ボタンが押されたらボタンの番号を引数に、プロシージャ―を呼び出すようにします。
それでは、まず登録するプロシージャーを作成します。プロシージャ―名は「登録」としました。ボタンを押した際に引数を渡されますので、プロシージャ―名の後のカッコ内に受ける引数の名前(変数名)と型を記載しておきます。
下のコードでは、渡された引数は「登録」のプロシージャ―内で「ID」という変数名で扱われ、整数型として受けます。
それでは、登録のコードを書いていきます。
SQL文を使います。当直順のテーブルのレコードを更新するのでUPDATE文を使用します。コードとしては以下のようになります。リスト52とは当直順が表示されているリストになります。
テーブルに登録しただけではリストは更新されないので、更新のコードも足しておきます。
1 2 3 4 5 6 7 8 9 10 11 |
Private Sub 登録(ID As Integer) sql_update = “update 当直順 SET 技師ID = “ & ID & ” where 当直ID = “ & リスト52.Value & “;” DoCmd.RunSQL sql_update リスト52.Requery リスト52.Value = リスト52.Value + 1 Me(“コマンド” & ID & “”).Enabled = False End Sub |
それでは、それぞれのボタンに機能を付けていきましょう。
ボタンが押されたら「登録」というプロシージャ―を呼び出し、技師IDを引数として渡します。技師IDはボタンの番号となります。
プロシージャ―の呼び出しは、プロシージャ―名を書くだけです。その後に引数を書けばOKです。
1 2 3 |
Private Sub コマンド1_Click() 登録 1 End Sub |
上記コードをボタンの数だけ作成していきます。
ボタンの番号と、引数(登録の後の数字)として渡している数があっていることを確認してください。
追加機能です。詳しい説明は省きますが、当直順のリストをダブルクリックすることで修正できる機能も付けてみました。コードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Private Sub リスト52_DblClick(Cancel As Integer) sql_update = “update 当直順 SET 技師ID = NULL WHERE 当直ID = “ & ラベル55.Caption & “;” DoCmd.RunSQL sql_update リスト52.Requery For i = 1 To 45 If DCount(“技師ID”, “当直順”, “技師ID =” & i) > 0 Then Me(“コマンド” & i).Enabled = False Else Me(“コマンド” & i).Enabled = True End If Next i End Sub |
これで、当直順を登録するところまで完了しました。
それでは、実際に動かしてみてください。
いかがでしたか?きちんと動作しましたか?
次回は今回設定した当直順を、順番に割り振っていき一覧表を作るところまで説明できればいいなと思っています。
お疲れ様でした。