ログイン機能の設計と概要

NO IMAGE

Accessシステムを複数人で運用する場合、「誰がいつ使ったか」を記録する仕組みは運用管理の基本になります。このページでは、ログイン・ログアウト機能の画面構成と処理の流れを解説します。

ログイン時には従業員コードの入力だけで氏名・権限・パスワードを従業員マスタから自動取得し、メインメニューへ転記します。転記された情報はメインメニューを閉じるまで保持され、他のフォームでも活用されます。ログアウト時には日時をテーブルに記録し、一定期間で自動削除する設計にしています。


ログイン画面(F90ログインフォーム)

Accessを起動すると、オプション設定により最初にポップアップで表示されるフォームです。入力するのは従業員コードとパスワードの2項目だけです。

項目 内容
従業員コード 手入力。入力後にマスタから氏名・権限・PWを自動取得
氏名 自動表示。編集ロック・タブストップOFFで入力不可
パスワード 定型入力プロパティでパスワード設定。表示は****
ログインボタン 未入力チェック→PW照合→メインメニューを開く
閉じるボタン Accessごと終了するマクロを設置

デザインビューで見る仕組み

実行時には見えない非表示テキストボックスの配置を確認できます。権限・パスワード照合用・ログイン時間はすべて非表示で、マクロから参照・記録するために配置しています。

項目 種別 内容
氏名 表示 DLOOKUPで取得・編集ロック
権限 非表示 DLOOKUPで取得・メインメニューへ転記
パスワード照合用 非表示 DLOOKUPで取得・入力PWと比較
ログイン時間 非表示 Now()で取得・テーブルに記録

ログイン処理の流れ

ログインボタンを押したときのマクロが順番に処理を実行します。

  1. 従業員コード・パスワードの未入力チェック
  2. 在籍確認(従業員マスタに存在するコードか)
  3. 入力パスワードと取得済みパスワードの照合
  4. 一致していればメインメニューを開き氏名・権限を転記
  5. ログイン時間をテーブルに記録するクエリを実行

メインメニューへの転記

ログインが完了するとメインメニューが開きます。ログイン時に取得した情報が各所に転記され、売上額・受注額もその場で集計されて表示されます。

項目 内容
ユーザー・権限 ログイン時に氏名・権限を転記。他フォームの登録者欄にも自動反映
年度・月次売上額 「いつから」「いつまで」の日付をマクロで取得して自動集計・表示
システムの終了 クリックでログアウトフォームを表示。ログアウト処理はそちらで実行

※金額の表示はサンプルデータが揃ってないので表示されません

デザインビューで見る仕組み

メインメニューのフォームヘッダーには、ログイン情報や集計用の日付など、多くの非表示テキストボックスが配置されています。メインメニューはログインからログアウトまで閉じないため、ここに保持したデータを各フォームで共有して活用します。

番号 種別 内容
① 従業員コード・権限 非表示 ログイン画面から転記。権限制御に使用
② ユーザー名・権限 表示 ①を参照してDLOOKUPでフルネームと権限を日本語で表示
③ 当月いつから・いつまで 非表示 マクロで当月1日~末日を自動代入。当月集計クエリで使用
④ 年度いつから・いつまで 非表示 マクロで決算日翌日~決算日を自動代入。年度集計クエリで使用
⑤ 各フォーム読み込み用 非表示 ログイン時には直接使わないが、各フォームへデータを提供
⑥ 年度売上額合計 非連結 ④の期間で集計した年度売上額を代入して表示
⑦ 当月受注額・売上額 非連結 ③の期間で集計した当月受注額・売上額を代入して表示
⑧ 略称 非表示 従業員コードから略称を取得。各フォームの入力欄に自動転記
⑨ 改修履歴 表示 システム改修後に手打ちで更新日を記録

ログイン時の転記の流れ

メインメニューが開いた直後に実行される処理の順番です。

  1. ログインフォームから従業員コード・氏名・権限を受け取り転記
  2. マクロで当月1日~末日(③)を取得して代入
  3. マクロで決算日翌日~決算日(④)を取得して代入
  4. 略称(⑧)を従業員マスタから取得して代入
  5. ③④の日付を使って売上額・受注額の集計クエリを実行
  6. 集計結果を⑥⑦に代入して画面に表示

ログインマクロの構成(M90ログイン)

ログイン機能に関わるマクロはすべて「M90ログイン」に集約しています。ボックスごとに個別のマクロを作ると後から探すのが大変になるため、関連するサブマクロをひとつのメインマクロにまとめる構成にしています。

サブマクロ名 実行タイミング 役割
在籍有無 従業員コード・更新後処理 在籍確認・略称・権限・PWの取得
パスワード パスワード・更新後処理 入力PWとマスタPWの照合
メインメニュー開く ログインボタン・クリック時 未入力チェック・ログイン記録・メインメニューを開く
開く時 メインメニュー・開く時 日付取得・売上額・受注額の集計と代入
閉じる 閉じるボタン・クリック時 Accessを終了

従業員コードの更新後処理(在籍有無)

従業員コードを入力してEnterを押した瞬間に実行されます。まず在籍確認を行い、在籍していれば略称・権限・ログインパスワードを従業員マスタからDLOOKUPで取得して非表示ボックスに転記します。

サブマクロ:在籍有無

サブマクロのテキスト表記
サブマクロ:在籍有無

If IsNull([従業員コード]) Then
    メッセージボックス(従業員コードを入力して下さい。)
    コントロールの移動(従業員コード)
    マクロの中止

If DCount("従業員コード","Q90ログイン在籍有無",
    "[従業員コード] = Forms![F90ログイン]![従業員コード]") = 0
    Or IsNull(DCount(...)) Then
    メッセージボックス(この従業員番号は現在在籍していません。)
    コントロールの移動(ログインボタン)
    値の代入:[従業員コード] = Null
    コントロールの移動(従業員コード)
    マクロの中止

Else
    値の代入:[略称]
        = DLookUp("略称","Q90ログイン在籍有無",
          "[従業員コード] = Forms![F90ログイン]![従業員コード]")
    値の代入:[権限]
        = DLookUp("権限","Q90ログイン在籍有無",
          "[従業員コード] = Forms![F90ログイン]![従業員コード]")
    値の代入:[ログインパスワード]
        = DLookUp("ログインパスワード","Q90ログイン在籍有無",
          "[従業員コード] = Forms![F90ログイン]![従業員コード]")
    コントロールの移動(パスワード)
    マクロの中止

 

処理 内容
未入力チェック コードが空の場合はメッセージを表示して中止
在籍確認 Q90ログイン在籍有無クエリでDCountを使い在籍を確認
略称取得 DLOOKUPで従業員マスタから略称を非表示ボックスに転記
権限取得 DLOOKUPで従業員マスタから権限を非表示ボックスに転記
PW取得 DLOOKUPでログインパスワードを非表示ボックスに転記

マクロの設置場所

項目 内容
フォーム F90ログイン
コントロール 従業員コード欄
イベント 更新後処理
呼び出し元 M90ログイン.在籍有無

 

パスワードの更新後処理(パスワード照合)

パスワードを入力してEnterを押した瞬間に実行されます。クエリは使わず、非表示ボックスに転記済みのパスワードと入力されたパスワードをStrComp関数で直接比較して可否を判断します。

サブマクロ:パスワード

サブマクロのテキスト表示
サブマクロ:パスワード

If StrComp([Forms]![F90ログイン]![パスワード],
           [Forms]![F90ログイン]![ログインパスワード], 0) = 0 Then
    コントロールの移動(ログインボタン)
    マクロの中止

Else
    メッセージボックス(パスワードが違います。もう一度入力してください。)
    コントロールの移動(従業員コード)
    コントロールの移動(パスワード)
    値の代入:[パスワード] = Null
    マクロの中止

 

処理 内容
PW照合 StrComp関数で入力PWと取得済みPWを文字列比較(大文字小文字を区別)
一致 ログインボタンへフォーカスを移動
不一致 エラーメッセージを表示・パスワード欄をクリアして再入力

マクロの設置場所

項目 内容
フォーム F90ログイン
コントロール パスワード欄
イベント 更新後処理
呼び出し元 M90ログイン.パスワード

 

ログインボタンのクリック処理(メインメニュー開く)

ログインボタンを押したときに実行されます。未入力チェックを行ったあと、ログイン時間の記録・メインメニューを開く・情報の転記を順番に処理します。

サブマクロ:メインメニュー開く

サブマクロのテキスト表示
サブマクロ:メインメニュー開く

If IsNull([従業員コード]) Then
    メッセージボックス(従業員コードを入力して下さい。)
    コントロールの移動(従業員コード)
    マクロの中止

If IsNull([パスワード]) Then
    メッセージボックス(パスワードを入力して下さい。)
    コントロールの移動(パスワード)
    マクロの中止

値の代入:[ログイン時間] = Now()
メッセージの設定(いいえ)
クエリを開く(Q90ログイン追加, データシート, 編集)
フォームを開く(F00メインメニュー, フォームビュー, 標準)
値の代入:[Forms]![F00メインメニュー]![従業員コード]
    = [Forms]![F90ログイン]![従業員コード]
値の代入:[Forms]![F00メインメニュー]![権限]
    = [Forms]![F90ログイン]![権限]
ウィンドウを閉じる(フォーム, F90ログイン, 確認)
マクロの実行(M00メインメニュー.開く時)
マクロの中止

 

処理 内容
未入力チェック コード・パスワードが空の場合はメッセージを表示して中止
ログイン時間記録 Now()で現在日時を非表示ボックスに取得
ログイン追加クエリ Q90ログイン追加を実行してログイン記録をテーブルに保存
メインメニューを開く F00メインメニューをフォームビューで表示
情報転記 従業員コード・権限をメインメニューの非表示ボックスに転記
フォームを閉じる F90ログインフォームを閉じる
開く時マクロ実行 M00メインメニュー.開く時を呼び出して売上額集計を実行

マクロの設置場所

項目 内容
フォーム F90ログイン
コントロール ログインボタン
イベント クリック時
呼び出し元 M90ログイン.メインメニュー開く

 

メインメニューの開く時処理

メインメニューが開いた直後に実行されます。当月・年度の日付範囲をマクロで自動計算して代入し、それを使って売上額・受注額の集計クエリを実行します。

サブマクロ:開く時

サブマクロのテキスト表示
サブマクロ:開く時

値の代入:[Forms]![F00メインメニュー]![いつから]
    = DateSerial(Year(Date()), Month(Date()), 1)
値の代入:[Forms]![F00メインメニュー]![いつまで]
    = DateSerial(Year(Date()), Month(Date())+1, 0)
値の代入:[Forms]![F00メインメニュー]![いつからa]
    = IIf(Month(Date())>=8,
      DateSerial(Year(Date()),8,1),
      DateSerial(Year(Date())-1,8,1))
値の代入:[Forms]![F00メインメニュー]![いつまでa]
    = IIf(Month(Date())<7,
      DateSerial(Year(Date()),7,31),
      DateSerial(Year(Date())+1,7,31))
値の代入:[Forms]![F00メインメニュー]![売上額年間]
    = DLookUp("金額の合計","Q00売上額年間")
値の代入:[Forms]![F00メインメニュー]![受注額]
    = DLookUp("金額","Q00受注額")
値の代入:[Forms]![F00メインメニュー]![売上額]
    = DLookUp("金額の合計","Q00売上額")
マクロの中止

※サンプル会社の決算が毎年7月末を反映しています

 

処理 内容
いつから DateSerialで当月1日を自動計算
いつまで DateSerialで当月末日を自動計算
いつからa 決算月(8月)を基準に年度開始日を自動計算
いつまでa 決算月(7月末)を基準に年度終了日を自動計算
売上額年間 Q00売上額年間クエリの結果をDLOOKUPで取得
受注額 Q00受注額クエリの結果をDLOOKUPで取得
売上額 Q00売上額クエリの結果をDLOOKUPで取得

マクロの設置場所

項目 内容
フォーム F00メインメニュー
コントロール フォーム自体
イベント 開く時
呼び出し元 M00メインメニュー.開く時

 

関連クエリの構成

在籍確認クエリ(Q90ログイン在籍有無)

従業員マスタ(T01従業員M)から退職日がNull(現在在籍中)のレコードだけを抽出するクエリです。在籍確認とDLOOKUPによる情報取得の両方に使用します。

フィールド テーブル 条件
従業員コード T01従業員M
略称 T01従業員M
退職日 T01従業員M Is Null(在籍中のみ)
ID T01従業員M
権限 T01従業員M
ログインパスワード T01従業員M

ログイン記録クエリ(Q90ログイン追加)

ログインボタン押下時に実行される追加クエリです。従業員コードとログイン時間をログテーブル(T90ログイン)に記録します。

フィールド 内容
式1 Forms![F90ログイン]![従業員コード]
式2 Forms![F90ログイン]![ログイン時間]
レコードの追加先 従業員コード・ログイン

当月受注額クエリ(Q00受注額)

受注テーブル(T20受注M)から当月分の受注金額を集計するクエリです。メインメニューの「いつから」「いつまで」を条件として使用します。取消・社内向けは除外する条件も設定しています。

フィールド 集計 条件
金額: Sum([数量]*[単価]) 演算
受注日 Where条件 Between [いつから] And [いつまで]
取消日 Where条件 Is Null
手配番号 Where条件 Not Like “F*” And Not Like “SS*” And Not Like “SY*”

※社内ルールの手配番号がF・SS・SYで始まる先行手配分の注文は除外して顧客からの正式注文だけを抽出する

当月売上額クエリ(Q00売上額)

売上テーブル(T25売上M)から当月分の売上金額を集計するクエリです。「いつから」「いつまで」の範囲で売上日を絞り込みます。

フィールド 集計 条件
金額の合計: 金額 合計
売上日 Where条件 Between [いつから] And [いつまで]

年間売上額クエリ(Q00売上額年間)

売上テーブル(T25売上M)から年度分の売上金額を集計するクエリです。「いつからa」「いつまでa」の年度範囲で集計し、年ごとにグループ化して表示します。

フィールド 集計 条件
年: Format([売上日],”yyyy年”) グループ化
金額の合計: 金額 合計
売上日 Where条件 Between [いつからa] And [いつまでa]

 

 

本サイトではマクロを用いた構築手順を中心に紹介していますが、決してマクロを唯一の正解として推奨しているわけではありません。VBAが扱える環境であれば、より多彩で柔軟なプログラムが組めるVBAでの構築をむしろ推奨したいと考えています。

ここでマクロという選択肢を提示しているのは、VBAにハードルを感じている方への「もう一つの入り口」として、また将来的な後継者への引き継ぎ負荷を抑えるという実務上のメリットを考慮してのことです。設計の考え方の一つとして、状況に合わせて活用してください。