見出し画像

【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 にして
  ボタンを使用不可にしています

【まとめ】パスワードでフォームの更新権限を制限する

フォームには読み取り専用モードで開くことができます
ユーザーによって フォームを開いて 更新や削除・追加ができる権限をもつもの
フォームを開いても 閲覧はできるが 更新や削除・追加ができる権限はもたないもの
また まったく開かない つまり データさえ見ることができないもの

など 立場によって制限をかけることができると安心ですね


いいなと思ったら応援しよう!