資材マスタの新規登録画面です。取引先・資材名・種別・単価などの必須項目を入力し、ダブりチェックを経て登録します。取引先を選択すると同じ取引先の登録済み資材が右側に一覧表示されるため、似た資材の重複登録に気づきやすい設計になっています。
資材マスタ新規登録画面の構成
メインメニューまたは資材リストの新規登録ボタンから起動します。左側が入力エリア、右側が選択中取引先の登録済み資材一覧です。
フォームビュー
左側の入力フォームと、右側の取引先別登録済み資材一覧(件数付き)が同時に確認できる画面です。
資材マスタ新規登録 ポップアップフォームビュー
画面の概要
各コントロールの役割を一覧にまとめます。登録者・所属部署は自動入力される点、取引先は直接選択と検索ボタンの2通りの入力方法がある点が特徴です。
画面の概要
| 項目 | 内容 |
|---|---|
| 登録者 | 登録者コードのコンボボックス。フォームを開いた時点でログイン従業員のコードが自動入力される |
| 資材と関連部署 | 所属部署コードのコンボボックス。登録者選択に連動して自動入力されるが変更も可能 |
| 取引先名(略称) | 取引先コードのコンボボックス(値集合ソースは取引先コード・略称の2列、表示は略称のみ)。直接選択のほか取引先検索ボタンからも入力可能 |
| 取引先検索ボタン | あいまい検索フォーム(F61資材発注取引先検索)を開く |
| 資材名 | 資材名の入力欄 |
| 種別 | 種別コードのコンボボックス |
| 仕様 | 仕様の入力欄(未入力時は登録時に半角スペースで補完) |
| 単価 | 単価の入力欄 |
| 最低発注数量 | 最低発注数量の入力欄 |
| 単位 | 単位のコンボボックス |
| ロット別単価マスタ登録ボタン | ロット別単価の登録画面(F60資材ロット単価)を開く |
| 備考 | 備考の入力欄(未入力時は登録時に半角スペースで補完) |
| ID | 次に採番されるIDのプレビュー表示(実際の採番はオートナンバー) |
| 取引先 資材マスタ(サブフォーム) | 選択中取引先コードで絞り込んだ登録済み資材一覧。資材名・仕様・単価・備考を表示 |
| 件数 | サブフォームの件数(=DCount(“*”,”Q60資材新規資材名サブ”)) |
| 新規登録ボタン | 入力内容をチェックしT60資材Mに登録する |
| キャンセルボタン | 入力内容をクリアする |
| 閉じるボタン | フォームを閉じる |
デザインビューで見る仕組み
フォームの内部構造を確認します。このフォームも非連結フォームで、コントロールの値を直接クエリの抽出条件・追加クエリに渡す設計です。
デザインビュー
入力エリアとサブフォームがどのように配置されているかを確認できます。
資材マスタ新規登録フォーム ポップアップデザインビュー
デザインビューの概要
主要なプロパティ設定をまとめます。IDコントロールにはオートナンバーのフェイルセーフとして計算式が入っています。
デザインビューの概要
| 項目 | 設定内容 |
|---|---|
| レコードソース | 空欄(非連結フォーム) |
| サブフォーム | Q60資材新規資材名サブを埋め込み |
| IDコントロールソース | =IIf(DCount(“ID”,”T60資材M”)=0,0,DMax(“ID”,”T60資材M”)+1) |
| フォームフッター | 新規登録・キャンセル・閉じるボタンを配置 |
フォームを開く仕組み
このフォームは「開くための起動マクロ」と「フォーム自体の開く時イベント」の2つの仕組みが組み合わさって初期化されます。
新規登録開くマクロ
資材リストの新規登録ボタンから呼び出され、フォームを開くだけのシンプルな処理です。
サブマクロ:新規登録開く
- サブマクロのテキスト表示
-
サブマクロ:新規登録開く フォームを開く (F60資材新規, フォームビュー, , , , 標準) マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 処理内容 | F60資材新規フォームをフォームビューで開く |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| フォーム | F60資材リスト |
| コントロール | 新規登録ボタン |
| イベント | クリック時 |
フォームの開く時イベント(新規開く時マクロ)
フォームが開いた直後に自動実行される処理です。登録者コードにログイン従業員のコードを代入し、所属部署の自動取得マクロを呼び出します。
サブマクロ:新規開く時
- サブマクロのテキスト表示
-
サブマクロ:新規開く時 値の代入 [Forms]![F60資材新規]![登録者コード]、[Forms]![F00メインメニュー]![従業員コード] マクロの実行 (M60資材.新規部署, , ) コントロールの移動 (取引先名) マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 値の代入 | ログイン中の従業員コードを登録者コードに自動設定 |
| マクロの実行 | M60資材.新規部署を呼び出し所属部署を自動取得 |
| コントロールの移動 | 取引先名にフォーカスを移し入力しやすくする |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| フォーム | F60資材新規 |
| イベント | フォームプロパティ「開く時」 |
「新規登録開く」がフォームを開く処理、「新規開く時」がフォームの初期化処理という役割分担です。呼び出し元が別々(前者はリスト画面のボタン、後者はフォーム自身のイベント)になっているため一見冗長に見えますが、フォームを開く経路が増えても初期化処理は必ず実行される安全設計になっています。
登録者所属部署の自動取得(新規部署マクロ)
登録者コードからT01従業員Mを検索し、所属部署コードと登録者名(略称)を自動入力します。
サブマクロ:新規部署
マクロの概要
| 項目 | 内容 |
|---|---|
| DLookup(所属部署コード) | 登録者コードに紐づく所属部署コードを取得 |
| DLookup(登録者) | 登録者コードに紐づく従業員略称を取得し表示用に格納 |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| マクロモジュール | M60資材 |
| 呼び出し元 | 新規開く時マクロ |
登録者コードが決まった時点で、所属部署は「その人がどこの部署の人か」で一意に決まります。このシステムでは登録者コードの確定と同時にDLookupで所属部署コードを自動取得し、コンボボックスに反映しています。
もちろんコンボボックスなので後から手動で変更することも可能です。担当者は基本的に何も操作せずに正しい所属部署が入った状態から入力を始められ、変更が必要な例外ケースにだけ手を動かせばよい設計です。
取引先の入力方法
取引先は「取引先名(略称)コンボボックスから直接選択」と「取引先検索ボタンからのあいまい検索」の2通りの入力経路があります。
取引先検索ボタン(あいまい検索フォームを開く)
フリガナの一部一致で取引先を検索できる専用フォームを開きます。このフォームは資材発注に関する他の画面でも使い回されているため、呼び出し元を区別する「選択」コントロールに1を設定してから開きます。
サブマクロ:取引先検索
マクロの概要
| 項目 | 内容 |
|---|---|
| フォームを開く | F61資材発注取引先検索をフォームビューで開く |
| 値の代入 | 選択コントロールに1を設定し「資材新規からの呼び出し」であることを識別させる |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| フォーム | F60資材新規 |
| コントロール | 取引先検索ボタン |
| イベント | クリック時 |
F61資材発注取引先検索 ポップアップフォーム
| フォームビュー | デザインビュー |
![]() |
![]() |
取引先検索適用マクロ
検索フォームで選択した取引先の略称を、資材新規フォームの取引先名コンボボックスに反映して検索フォームを閉じます。「選択」コントロールの値によって呼び出し元ごとの分岐処理を切り替える仕組みです。
サブマクロ:取引先検索適用
- サブマクロのテキスト表示
-
サブマクロ:取引先検索適用 If [Forms]![F61資材発注取引先検索]![選択]=1 Then 値の代入 [Forms]![F60資材新規]![取引先名]、[Forms]![F61資材発注取引先検索]![F61資材発注取引先検索サブ]![略称] ウィンドウを閉じる (フォーム, F61資材発注取引先検索, 確認) 再クエリ (コントロール名) コントロールの移動 (資材名) マクロの中止 If 文の最後 If [Forms]![F61資材発注取引先検索]![選択]=2 Then If 文の最後 If IsNull([Forms]![F61資材発注取引先検索]![選択]) Then マクロの中止 If 文の最後 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 選択=1の場合 | 資材新規フォームからの呼び出しとして、選んだ略称を取引先名に反映し検索フォームを閉じる |
| 選択=2の場合 | 他画面(資材新規以外)からの呼び出し用の分岐(本ページの対象外) |
| 選択が未選択(Null) | 何もせずマクロを終了(キャンセル扱い) |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| フォーム | F61資材発注取引先検索 |
| コントロール | 適用ボタン |
| イベント | クリック時 |
同一取引先の登録済み資材一覧
取引先を選択すると、その取引先で既に登録済みの資材一覧がサブフォームにリアルタイム表示されます。似た資材の重複登録を防ぐための仕組みです。
クエリ:Q60資材新規資材名サブ
取引先コードが確定している場合のみ、その取引先の登録済み資材(資材名・仕様・単価・備考)を抽出しサブフォームに表示させます。
Q60資材新規資材名サブ クエリデザインビュー
Q60資材新規資材名サブ フィールド構成
| フィールド | テーブル | 抽出条件 | 内容 |
|---|---|---|---|
| 取引先コード | T60資材M | [FORMS]![F60資材新規]![取引先コード] | 選択中の取引先で絞り込み |
| 資材名 | T60資材M | 一覧の「資材名」列 | |
| 仕様 | T60資材M | 一覧の「仕様」列 | |
| 単価 | T60資材M | 一覧の「単価」列 | |
| ID | T60資材M | 非表示(内部識別用) | |
| 備考 | T60資材M | 一覧の「備考」列 |
件数コントロール
サブフォームの件数をフッターに表示します。
| 項目 | 内容 |
|---|---|
| コントロールソース | =DCount(“*”,”Q60資材新規資材名サブ”) |
| 書式 | &” 件” |
ロット別単価マスタ登録ボタン
新規登録フォームのロット別単価マスタ登録ボタンです。入力途中の資材名・種別・単価・単位が揃っていることを確認してからロット単価登録フォームを開きます。フォーム自体の構成・登録処理の詳細は製品マスタと同じ仕組みのため、製品マスタ編集ページのロット別単価セクションで解説しています。>>>こちら
サブマクロ:ロット単価新規開く
- サブマクロのテキスト表示
-
サブマクロ:ロット単価新規開く If IsNull([取引先名]) Then If 文の最後 If IsNull([資材名]) Then メッセージボックス (ロット単価を登録する資材名が選択されていません, はい, 警告, 未選択) コントロールの移動 (資材名) マクロの中止 If 文の最後 If IsNull([種別コード]) Then メッセージボックス (種別が登録されていません, はい, 警告, 未入力) コントロールの移動 (種別コード) マクロの中止 If 文の最後 If IsNull([単価]) Then メッセージボックス (単価が登録されていません, はい, 警告, 未入力) コントロールの移動 (単価) マクロの中止 If 文の最後 If IsNull([単位]) Then メッセージボックス (単位が登録されていません, はい, 警告, 未入力) コントロールの移動 (単位) マクロの中止 If 文の最後 フォームを開く (F60資材ロット単価, フォームビュー, , , , 標準) 値の代入 [Forms]![F60資材ロット単価]![ID]、[Forms]![F60資材新規]![ID] 値の代入 [Forms]![F60資材ロット単価]![資材名]、[Forms]![F60資材新規]![資材名] 値の代入 [Forms]![F60資材ロット単価]![ロット単価追加].[Visible]、False マクロの実行 (M60資材.ロット単価登録, , ) 再クエリ (コントロール名) マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 必須項目チェック | 資材名・種別・単価・単位のいずれかが未入力ならメッセージを出して該当欄へ移動 |
| フォームを開く | F60資材ロット単価を開く |
| 値の代入 | 新規登録中の資材ID・資材名をロット単価フォームに引き継ぐ |
| マクロの実行 | M60資材.ロット単価登録を呼び出す |
ロット単価登録 フォームビュー
ロット別単価マスタ登録 関連ページ
製品マスタの編集フォームは新規登録フォームと同じ非連結の設計思想で構成されています。製品マスタ基本情報フォームの編集ボタンから図番IDを引き継ぎ、DLookupで全フィールドを転記した上で編集・更新する仕組みです。テーブルに直結させない理由[…]
新規登録ボタンの処理
入力内容のチェックからT60資材Mへの追加までの一連の流れです。ダブりチェック→必須項目チェック→確認ダイアログ→登録という順序で進みます。
ダブりチェック(Q60資材新規ダブりチェック)
取引先コードと資材名が完全一致するレコードが既に存在するかを確認するクエリです。
Q60資材新規ダブりチェック クエリデザインビュー
Q60資材新規ダブりチェック フィールド構成
| フィールド | テーブル | 抽出条件 |
|---|---|---|
| 取引先コード | T60資材M | [Forms]![F60資材新規]![取引先コード] |
| 資材名 | T60資材M | [Forms]![F60資材新規]![資材名] |
新規登録マクロ
必須項目を上から順にチェックし、すべて揃った時点で確認ダイアログを表示、はいが選ばれた場合のみ登録処理を実行します。
サブマクロ:新規登録
- サブマクロのテキスト表示
-
サブマクロ:新規登録 If DCount("*","Q60資材新規ダブりチェック")>0 Then メッセージボックス (この取引先、資材名で既に登録があります。ダブり登録です。確認してください。, はい, 警告, ダブり) マクロの中止 If 文の最後 If IsNull([登録者コード]) Then メッセージボックス (登録者が登録されていません, はい, 警告, 未入力) コントロールの移動 (登録者コード) マクロの中止 If 文の最後 If DCount("従業員コード","Q01従業員在籍者","[従業員コード] = Forms![F60資材新規]![登録者コード]")=0 Then メッセージボックス (登録者が在籍従業員には存在しません, はい, 警告, 従業員不明) コントロールの移動 (登録者コード) マクロの中止 If 文の最後 If IsNull([所属部署コード]) Then メッセージボックス (所属部署が登録されていません, はい, 警告, 未入力) マクロの中止 If 文の最後 If IsNull([取引先名]) Then メッセージボックス (取引先名が登録されていません, はい, 警告, 未入力) コントロールの移動 (取引先名) マクロの中止 If 文の最後 If DCount("取引先コード","T05取引先M","[取引先コード] = Forms![F60資材新規]![取引先コード]")=0 Then メッセージボックス (取引先が取引先マスタには存在しません, はい, 警告, 取引先不明) コントロールの移動 (取引先名) マクロの中止 If 文の最後 If IsNull([資材名]) Then メッセージボックス (資材名が登録されていません, はい, 警告, 未入力) コントロールの移動 (資材名) マクロの中止 If 文の最後 If IsNull([種別コード]) Then メッセージボックス (種別が登録されていません, はい, 警告, 未入力) コントロールの移動 (種別コード) マクロの中止 If 文の最後 If IsNull([単価]) Then メッセージボックス (単価が登録されていません, はい, 警告, 未入力) コントロールの移動 (単価) マクロの中止 If 文の最後 If IsNull([最低発注数量]) Then メッセージボックス (最低発注数量が登録されていません, はい, 警告, 未入力) コントロールの移動 (最低発注数量) マクロの中止 If 文の最後 If IsNull([単位]) Then メッセージボックス (単位が登録されていません, はい, 警告, 未入力) コントロールの移動 (単位) マクロの中止 If 文の最後 警告音 If MsgBox("新規登録してもよろしいですか?",4+32,"確認")=6 Then If IsNull([仕様]) Then 値の代入 [仕様]、" " If 文の最後 If IsNull([備考]) Then 値の代入 [備考]、" " If 文の最後 メッセージの設定 (いいえ) クエリを開く (Q60資材新規登録, データシート, 編集) メッセージボックス (資材マスタに新規登録しました, はい, なし, 登録完了) マクロの実行 (M60資材.キャンセル新規, , ) コントロールの移動 (登録者コード) マクロの中止 Else メッセージボックス (処理を中止しました, はい, なし, 中止) マクロの中止 If 文の最後 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| ダブりチェック | Q60資材新規ダブりチェックで同一取引先・資材名の重複を防止 |
| 必須項目チェック | 登録者・在籍確認・所属部署・取引先・資材名・種別・単価・最低発注数量・単位を順にチェック |
| 空欄補完 | 仕様・備考が未入力の場合は半角スペースで補完してから登録 |
| クエリを開く | Q60資材新規登録(追加クエリ)を実行しT60資材Mへ登録 |
| マクロの実行 | M60資材.キャンセル新規で入力欄をリセット |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| フォーム | F60資材新規 |
| コントロール | 新規登録ボタン |
| イベント | クリック時 |
登録クエリ(Q60資材新規登録)
T60資材Mへの追加クエリです。フォームの各コントロールの値をそのまま追加します。登録日・有効・棚卸の3項目はクエリに含めず、テーブル側の規定値(登録日=Date()、有効=True、棚卸=False)に任せています。
Q60資材新規登録 クエリデザインビュー
Q60資材新規登録 追加フィールド構成
| 追加先フィールド | 参照元 |
|---|---|
| 登録者コード | [Forms]![F60資材新規]![登録者コード] |
| 所属部署コード | [Forms]![F60資材新規]![所属部署コード] |
| 種別コード | [Forms]![F60資材新規]![種別コード] |
| 資材名 | [Forms]![F60資材新規]![資材名] |
| 仕様 | [Forms]![F60資材新規]![仕様] |
| 取引先コード | [Forms]![F60資材新規]![取引先コード] |
| 単価 | [Forms]![F60資材新規]![単価] |
| 最低発注数量 | [Forms]![F60資材新規]![最低発注数量] |
| 単位 | [Forms]![F60資材新規]![単位] |
| 備考 | [Forms]![F60資材新規]![備考] |
登録日・有効・棚卸はテーブルの規定値で自動設定されるフィールドです。
| フィールド | 規定値 |
|---|---|
| 登録日 | Date() |
| 有効 | True |
| 棚卸 | False |
ロット単価・元資材名は運用開始後に別画面から更新されるフィールドのため、この時点では空欄のまま登録されます。
IDコントロールの仕組み
IDコントロールには次に採番される番号をプレビュー表示する計算式が入っています。
| 項目 | 内容 |
|---|---|
| コントロールソース | =IIf(DCount(“ID”,”T60資材M”)=0,0,DMax(“ID”,”T60資材M”)+1) |
| 実際の採番方法 | T60資材MのIDフィールドはオートナンバー型のため、この計算式で登録することはない |
| 存在理由 | テーブルが空(0件)の場合にDMaxがエラーになるのを避けるためのフェイルセーフ |
次に採番されるIDをプレビュー表示したいだけなら=DMax("ID","T60資材M")+1で足りそうですが、テーブルに1件もレコードがない状態だとDMaxはNullを返し、+1の計算がエラーになります。
このシステムではIIf(DCount(...)=0, 0, DMax(...)+1)という形で、件数が0のときだけ0を返す分岐を挟んでいます。実運用ではまず発生しない状況(テーブルが完全に空)まで想定して崩れないようにしてある、地味だけれど堅牢な一手です。
キャンセルボタン
入力途中の内容をすべてクリアし、初期状態に戻します。
サブマクロ:キャンセル新規
- サブマクロのテキスト表示
-
サブマクロ:キャンセル新規 値の代入 [種別コード]、Null 値の代入 [取引先名]、Null 値の代入 [資材名]、Null 値の代入 [仕様]、Null 値の代入 [単価]、Null 値の代入 [最低発注数量]、Null 値の代入 [単位]、Null 値の代入 [備考]、Null 再クエリ () マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 値の代入 | 種別・取引先名・資材名・仕様・単価・最低発注数量・単位・備考をNullにクリア |
| 再クエリ | サブフォーム(登録済み資材一覧)を再表示 |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| フォーム | F60資材新規 |
| コントロール | キャンセルボタン、新規登録完了後(新規登録マクロから呼び出し) |
| イベント | クリック時 |
まとめ
資材マスタの新規登録は、登録者選択だけで所属部署が自動入力される点、取引先選択と同時に登録済み資材の一覧を表示して重複に気づきやすくしている点が特徴です。ダブりチェックと11項目の必須チェックを経てから登録する構成で、製品マスタの新規登録と同じ非連結フォーム+DLookup+クエリのパターンを踏襲しています。
本サイトではマクロを用いた構築手順を中心に紹介していますが、決してマクロを唯一の正解として推奨しているわけではありません。VBAが扱える環境であれば、より多彩で柔軟なプログラムが組めるVBAでの構築をむしろ推奨したいと考えています。
ここでマクロという選択肢を提示しているのは、VBAにハードルを感じている方への「もう一つの入り口」として、また将来的な後継者への引き継ぎ負荷を抑えるという実務上のメリットを考慮してのことです。設計の考え方の一つとして、状況に合わせて活用してください。