【ACCESS VBA】フォームを開くだけじゃない 便利な機能いろいろ
フォームの使いまわしとパスワードで制限
フォームの開き方は コマンドボタンからが一番多く使われています
前記事ではコマンドボタンに加えてコンボボックスやリストボックス
オプションボタンを使ってどのフォームを開くのかを判断する方法をご紹介しました
今回は ひとつのフォームを 社員マスタと車両マスタのどちらでも使える方法や
パスワードの入力をもとめたり 制限をかけ 読み取り専用で開く方法などを ご紹介していきます
ACCESSでサンプルをつくり 実際どう動くのか どんなコードを使うのか わかりやすく動画をつくりました
1. ひとつのフォームを使いまわす
【メリット】ひとつのフォームを使いまわすとは?
会社には管理しないといけない いろんな種類の情報があります
社員マスタや車両マスタ 商品マスタ 得意先マスタ 仕入先マスタ などなど
それぞれにたくさんの必要な項目が含まれています
そしてそれぞれにデータを登録したり修正したりといったフォームが
つくられています
しかし その情報をざっくりと知りたいときがあります
どんな名前が登録してあるんだろう どれくらい登録されているんだろう
この人のふりがなは?得意先の名前と営業担当だけ知りたい
全ての項目は知る必要がなく 3~5項目ぐらいあれば十分というとき
少ない項目数でできた簡単なフォームをひとつつくって
それぞれのマスタを表示する
そんなフォームを複数のマスタで使いまわせたら便利ですね
動作の流れ
ひとつのフォームに『社員マスタ』か『車両マスタ』のどっちを表示するかを選びます
『社員マスタ』を選んで 『開く』ボタンを押すと
『車両マスタ』を選んで 『開く』ボタンを押すと
このように まったく同じフォームを利用して
社員マスタの コード、氏名、カナを
車両マスタの コード、車両名、プレートナンバーを
表示しています
メニューフォームの作り方
フォームにリストボックスとコマンドボタンをひとつづつ配置します
リストボックス
名前:lst_open
列数:1
値集合ソース:"社員マスタ";"車両マスタ"
値集合タイプ:値リスト
連結列:1
値リストの編集の許可:いいえ
既定値:"社員マスタ"
複数選択:しない
コマンドボタン
名前:cmd_open
標題:開く
使いまわすフォームの作り方
ヘッダーにテキストボックスを1つ配置します
テキストボックス
名前:cbo_source
コントロールソース:=[Forms]![F_01_05]![lst_open]
※メニューフォームのリストボックスで選んだ値を表示しています
詳細セクションにテキストボックスを3つ配置します
テキストボックス
① 名前:txt_01
② 名前:txt_02
③ 名前:txt_03
VBA コード
リストボックスから『社員マスタ』か『車両をマスタ』を選んで
『開く』コマンドボタンをクリックしたときのイベントプロシージャ
Option Compare Database
Option Explicit
Private Sub cmd_open_Click()
Select Case Me.lst_open
Case "社員マスタ"
DoCmd.OpenForm "F_01_05_S"
Forms!F_01_05_S.RecordSource = "M_staff"
Forms!F_01_05_S.txt_01.ControlSource = "staff_code"
Forms!F_01_05_S.txt_02.ControlSource = "staff_name"
Forms!F_01_05_S.txt_03.ControlSource = "staff_kana"
Case "車両マスタ"
DoCmd.OpenForm "F_01_05_S"
Forms!F_01_05_S.RecordSource = "M_sharyo"
Forms!F_01_05_S.txt_01.ControlSource = "sharyo_code"
Forms!F_01_05_S.txt_02.ControlSource = "sharyo_name"
Forms!F_01_05_S.txt_03.ControlSource = "platenum"
End Select
End Sub
コード解説
Select Case Me.lst_open
Select Case文は、変数の値または条件式によって処理を分岐させたい場合に使用します。
Case~の後に値または条件式を入れ、条件式を満たす場合にCase以降の処理が実行されます。
つまり リストボックスMe.lst_open で得た値によって処理を分岐させます
Case "社員マスタ"
処理 ①
Case "車両マスタ"
処理 ②
Me.lst_open で選ばれた値が『社員マスタ』の場合 処理 ①を
『車両マスタ』が選ばれた場合 処理 ② を実行します
【処理 ①】社員マスタが選ばれた場合
DoCmd.OpenForm "F_01_05_S"
帳票フォーム『F_01_05_S』を開きます
Forms!F_01_05_S.RecordSource = "M_staff"
フォームのレコードソースに M_staff (社員マスタ)をセットします
Forms!F_01_05_S.txt_01.ControlSource = "staff_code"
テキストボックス txt_01 に staff_code (社員コード)をセットします
Forms!F_01_05_S.txt_02.ControlSource = "staff_name"
テキストボックス txt_02 に staff_name (社員氏名)をセットします
Forms!F_01_05_S.txt_03.ControlSource = "staff_kana"
テキストボックス txt_01 に staff_kana (社員かな)をセットします
【処理 ②】車両マスタが選ばれた場合
DoCmd.OpenForm "F_01_05_S"
帳票フォーム『F_01_05_S』を開きます
開くフォームは 社員マスタのときと同じフォームです
Forms!F_01_05_S.RecordSource = "M_sharyo"
フォームのレコードソースに M_sharyo (車両マスタ)をセットします
Forms!F_01_05_S.txt_01.ControlSource = "sharyo_code"
テキストボックス txt_01 に sharyo_code (車両コード)をセットします
Forms!F_01_05_S.txt_02.ControlSource = "sharyo_name"
テキストボックス txt_02 に sharyo_name (車両名)をセットします
Forms!F_01_05_S.txt_03.ControlSource = "platenum"
テキストボックス txt_03 に platenum (プレートナンバー)をセットします
End Select
Select Case 文の終わりには必ず End Select が必要です
【まとめ】ひとつのフォームを使いまわす
表示する帳票フォームをひとつだけ作っていろんな情報を使いまわす
この方法を使えば この記事で紹介したケースだけでなく
いろんなパターンで使うことができます
得意先マスタの 得意先コード、得意先名、担当営業
商品マスタの 商品コード、商品名、仕入先
仕入先マスタの 仕入先コード、仕入先名、電話番号
すべての項目は必要ない これだけ知れればOK というケースで使用します
項目数も 必要に応じで増減し つくってみましょう
2. 開く前にパスワードの入力を求める
【メリット】なんでパスワードが必要?
社員マスタに登録してある内容は 特にプライバシーにかかわるものが少なくありません
ユーザーがみんな簡単に社員情報を表示して
閲覧や更新・修正・削除などできてしまうと
とても問題です
そのために いったんパスワードの入力を求めて 正しいパスワードを入力したものだけフォームを表示する という制限をする機能が必要となります
この記事では パスワードの入力方法として
テキストボックスから と
インプットボックスから の
2種類をご紹介します
① テキストボックスから
動作の流れ
フォームに配置されたテキストボックスに
パスワードをいれて
開くボタンをクリック
パスワードが合っていれば 社員マスタの帳票フォームが開きます
パスワードを間違えると
『パスワードがちがいます』とメッセージが出て フォームを開くことなく
処理を終わります
カーソルはパスワード入力のテキストボックスに移動します
作り方
フォームに テキストボックスとコマンドボタンを1つずつ配置します
テキストボックス
名前:txt_pw
IME入力モード:オフ
コマンドボタン
名前:cmd_open
標題:開く
VBAコード
パスワードを入れて 『開く』コマンドボタンをクリックしたときの
イベントプロシージャ
Private Sub cmd_open_Click()
If Me.txt_pw.Value = "access" Then
DoCmd.OpenForm "F_02_S"
Else
MsgBox "パスワードがちがいます", vbInformation
Me.txt_pw.SetFocus
End If
End Sub
コード解説
If Me.txt_pw.Value = "access" Then
処理 ①
Else
処理 ②
End If
If文 で条件分岐します
テキストボックス txt_pwの値が "access" ならば
処理 ①を
そうでなければ 処理 ② を実行します
【処理 ①】パスワードが合っていたら
DoCmd.OpenForm "F_02_S"
フォーム F_02_S を開きます
【処理 ②】パスワードが間違っていたら
MsgBox "パスワードがちがいます", vbInformation
メッセージ 『パスワードがちがいます』と表示します
Me.txt_pw.SetFocus
テキストボックスにカーソルを移動します
② インプットボックスから
動作の流れ
『開く』コマンドボタンをクリックすると
インプットボックスが表示され パスワードの入力を促します
パスワードが正しければ 目的のフォームが開きます
キャンセルボタンを押すと
キャンセルされました とメッセージが出て処理を終わります
パスワードが間違っていたら
パスワードがちがいます とメッセージが出て処理を終わります
フォームの作り方
コマンドボタン 1つ 配置します
名前:cmd_open
標題:開く
VBAコード
『開く』コマンドボタンをクリック時イベントプロシージャ
Private Sub cmd_open_Click()
Dim pw As String
pw = InputBox("パスワードをいれてください")
If StrPtr(pw) = 0 Then
MsgBox "キャンセルされました"
ElseIf pw = "access" Then
DoCmd.OpenForm "F_02_S"
Else
MsgBox "パスワードがちがいます"
End If
End Sub
コードの解説
Dim pw As String
変数 pw を 文字列として定義します
pw = InputBox("パスワードをいれてください")
インプットボックスを表示し そこに入力された値を pw に代入します
If StrPtr(pw) = 0 Then
処理 ①
ElseIf pw = "access" Then
処理 ②
Else
処理 ③
End If
If文で 処理を分岐しています
【処理 ①】キャンセルボタンが押されたとき
If StrPtr(pw) = 0 Then
MsgBox "キャンセルされました"
『キャンセルされたました』をメッセージを表示します
インプットボックスで[キャンセル]ボタンをクリックすると
InputBox 関数は長さ 0 の文字列("")を返します
【処理 ②】パスワードが正しかったら
ElseIf pw = "access" Then
DoCmd.OpenForm "F_02_S"
パスワードの値が正しいとき フォーム F_02_S を開きます
【処理 ③】パスワードが間違っていたら
Else
MsgBox "パスワードがちがいます"
『パスワードがちがいます』とメッセージを表示します
End If
If 文の最後は必ず End If で閉じます
【まとめ】パスワードの必要性
個人情報を扱うフォームを開く場合
パスワードを求めることによって
システムを使うユーザーを制限することができます
パスワードを知っている者しか 開くことができないことは
セキュリティの強化には必要な機能です
3. 読み取り専用のフォームを開く
【メリット】読み取り専用フォームの必要性は?
読み取り専用のフォームとは
修正や更新、削除や新規追加などができず 閲覧のみできるフォームです
なぜ 必要なのでしょうか
業務中 情報を確認する必要がでてきます
しかし 更新や追加・削除ができてしまうと
怖くて 誰でも見せることはできません
前述でパスワードを入力して
フォームを全く開かないという機能をご紹介しましたが
それを組み合わせて
パスワードがあっていれば 更新可能のフォームを
まちがっていれば 閲覧しかできない 読み取り専用のフォームを開く
つまり パスワードによって 利用するユーザーの権限を制限します
動作の流れ
パスワードを入力し コマンドボタンをクリックします
パスワードが間違っていたら
パスワードがちがいます 読み取り専用で開きます
とメッセージが表示され OK ボタンを押すと
フォームが読み取り専用で開きます
レコードの移動はできますが閲覧のみで
修正や新規追加などはできません
新規ボタンを使用不可に設定しています
パスワードが正しければ
フォームが通常モードで開きます
更新も追加もでき 新規ボタンも使用可能になります
フォームの作り方
テキストボックスとコマンドボタンを1つずつ配置します
テキストボックス
名前:txt_pw
コマンドボタン
名前:cmd_open2
標題:パスワードが違ったら読み取り専用で開く
開いたフォームのコマンドボタンの設定
新規コマンドボタン
名前:cmd_05
標題:新規
VBAコード
コマンドボタンのクリック時イベントプロシージャ
Private Sub cmd_open2_Click()
If Me.txt_pw.Value = "access" Then
DoCmd.OpenForm "F_03_01"
Else
MsgBox "パスワードがちがいます 読み取り専用で開きます", vbInformation
DoCmd.OpenForm "F_03_01"
Forms!F_03_01.AllowEdits = False
Forms!F_03_01.AllowAdditions = False
Forms!F_03_01.AllowDeletions = False
Forms!F_03_01.cmd_05.Enabled = False
End If
End Sub
コード解説
If Me.txt_pw.Value = "access" Then
処理 ①
Else
処理 ②
End If
If 文により条件分岐しています
もし テキストボックスの値(txt_pw)が "access" なら
処理 ① を実行します
そうでなければ
処理 ② を実行します
End If でIf 文を閉じます
【処理 ① 】パスワードが正しい時
DoCmd.OpenForm "F_03_01"
普通にフォームを開きます
【処理 ② 】パスワードがちがう時
MsgBox "パスワードがちがいます 読み取り専用で開きます", vbInformation
パスワードがちがいます 読み取り専用で開きます と
メッセージボックスを表示します
アイコンに 情報メッセージアイコンを指定しています
DoCmd.OpenForm "F_03_01"
フォームを開きます
Forms!F_03_01.AllowEdits = False
更新の許可を False にして変更されないようにします
Forms!F_03_01.AllowAdditions = False
追加の許可を False にして追加ができないようにします
Forms!F_03_01.AllowDeletions = False
削除の許可を False にして削除ができないようにします
Forms!F_03_01.cmd_05.Enabled = False
新規コマンドボタン(cmd_05)の使用可能を False にして
ボタンを使用不可にしています
【まとめ】パスワードでフォームの更新権限を制限する
フォームには読み取り専用モードで開くことができます
ユーザーによって フォームを開いて 更新や削除・追加ができる権限をもつもの
フォームを開いても 閲覧はできるが 更新や削除・追加ができる権限はもたないもの
また まったく開かない つまり データさえ見ることができないもの
など 立場によって制限をかけることができると安心ですね