仕入先製品マスタの新規登録画面は、製品マスタの図番に対して発注先(仕入先)と担当課を登録する画面です。仕入先の検索と、ロット別単価の登録という2つのポップアップ機能を内包した、やや複雑な構成になっています。
仕入先製品マスタ新規登録画面の構成
製品マスタ図番・仕入先・仕入先単価・関連工程(成形/加工/印刷/材料)を入力して登録します。仕入先の選択は専用の検索画面から、ロット別単価は別のポップアップ画面から登録する構成です。
フォームビュー
仕入先製品マスタ新規登録 ポップアップフォームビュー
画面の概要
入力項目は以下の通りです。
仕入先製品新規登録 入力項目
| 項目 | 内容 |
|---|---|
| 製品マスタ図番 | 図番コンボボックス(製品マスタと連動) |
| 仕入先 | 仕入先検索ボタンから選択した仕入先を表示 |
| 仕入先単価 | 発注単価(自社製造は0) |
| ロット別単価登録 | ポップアップでロット別単価を登録するボタン |
| 関連工程 | 成形/加工/印刷/材料のチェックボックス |
| 有効/手配 | 状態フラグ |
| 備考 | 備考欄 |
デザインビューで見る仕組み
図番・仕入先はいずれも非連結のコンボボックスで、図番コンボの非表示列から図番ID・取引先コードを取得しています。仕入先コンボも同様に非表示列から仕入先名を参照しています。
デザインビュー
F30仕入先製品新規 ポップアップデザインビュー
デザインビューの概要
図番コンボボックスは=[図番].[Column](2)・=[図番].[Column](3)という式で、選択した図番に紐づく図番ID・取引先コードを非表示のまま取得しています。仕入先コンボも=[仕入先コード].[Column](1)で仕入先名を非表示取得しています。画面に見えているのは図番・仕入先の2つの入力欄だけですが、裏側では関連する複数の値が同時に確定する仕組みです。
図番コンボボックスの選択クエリ
仕入先検索の仕組み
仕入先は直接入力せず、専用の検索ポップアップから選ぶ設計です。取引先マスタのフリガナあいまい検索で候補を絞り込み、適用ボタンで新規登録画面に反映します。もちろん仕入先コンボボックスから選択しても反映されます。
フォームビュー
F30仕入先製品新規取引先検索 ポップアップフォームビュー
デザインビュー
F30仕入先製品新規取引先検索 ポップアップデザインビュー
クエリ:Q30仕入先製品新規取引先検索サブの構成
Q30仕入先製品新規取引先検索サブ クエリデザインビュー
T05取引先Mのフリガナをあいまい検索する条件に加えて、取引区分が「4(個人顧客)」のデータを除外しています。個人顧客はマスタ内の件数が多い一方でロット別単価の設定対象にならないため、あらかじめ除外してリストのボリュームを減らし、選びやすくしている設計です。
Q30仕入先製品新規取引先検索サブ 抽出条件
| フィールド | 抽出条件 |
|---|---|
| フリガナ | Like "*" & [Forms]![F30仕入先製品新規取引先検索]![検索] & "*" |
| 取引区分 | <>"4" |
仕入先検索ボタン(開くマクロ)
新規登録画面の「仕入先検索」ボタンから取引先検索画面を開くマクロです。
サブマクロ:仕入先検索
- サブマクロのテキスト表示
-
サブマクロ:仕入先検索 フォームを開く フォーム名:F30仕入先製品新規取引先検索 ビュー:フォーム ビュー フィルター名:(空欄) Where条件式:(空欄) データモード:(空欄) ウィンドウモード:標準 マクロの中止 サブマクロの最後
マクロの概要
| アクション | 内容 |
|---|---|
| フォームを開く | F30仕入先製品新規取引先検索をフォームビューで開く |
マクロの設置場所
| 設置場所 | イベント |
|---|---|
| F30仕入先製品新規:仕入先検索ボタン | クリック時 |
適用ボタン
検索結果から選んだ取引先コードを新規登録画面の仕入先コードに転記し、検索画面を閉じるマクロです。
サブマクロ:仕入先適用
- サブマクロのテキスト表示
-
サブマクロ:仕入先適用 値の代入 アイテム:[Forms]![F30仕入先製品新規]![仕入先コード] 式:[Forms]![F30仕入先製品新規取引先検索]![F30仕入先製品新規取引先検索サブ]![取引先コード] ウィンドウを閉じる オブジェクトの種類:フォーム オブジェクト名:F30仕入先製品新規取引先検索 オブジェクトの保存:確認 コントロールの移動:(仕入先コード) マクロの中止 サブマクロの最後
マクロの概要
| アクション | 内容 |
|---|---|
| 値の代入 | 選択した取引先コードを新規登録画面の仕入先コードに転記 |
| ウィンドウを閉じる | 検索画面を閉じる |
| コントロールの移動 | 仕入先コードにフォーカス |
マクロの設置場所
| 設置場所 | イベント |
|---|---|
| F30仕入先製品新規取引先検索サブ:適用ボタン | クリック時 |
ロット別単価登録の仕組み
仕入先単価がロット数によって変動する場合、新規登録画面から直接ポップアップを開いてロット別単価を登録できます。他のマスタでも同様の仕組みを紹介済みですが、仕入先製品マスタ独自の画面構成のため、あえてここでも紹介します。
フォームビュー
F30仕入先製品ロット単価登録 ポップアップフォームビュー
デザインビュー
F30仕入先製品ロット単価登録 ポップアップデザインビュー
前〜・後〜・なしの3つのYes/No型フラグの状態を判定するため、ロットコントロールのコントロールソースは=IIf([前~]=True,"~" & [ロット],IIf([後~]=True,[ロット] & "~",[ロット]))として、ロット数の前後にどちらの記号が付くかを見た目で判別できるようにしています。
クエリ:Q30仕入先製品ロット単価登録サブの構成
Q30仕入先製品ロット単価登録サブ クエリデザインビュー
このクエリはロット別単価登録専用で、ロット別フラグが常にTrue、旧単価は非表示のまま扱われる設計です。ロット・前〜・後〜・単価・備考・登録日を表示し、並べ替えは表示上のロット数値ではなくVal([ロット])の数値変換で昇順にしています。
Q30仕入先製品ロット単価登録サブ 抽出条件
| フィールド | 抽出条件 |
|---|---|
| ロット別 | True(固定) |
| 図番ID | [Forms]![F30仕入先製品ロット単価登録]![図番ID] |
ロット別単価登録ボタン(開くマクロ)
新規登録画面から、図番・仕入先が未選択の場合はエラーで止め、選択済みならロット単価登録画面をポップアップで開き、図番・仕入先の情報を転記するマクロです。ロット単価追加ボタンは開いた直後は非表示にし、うっかり未入力のまま追加ボタンを押されないようにしています。
サブマクロ:ロット単価新規開く
- サブマクロのテキスト表示
-
サブマクロ:ロット単価新規開く If IsNull([図番]) Then メッセージボックス(ロット単価を登録する図番が選択されていません, はい, 警告, 未選択) コントロールの移動(図番) マクロの中止 If 文の最後 If IsNull([仕入先コード]) Then メッセージボックス(ロット単価を登録する仕入先が選択されていません, はい, 警告, 未選択) コントロールの移動(仕入先コード) マクロの中止 If 文の最後 フォームを開く(F30仕入先製品ロット単価登録, フォーム ビュー, , , , 標準) 値の代入 アイテム:[Forms]![F30仕入先製品ロット単価登録]![図番ID] 式:[Forms]![F30仕入先製品新規]![図番ID] 値の代入 アイテム:[Forms]![F30仕入先製品ロット単価登録]![図番] 式:[Forms]![F30仕入先製品新規]![図番] 値の代入 アイテム:[Forms]![F30仕入先製品ロット単価登録]![仕入先コード] 式:[Forms]![F30仕入先製品新規]![仕入先コード] 値の代入 アイテム:[Forms]![F30仕入先製品ロット単価登録]![ロット単価追加].Visible 式:False マクロの実行 マクロ名:M30仕入先製品.ロット単価登録 再クエリ マクロの中止 サブマクロの最後
マクロの概要
| アクション | 内容 |
|---|---|
| Nullチェック | 図番・仕入先コードいずれか未選択ならエラーで中止 |
| フォームを開く | F30仕入先製品ロット単価登録をポップアップで開く |
| 値の代入 | 図番ID・図番・仕入先コードを転記 |
| 値の代入 | ロット単価追加ボタンを非表示化 |
| マクロの実行 | M30仕入先製品.ロット単価登録を実行 |
| 再クエリ | 一覧を最新化 |
マクロの設置場所
| 設置場所 | イベント |
|---|---|
| F30仕入先製品新規:ロット別単価登録ボタン | クリック時 |
ロット単価登録マクロ(初期表示制御)
ロット単価登録画面を開いた直後、各コントロールの表示状態を初期化するマクロです。
サブマクロ:ロット単価登録
- サブマクロのテキスト表示
-
サブマクロ:ロット単価登録 値の代入([Forms]![F30仕入先製品ロット単価登録]![ロット].Visible, True) 値の代入([Forms]![F30仕入先製品ロット単価登録]![単価].Visible, True) 値の代入([Forms]![F30仕入先製品ロット単価登録]![登録日], Date()) 値の代入([Forms]![F30仕入先製品ロット単価登録]![備考].Visible, True) 値の代入([Forms]![F30仕入先製品ロット単価登録]![前~].Visible, True) 値の代入([Forms]![F30仕入先製品ロット単価登録]![後~].Visible, True) 値の代入([Forms]![F30仕入先製品ロット単価登録]![なし].Visible, True) 値の代入([Forms]![F30仕入先製品ロット単価登録]![新規登録].Visible, True) コントロールの移動 コントロール名:ロット マクロの中止 サブマクロの最後
マクロの概要
| アクション | 内容 |
|---|---|
| 値の代入(複数) | ロット・単価・登録日・備考・前〜・後〜・なし・新規登録の各コントロールを表示状態にし、登録日に当日日付をセット |
| コントロールの移動 | ロットにフォーカス |
マクロの設置場所
| 設置場所 | イベント |
|---|---|
| M30仕入先製品:ロット単価新規開くから呼び出し | – |
ロット単価追加ボタン
ロット数・単価・登録日の未入力チェックと、前〜/後〜/なしのいずれか1つだけが選択されているかの判定を行ったうえで、Q30仕入先製品ロット単価登録追加を実行して登録するマクロです。
サブマクロ:ロット単価追加
- サブマクロのテキスト表示
-
サブマクロ:ロット単価追加 If IsNull([ロット]) Then メッセージボックス(ロット数が入力されていません, はい, 警告, 未入力) コントロールの移動(ロット) マクロの中止 If 文の最後 If IsNull([単価]) Then メッセージボックス(単価が入力されていません, はい, 警告, 未入力) コントロールの移動(単価) マクロの中止 If 文の最後 If IsNull([登録日]) Then メッセージボックス(登録日が入力されていません, はい, 警告, 未入力) コントロールの移動(登録日) マクロの中止 If 文の最後 If [ロット記入判定]<>1 Then メッセージボックス(ロットの「前〜」「後〜」「〜なし」が入力されていないか2つ以上入力されています, はい, 警告, 未入力) マクロの中止 If 文の最後 If IsNull([図番]) Then メッセージボックス(ロット単価を登録する図番が指定されていません, はい, 警告, 不明) マクロの中止 If 文の最後 警告音 If MsgBox("ロット単価を登録してよろしいですか?",4+32,"確認")=6 Then メッセージの設定(いいえ) クエリを開く(Q30仕入先製品ロット単価登録追加, データシート, 編集) If MsgBox("「"+[Forms]![F30仕入先製品ロット単価登録]![図番]+"」のロット単価を追加しました。") Then マクロの実行(M30仕入先製品.ロット単価クリア) 再クエリ マクロの中止 If 文の最後 Else メッセージボックス(中止しました, はい, 警告, 中止) マクロの中止 If 文の最後 サブマクロの最後
マクロの概要
| アクション | 内容 |
|---|---|
| 必須チェック | ロット・単価・登録日の未入力、前〜/後〜/なしの重複や未選択を判定して中止 |
| 確認メッセージ | 「ロット単価を登録してよろしいですか?」で登録意思を最終確認 |
| クエリを開く | Q30仕入先製品ロット単価登録追加をデータシートビューで実行 |
| 登録後の処理 | 完了メッセージ表示→ロット単価クリアマクロ実行→再クエリ |
マクロの設置場所
| 設置場所 | イベント |
|---|---|
| F30仕入先製品ロット単価登録:ロット単価追加ボタン | クリック時 |
「ロット記入判定」は=IIf([前~]=True,1,0)+IIf([後~]=True,1,0)+IIf([なし]=True,1,0)という式で、前〜・後〜・なしのうちどれか1つだけが選択されているかを数値化して判定しています。
ロット単価クリアマクロ
登録完了後、入力欄をリセットして次のロット入力に備えるマクロです。
サブマクロ:ロット単価クリア
- サブマクロのテキスト表示
-
サブマクロ:ロット単価クリア 値の代入([ロット], Null) 値の代入([単価], Null) 値の代入([登録日], Date()) 値の代入([備考], Null) 値の代入([前~], False) 値の代入([後~], False) 値の代入([なし], False) コントロールの移動(ロット) マクロの中止 サブマクロの最後
マクロの概要
| アクション | 内容 |
|---|---|
| 値の代入 | ロット・単価・備考をNullに戻し、登録日は当日日付を再セット |
| 値の代入 | 前〜・後〜・なしのフラグをFalseに戻す |
| コントロールの移動 | ロットにフォーカス |
マクロの設置場所
| 設置場所 | イベント |
|---|---|
| M30仕入先製品:ロット単価追加から呼び出し | – |
クエリ:Q30仕入先製品新規仕入先追加の構成
新規登録ボタン押下で実行される追加クエリです。図番コンボの非表示列から取得した図番ID・図番・取引先コードと、画面上の入力値を組み合わせて1レコードを追加します。
Q30仕入先製品新規仕入先追加 クエリデザインビュー
Q30仕入先製品新規仕入先追加 追加フィールド構成
| フィールド | 追加元 |
|---|---|
| 図番ID | [Forms]![F30仕入先製品新規]![図番ID] |
| 仕入先コード | [Forms]![F30仕入先製品新規]![仕入先コード] |
| 図番 | [Forms]![F30仕入先製品新規]![図番] |
| 仕入先単価 | [Forms]![F30仕入先製品新規]![仕入先単価] |
| 備考 | [Forms]![F30仕入先製品新規]![備考] |
| 手配 | [Forms]![F30仕入先製品新規]![手配] |
| 有効 | [Forms]![F30仕入先製品新規]![有効] |
| 成形課 | [Forms]![F30仕入先製品新規]![成形] |
| 加工課 | [Forms]![F30仕入先製品新規]![加工] |
| 印刷課 | [Forms]![F30仕入先製品新規]![印刷] |
| 材料課 | [Forms]![F30仕入先製品新規]![材料] |
| 登録日 | Date() |
| 取引先コード | [Forms]![F30仕入先製品新規]![取引先コード] |
なお図番コンボボックスのデザインビュー(Q30仕入先製品新規:クエリビルダー)は下記の通りで、T10製品MとT05取引先Mを結合し、図番・略称(仕入先名表示用)・図番ID・取引先コードを非表示列として取得しています。
図番コンボボックス元クエリ クエリデザインビュー
各コントロールの設定
図番・仕入先・単価・関連工程チェック・登録・クリア・閉じるの各コントロールをまとめて解説します。
新規登録ボタン
必須項目のチェックと確認メッセージのあと、Q30仕入先製品新規仕入先追加を実行して登録するマクロです。図番が製品マスタに存在するかもチェックしています。
サブマクロ:仕入先登録
- サブマクロのテキスト表示
-
サブマクロ:仕入先登録 If DCount("[図番]","T10製品M","[図番] = Forms![F30仕入先製品新規]![図番]")=0 Or IsNull(DCount("[図番]","T10製品M","[図番] = Forms![F30仕入先製品新規]![図番]")) Then メッセージボックス(製品マスタに図番が存在しません。仕入先製品マスタに登録するには製品マスタに存在する必要があります, はい, 警告, 登録不可) コントロールの移動(図番) マクロの中止 If 文の最後 If IsNull([仕入先コード]) Then メッセージボックス(仕入先が入力されていません, はい, 警告, 未入力) コントロールの移動(仕入先コード) マクロの中止 If 文の最後 If IsNull([仕入先単価]) Then メッセージボックス(仕入先単価が入力されていません, はい, 警告, 未入力) コントロールの移動(仕入先単価) マクロの中止 If 文の最後 警告音 If MsgBox("仕入先製品マスタに登録してよろしいですか?",4+32,"確認")=6 Then メッセージの設定(いいえ) クエリを開く(Q30仕入先製品新規仕入先追加, データシート, 編集) メッセージボックス(仕入先製品マスタに追加しました, はい, なし, 登録完了) マクロの実行(M30仕入先製品.仕入先クリア) マクロの中止 Else メッセージボックス(中止しました, はい, 警告, 中止) マクロの中止 If 文の最後 サブマクロの最後
マクロの概要
| アクション | 内容 |
|---|---|
| 存在チェック | 入力された図番が製品マスタに存在するかDCountで確認 |
| 必須チェック | 仕入先コード・仕入先単価の未入力を確認 |
| 確認メッセージ | 「仕入先製品マスタに登録してよろしいですか?」で登録意思を最終確認 |
| クエリを開く | Q30仕入先製品新規仕入先追加をデータシートビューで実行 |
| 登録後の処理 | 完了メッセージ表示→仕入先クリアマクロ実行 |
マクロの設置場所
| 設置場所 | イベント |
|---|---|
| F30仕入先製品新規:登録ボタン | クリック時 |
クリアボタン
入力欄をすべて初期化し、一覧を再クエリするマクロです。
サブマクロ:仕入先クリア
- サブマクロのテキスト表示
-
サブマクロ:仕入先クリア 値の代入 アイテム:[図番] 式:Null 値の代入([仕入先コード], Null) 値の代入([仕入先単価], Null) 値の代入([成形], False) 値の代入([加工], False) 値の代入([印刷], False) 値の代入([材料], False) 値の代入([有効], False) 値の代入([手配], False) 値の代入([備考], Null) 再クエリ マクロの中止 サブマクロの最後
マクロの概要
| アクション | 内容 |
|---|---|
| 値の代入(複数) | 図番・仕入先コード・仕入先単価・関連工程4項目・有効・手配・備考をすべて初期値に戻す |
| 再クエリ | 一覧を最新化 |
マクロの設置場所
| 設置場所 | イベント |
|---|---|
| F30仕入先製品新規:クリアボタン | クリック時 |
閉じるボタン
フォームを閉じるボタンです。M99共通.閉じるを呼び出す共通処理で統一されています。
閉じるボタンの解説はこちら
フォームごとに同じ処理のマクロを個別に作ると、マクロの数が際限なく増えて管理が大変になります。M99共通マクロはどのフォームでも使い回せる処理をサブマクロとして一箇所に集約したものです。コントロール名を統一しておくことでフォームを問わず同じ[…]
まとめ
仕入先製品マスタの新規登録は、通常の入力項目に加えて「仕入先検索」「ロット別単価登録」という2つのポップアップ機能を内包した構成です。図番コンボの非表示列活用、ロット単価追加ボタンの一時非表示、個人顧客の検索除外など、誤操作防止と検索性を両立させる細かな配慮が随所に入っています。
本サイトではマクロを用いた構築手順を中心に紹介していますが、決してマクロを唯一の正解として推奨しているわけではありません。VBAが扱える環境であれば、より多彩で柔軟なプログラムが組めるVBAでの構築をむしろ推奨したいと考えています。
ここでマクロという選択肢を提示しているのは、VBAにハードルを感じている方への「もう一つの入り口」として、また将来的な後継者への引き継ぎ負荷を抑えるという実務上のメリットを考慮してのことです。設計の考え方の一つとして、状況に合わせて活用してください。