従業員マスタ「編集」

従業員マスタの編集フォームは、新規登録フォームをベースに構成されています。従業員リストの編集ボタンから対象者を特定し、非連結フォームに情報を転記してスタートします。住所変更時の旧住所履歴保存・勤続年数の自動計算など運用を想定した機能も実装しており、更新処理は更新クエリをマクロで実行する設計です。


従業員マスタ「編集」画面の構成

編集フォームは2つのルートで開きます。リストの詳細ボタンから開いた場合は該当者の情報が転記された状態でスタートします。リストの編集ボタンから開いた場合は空の状態でスタートし、選択オプショングループと従業員検索コンボボックスで対象者を呼び出します。

編集画面はリストの詳細ボタンから開くと該当者の情報がそのまま表示されますが、続けて別の従業員を編集したい場合に毎回リストに戻るのは小さなストレスになります。そこで編集画面のトップに選択オプショングループと検索コンボボックスを設け、画面を閉じることなく次の対象者をすぐに呼び出せるようにしています。在籍者と退職者でリストが切り替わるため、目的の従業員をすばやく絞り込めます。

フォームビュー

画面の概要

項目 内容
選択 オプショングループで既存従業員・退職者を切り替え。検索コンボボックスの表示候補が連動して切り替わる
従業員検索 コンボボックスで対象者を選択。選択後にフォーム全体に情報を転記
氏名 新規登録では名字・名前の2コントロール。編集では結合して1コントロール
フリガナ 新規登録ではミョウジ・ナマエの2コントロール。編集では結合して1コントロール
旧住所として保存 住所変更時に現住所を日付付きで旧住所フィールドに追記
勤続年数 入社日から自動計算して表示。編集不可
在庫登録権限 在庫管理との連動権限をチェックボックスで付与
休暇区分 産休・育休・休職中など在籍中の特別な状態をコンボボックスで登録
所属略称・分類 所属部署テーブルから社内通称と分類を自動表示
訂正更新ボタン 確認メッセージ→更新クエリ実行→フォームリセット
キャンセルボタン 全コントロールを初期値に戻す
閉じるボタン フォームを閉じる(M99共通)

黒系の画面は編集中のサイン
このシステムでは編集フォームを黒系の配色で統一しています。画面を開いた瞬間に「既存データを編集している」と視覚で判断できる設計です。新規登録の青系と明確に異なる配色にすることで、誤操作の抑止にも働きます。配色ルールはシステム全体で共通のため、どのフォームを開いても同じ視覚的感覚で操作できます。

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

デザインビュー

デザインビューの概要

項目 設定内容
レコードソース 空欄(非連結フォーム)
選択 オプショングループ。規定値1(既存従業員)
従業員検索 コンボボックス。値集合ソースにクエリを設定
氏名・フリガナ 各1コントロール。更新後処理でStrConv変換
年齢 コントロールソースに計算式。生年月日から自動計算
勤続月 コントロールソースに計算式。可視:いいえ(非表示)
勤続年数 勤続月をもとに計算。編集ロック・使用可能:いいえ
旧住所として保存 コマンドボタン。クリック時に旧住所マクロを実行
従業員コード 編集ロック。検索コンボボックスから転記
在庫登録権限 チェックボックス
休暇区分 コンボボックス

各コントロールの設定

氏名・フリガナ

新規登録では名字・名前を別コントロールで入力していましたが、編集フォームでは結合して1コントロールに変更しています。更新後処理でStrConvによる半角統一を行う点は共通です。

サブマクロ:氏名

氏名フィールドの更新後処理に設定するマクロです。

氏名フィールドの「更新後処理」にこのサブマクロが紐づいています。

StrConv([氏名],8) で全角カタカナ・記号を半角に統一します。

処理 内容
StrConv( ,8) 全角文字を半角に変換

マクロの設置場所

氏名フィールドの更新後処理にマクロを設置します。

項目 内容
フォーム F01従業員編集
コントロール 氏名
イベント 更新後処理
呼び出し元 M01従業員 > サブマクロ:氏名

サブマクロ:フリガナ

フリガナフィールドの更新後処理に設定するマクロです。

フリガナフィールドの「更新後処理」にこのサブマクロが紐づいています。

StrConv([フリガナ],8) で全角カタカナを半角に統一します。

処理 内容
StrConv( ,8) 全角カタカナを半角に変換

マクロの設置場所

フリガナフィールドの更新後処理にマクロを設置します。

項目 内容
フォーム F01従業員編集
コントロール フリガナ
イベント 更新後処理
呼び出し元 M01従業員 > サブマクロ:フリガナ

「選択」オプショングループ・検索コンボボックス

既存従業員と退職者をオプショングループで切り替え、検索コンボボックスで対象者を絞り込みます。選択後に編集表示マクロがフォーム全体に情報を転記します。

① 「選択」オプショングループの設定

オプショングループで既存従業員(1)・退職者(2)を切り替えます。切り替えと同時に編集選択マクロが実行され、コンボボックスのリストが再構築されます。

サブマクロ:編集選択

選択オプショングループの更新後処理に設定するマクロです。

選択オプショングループの「更新後処理」にこのサブマクロが紐づいています。編集キャンセルマクロを呼び出してフォームをリセットし、再クエリでコンボボックスのリストを更新します。

ステップ 処理 内容
1 マクロの実行 M01従業員.編集キャンセルを呼び出してフォームをリセット
2 再クエリ コンボボックスのリストを選択値に合わせて更新
3 マクロの中止 後続処理を停止

マクロの設置場所

選択オプショングループの更新後処理にマクロを設置します。

項目 内容
フォーム F01従業員編集
コントロール 選択(オプショングループ)
イベント 更新後処理
呼び出し元 M01従業員 > サブマクロ:編集選択

② 検索コンボボックスの設定

コンボボックスの値集合ソースにクエリを設定します。選択オプショングループの値と連動して表示候補が切り替わります。

クエリビルダーの設定

コンボボックスの値集合ソースにクエリビルダーで以下のフィールドを設定します。

フィールド テーブル 並べ替え 表示 抽出条件
フリガナ T01従業員M 昇順
氏名 T01従業員M
略称 T01従業員M
従業員コード T01従業員M
選択:IIf(IsNull([退職日]),1,2) [Forms]![F01従業員編集]![選択]

退職日が空欄なら1(既存従業員)、入力済なら2(退職者)を返します。フォームの選択オプショングループの値と一致するレコードのみ表示される仕組みです。

コンボボックスのプロパティ設定

プロパティ 設定値 内容
列数 4 フリガナ・氏名・略称・従業員コードの4列を表示
列幅 4cm;4cm;2cm;0cm 従業員コード列は幅0で非表示
リスト幅 10cm 4+4+2=10cmに合わせる
連結列 4 コンボボックスには4列目の従業員コードが格納される

③ 編集表示マクロ

検索コンボボックスで対象者を選択後、フォーム全体に情報を転記するマクロです。

サブマクロ

サブマクロのテキスト表示
サブマクロ:編集表示

  値の代入
    アイテム  = [Forms]![F01従業員編集]![従業員コード]
    式      = [Forms]![F01従業員編集]![検索]

  値の代入
    アイテム  = [Forms]![F01従業員編集]![氏名]
    式      = DLookUp("氏名","T01従業員M","[従業員コード]=[Forms]![F01従業員編集]![従業員コード]")

  値の代入
    アイテム  = [Forms]![F01従業員編集]![フリガナ]
    式      = DLookUp("フリガナ","T01従業員M","[従業員コード]=[Forms]![F01従業員編集]![従業員コード]")

  ※以降、全フィールド分繰り返し

  マクロの中止
サブマクロの最後

検索コンボボックスの「更新後処理」にこのサブマクロが紐づいています。1行目で従業員コードをフォームに転記し、2行目以降はDLookUp関数でT01従業員Mテーブルから各フィールドの値を参照して転記します。

転記フィールド一覧

# アイテム(転記先) 参照フィールド
1 従業員コード 検索コンボボックスの値を直接転記
2 氏名 DLookUp(“氏名”)
3 フリガナ DLookUp(“フリガナ”)
4 略称 DLookUp(“略称”)
5 郵便番号 DLookUp(“郵便番号”)
6 都道府県 DLookUp(“都道府県”)
7 住所1 DLookUp(“住所1”)
8 住所2 DLookUp(“住所2”)
9 自宅TEL DLookUp(“自宅TEL”)
10 携帯TEL DLookUp(“携帯TEL”)
11 生年月日 DLookUp(“生年月日”)
12 メールアドレス DLookUp(“メールアドレス”)
13 性別 DLookUp(“性別”)
14 ログインパスワード DLookUp(“ログインパスワード”)
15 権限 DLookUp(“権限”)
16 所属部署 DLookUp(“所属部署”)
17 役職 DLookUp(“役職”)
18 緊急連絡先 DLookUp(“緊急連絡先”)
19 緊急時連絡TEL DLookUp(“緊急時連絡TEL”)
20 保険証番号 DLookUp(“保険証番号”)
21 血液型 DLookUp(“血液型”)
22 入社日 DLookUp(“入社日”)
23 退職日 DLookUp(“退職日”)
24 備考 DLookUp(“備考”)
25 旧住所 DLookUp(“旧住所”)
26 雇用区分 DLookUp(“雇用区分”)
27 在庫登録権限 DLookUp(“在庫登録権限”)
28 年間有休日数 DLookUp(“年間有休日数”)
29 休暇区分 DLookUp(“休暇区分”)

全フィールドの参照条件は [従業員コード]=[Forms]![F01従業員編集]![従業員コード] で統一しています。

マクロの設置場所

検索コンボボックスの更新後処理にマクロを設置します。

項目 内容
フォーム F01従業員編集
コントロール 検索(コンボボックス)
イベント 更新後処理
呼び出し元 M01従業員 > サブマクロ:編集表示

旧住所として保存

引っ越しなどで住所変更があった際に、現在の住所を日付付きで旧住所フィールドに追記します。2回3回と履歴が蓄積される設計です。

サブマクロ:旧住所

旧住所として保存ボタンのクリック時に実行するマクロです。

サブマクロのテキスト表示
サブマクロ:旧住所

  値の代入
    アイテム  = [旧住所]
    式      = [旧住所] & [郵便番号] & " " & [都道府県] & [住所1] & [住所2] & " " & Date() & " "

  マクロの中止
サブマクロの最後

旧住所ボタンの「クリック時」にこのサブマクロが紐づいています。既存の旧住所データを残したまま、現在の住所と日付を末尾に追記します。末尾の半角スペースは次回追記時の見栄えを整えるためのものです。

マクロの解説

要素 内容
[旧住所] 既存の旧住所データをそのまま先頭に残す
[郵便番号] 現在の郵便番号を追記
” “(半角スペース) 郵便番号と都道府県の間の区切り
[都道府県][住所1][住所2] 現在の住所を結合して追記
Date() 旧住所として保存した日付を記録
末尾の” “ 次回追記時の先頭に半角スペースを確保

マクロの設置場所

旧住所として保存ボタンのクリック時にマクロを設置します。

項目 内容
フォーム F01従業員編集
コントロール 旧住所として保存(コマンドボタン)
イベント クリック時
呼び出し元 M01従業員 > サブマクロ:旧住所

住所変更の際、多くの場合は新しい住所で上書きして終わりです。しかしこのフォームでは郵便番号・都道府県・住所1・住所2の4つのフィールドを1つのテキストにまとめたうえで、既存の旧住所データの末尾に追記する設計にしています。上書きではないので何度引っ越しをしても過去の住所がすべて残り、いつ変更したかの日付も自動で記録されます。住所履歴をわざわざ管理しなくても自然に蓄積されていく点が地味に便利です。

勤続年数の自動計算

入社日から勤続年数を自動計算します。退職者の場合は退職日を基準に計算します。勤続月(非表示)と勤続年数の2コントロールで構成しています。

勤続月コントロール(非表示)

勤続年数を計算するための中間値を保持するコントロールです。フォーム上には表示されません。

設定 内容
コントロールソース =IIf([入社日] Is Null,"",IIf([退職日] Is Null,DateDiff("m",[入社日],Date())+1,DateDiff("m",[入社日],[退職日])+1))
可視 いいえ(非表示)

概要

処理 内容
入社日がNull 空欄を表示
退職日がNull 入社日から今日まで何ヶ月か計算(+1で入社月を1ヶ月と見なす)
退職日が入力済 入社日から退職日まで何ヶ月か計算(+1同様)

勤続年数コントロール

勤続月の値をもとに「○年○カ月」形式で表示します。

設定 内容
コントロールソース =IIf([入社日] Is Null,"",[勤続月]\12 & "年" & [勤続月] Mod 12 & "カ月")
使用可能 いいえ
編集ロック はい
背景色 背景1, 暗め15%
タブストップ いいえ

概要

処理 内容
入社日がNull 空欄を表示
[勤続月]\12 整数除算で年数を取り出す
[勤続月] Mod 12 余りで月数を取り出す

勤続年数を「○年○カ月」で表示しようとすると、1つの式に詰め込むと複雑になりがちです。ここでは非表示の勤続月コントロールで「何ヶ月か」という中間値を先に計算し、勤続年数コントロールではその値を年と月に分けて表示するだけにしています。2段階に分けることで式がシンプルになるだけでなく、勤続月の数値を他の計算や条件分岐でも再利用できます。1つにまとめたくなりますが、あえて分けておく方が後々使いやすい設計です。

生年月日・入社日・退職日の和暦表示
日本では公的書類や社内帳票で和暦を求められる場面がまだ多くあります。このフォームでは生年月日・入社日・退職日の横に和暦を自動表示させています。西暦で入力するだけで和暦が隣に出るため、書類作成時にわざわざ変換する手間がありません。令和・平成・昭和をまたぐ生年月日でも正確に変換されるため、年代の幅広い従業員情報を扱う場面でさりげなく助かる機能です。
式:=Format([生年月日],”ggge\年m\月d\日”)

更新クエリの構成(Q01従業員編集更新)

フォームの各コントロールの値でT01従業員Mテーブルを更新する更新クエリです。従業員コードを抽出条件にして対象レコードを特定します。

クエリデザインビュー

クエリの概要

項目 内容
クエリ名 Q01従業員編集更新
種別 更新クエリ
対象テーブル T01従業員M
抽出条件 従業員コード = [Forms]![F01従業員編集]![従業員コード]
呼び出し元 M01従業員 > サブマクロ:編集訂正更新

フィールド構成

フィールド テーブル レコードの更新
氏名 T01従業員M [Forms]![F01従業員編集]![氏名]
フリガナ T01従業員M [Forms]![F01従業員編集]![フリガナ]
略称 T01従業員M [Forms]![F01従業員編集]![略称]
役職 T01従業員M [Forms]![F01従業員編集]![役職]
携帯TEL T01従業員M [Forms]![F01従業員編集]![携帯TEL]
自宅TEL T01従業員M [Forms]![F01従業員編集]![自宅TEL]
性別 T01従業員M [Forms]![F01従業員編集]![性別]
緊急連絡先 T01従業員M [Forms]![F01従業員編集]![緊急連絡先]
緊急時連絡TEL T01従業員M [Forms]![F01従業員編集]![緊急時連絡TEL]
郵便番号 T01従業員M [Forms]![F01従業員編集]![郵便番号]
都道府県 T01従業員M [Forms]![F01従業員編集]![都道府県]
住所1 T01従業員M [Forms]![F01従業員編集]![住所1]
住所2 T01従業員M [Forms]![F01従業員編集]![住所2]
保険証番号 T01従業員M [Forms]![F01従業員編集]![保険証番号]
備考 T01従業員M [Forms]![F01従業員編集]![備考]
入社日 T01従業員M [Forms]![F01従業員編集]![入社日]
退職日 T01従業員M [Forms]![F01従業員編集]![退職日]
所属部署 T01従業員M [Forms]![F01従業員編集]![所属部署]
メールアドレス T01従業員M [Forms]![F01従業員編集]![メールアドレス]
生年月日 T01従業員M [Forms]![F01従業員編集]![生年月日]
ログインパスワード T01従業員M [Forms]![F01従業員編集]![ログインパスワード]
権限 T01従業員M [Forms]![F01従業員編集]![権限]
旧住所 T01従業員M [Forms]![F01従業員編集]![旧住所]
雇用区分 T01従業員M [Forms]![F01従業員編集]![雇用区分]
年間有休日数 T01従業員M [Forms]![F01従業員編集]![年間有休日数]
在庫登録権限 T01従業員M [Forms]![F01従業員編集]![在庫登録権限]
休暇区分 T01従業員M [Forms]![F01従業員編集]![休暇区分]
従業員コード T01従業員M 抽出条件:[Forms]![F01従業員編集]![従業員コード]

[Forms]![F01従業員編集]![フィールド名] の形式でフォーム上の値を参照し、従業員コードが一致するレコードを更新します。追加クエリと異なり既存レコードを上書きするため、抽出条件による対象の特定が重要です。


訂正更新キャンセルボタンのマクロ

訂正更新ボタン

確認メッセージ・更新クエリ実行・完了メッセージ・フォームリセットを順番に処理します。冒頭にIsNull([従業員コード])チェックを設けており、対象者が表示されていない状態での誤実行を防いでいます。

サブマクロ:編集訂正更新

訂正更新ボタンのクリック時に実行するマクロです。

サブマクロのテキスト表示
サブマクロ:編集訂正更新

  警告音

  If  IsNull([従業員コード])  Then
    メッセージボックス(訂正する従業員が表示されていません, はい, 警告, エラー)
    コントロールの移動(検索)
    マクロの中止
  If文の最後

  If  MsgBox("訂正・編集したデータを更新してもよろしいですか?",4+32,"確認")=6  Then
    メッセージの設定(いいえ)
    クエリを開く(Q01従業員編集更新, データシート, 編集)
    メッセージボックス(訂正・編集したデータを更新しました。, はい, なし, 完了)
    ウィンドウを閉じる(, , 確認)
    再クエリ()
    マクロの中止

  Else
    メッセージボックス(中止しました, はい, なし, 中止)
    マクロの中止
  If文の最後

サブマクロの最後

訂正更新ボタンの「クリック時」にこのサブマクロが紐づいています。

マクロの解説

フェーズ 条件 処理
事前チェック 従業員コードがNull エラーメッセージ→検索コンボボックスにフォーカス移動→中止
確認ダイアログ MsgBoxで「はい」(戻り値=6) クエリ実行→完了メッセージ→ウィンドウを閉じる→再クエリ
確認ダイアログ 「いいえ」(Else) 「中止しました」メッセージ→マクロ中止

マクロの設置場所

訂正更新ボタンのクリック時にマクロを設置します。

項目 内容
フォーム F01従業員編集
コントロール 訂正更新ボタン
イベント クリック時
呼び出し元 M01従業員 > サブマクロ:編集訂正更新

キャンセルボタン

全コントロールをNullに戻して初期状態にリセットします。訂正更新完了後にも呼び出されます。新規登録のキャンセルマクロをベースに、編集フォーム固有のフィールドを追加・削除した構成です。

サブマクロ:編集キャンセル

キャンセルボタンのクリック時に実行するマクロです。

サブマクロのテキスト表示
サブマクロ:編集キャンセル

  値の代入([氏名], Null)
  値の代入([フリガナ], Null)
  値の代入([略称], Null)
  値の代入([郵便番号], Null)
  値の代入([都道府県], Null)
  値の代入([住所1], Null)
  値の代入([住所2], Null)
  値の代入([自宅TEL], Null)
  値の代入([携帯TEL], Null)
  値の代入([生年月日], Null)
  値の代入([メールアドレス], Null)
  値の代入([性別], Null)
  値の代入([所属部署], Null)
  値の代入([役職], Null)
  値の代入([緊急連絡先], Null)
  値の代入([緊急時連絡TEL], Null)
  値の代入([保険証番号], Null)
  値の代入([血液型], Null)
  値の代入([入社日], Null)
  値の代入([退職日], Null)
  値の代入([備考], Null)
  値の代入([ログインパスワード], Null)
  値の代入([権限], 1)
  値の代入([検索], Null)
  値の代入([従業員コード], Null)
  値の代入([旧住所], Null)
  値の代入([雇用区分], Null)
  値の代入([年間有休日数], Null)
  値の代入([在庫登録権限], False)
  値の代入([休暇区分], Null)

サブマクロの最後

キャンセルボタンの「クリック時」にこのサブマクロが紐づいています。

新規登録との差分

変更 フィールド 内容
削除 名字・名前・ミョウジ・ナマエ 編集フォームでは1コントロールに統合
追加 氏名・フリガナ 統合後のコントロール名
追加 検索・従業員コード 編集フォーム固有のコントロール
追加 旧住所 編集フォーム固有のコントロール
追加 在庫登録権限 False(チェックボックスのため)
追加 休暇区分 編集フォーム固有のコントロール

マクロの設置場所

キャンセルボタンのクリック時にマクロを設置します。

項目 内容
フォーム F01従業員編集
コントロール キャンセルボタン
イベント クリック時
呼び出し元 M01従業員 > サブマクロ:編集キャンセル

まとめ

編集フォームは新規登録フォームをベースに、既存データの呼び出し・更新に特化した構成に仕上げています。選択オプショングループと検索コンボボックスの連動で在籍者・退職者を素早く絞り込み、DLookUp関数で全フィールドをフォームに転記します。旧住所の履歴保存・勤続年数の自動計算など、登録後の運用を見据えた機能も組み込んでいます。更新処理は更新クエリをマクロで実行し、完了後はキャンセルマクロで自動リセットされるため、続けて次の編集作業にスムーズに移れる設計です。

 

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

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