Accessマクロで作る 受注管理「分納伝票印刷」フォームの作り方

受注時に発行する製造依頼書兼納品書とは別に、分納が発生した際に発行する伝票が「分納伝票」です。手配番号を指定して分納数量・発行枚数を入力し、いったんテーブルに蓄積してから、まとめて印刷する仕組みになっています。Accessのマクロだけで「複数件を貯めてから一括処理する」という業務フローを実現しているページです。

このページでは以下のことを解説しています。

  • 手配番号を選ぶだけで取引先・図番・分納残数などの受注データを自動表示(直近1年以内の未納品データのみに候補を限定)
  • 分納数量が残数を超えていないかを自動チェック(過剰登録の防止)
  • 発行枚数分をまとめて印刷用テーブルへ登録し、複数件を貯めてから一括印刷する2段階の運用
  • 登録完了後は入力欄を自動クリアし、続けて次の手配番号をテンポよく登録可能
  • プレビュー確認を経てから印刷し、印刷完了後は印刷用テーブルを自動で空にリセット(次回登録時の古いデータ混在を防止)
  • ミシン目入り用紙で1回の印刷から4種類の帳票(社内控え・現品票・納品書・受領書)を同時出力

分納伝票発行フォームの画面構成とデータの流れ

メインメニューの分納伝票発行ボタンを押すとポップアップフォームが開きます。手配番号を選ぶとその受注データが自動表示され、分納数量・発行枚数・備考・発行者を入力して登録ボタンを押すと、印刷用の一時テーブル(T20受注分納印刷)にデータが1行貯まります。この登録を必要な件数分繰り返してから、分納伝票印刷ボタンでまとめて印刷する流れです。

F20受注分納印刷フォーム フォームビュー

F20受注分納印刷フォーム デザインビュー

主な構成要素

コントロール 種別 役割
手配番号 非連結コンボ 分納対象の受注データを選択(1年以内のデータのみ表示)
取引先コード/図番/単価/分納回数/納期 非連結(グレー表示) 手配番号選択時にDLookupで自動表示、変更不可
分納残数 非連結(グレー表示) 残り分納可能な数量の目安として表示
分納数量 非連結テキスト 今回分納する数量を入力
発行枚数 非連結テキスト 今回発行する伝票の枚数(複写枚数)
備考/発行者 非連結テキスト・コンボ 伝票に印字する備考と発行担当者
登録ボタン ボタン 入力内容をチェックし、印刷用テーブルへ追加
分納製造依頼書発行リスト(サブフォーム) サブフォーム 登録済み・印刷待ちのデータを一覧表示
分納伝票印刷ボタン ボタン(サブフォームヘッダー) 蓄積した全データを一括印刷

※サンプルデータ内の取引先名・図番等はすべて架空の情報です(説明はサイドバー参照)

メインメニューから開く「受注分納印刷」マクロ

メインメニューの分納伝票発行ボタンから、このポップアップフォームを開きます。

サブマクロ:受注分納印刷

サブマクロのテキスト表示
サブマクロ:受注分納印刷
フォームを開く(F20受注分納印刷, フォーム ビュー, , , , 標準)
マクロの中止
サブマクロの最後

マクロの概要

項目 内容
目的 分納伝票発行フォームをポップアップで開く
実行タイミング メインメニューの分納伝票発行ボタンクリック時
処理内容 フォームを標準モードで開くのみ

マクロの設置場所

項目 内容
格納先 メインメニューフォームの「分納伝票発行」ボタン
呼び出し元 ユーザーによるボタンクリック

手配番号コンボボックスの検索範囲制限

手配番号コンボボックスの選択候補は、直近1年以内に受注したデータのみに絞り込まれています。

分納伝票クエリ手配番号コンボ デザインビュー

抽出条件の内容

フィールド 抽出条件
手配番号 (表示のみ)
受注日 Between DateAdd(“d”,-365,Date()) And Date()
分納伝票は「まだ納品が終わっていない受注」に対してのみ発行する伝票です。1年より前の受注は基本的に納品が完了している想定のため、コンボボックスの候補からあらかじめ外すことで、古い・すでに納品済みの手配番号を誤って選んでしまう心配がありません。-365部分を実務に応じて変更すれば短くも長くもできます。

手配番号選択時の値展開マクロ設計

手配番号を選択すると、更新後処理でその受注データがフォーム上の各コントロールへ自動的に転記されます。

サブマクロ:分納表示

サブマクロのテキスト表示
サブマクロ:分納表示
値の代入
 アイテム = [Forms]![F20受注分納印刷]![取引先コード]
 式    = DLookUp("取引先コード","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]")
値の代入 ([Forms]![F20受注分納印刷]![図番], DLookUp("図番","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![図番ID], DLookUp("図番ID","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![納期], DLookUp("納期","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![数量], DLookUp("数量","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![受注日], DLookUp("受注日","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![分納残数], DLookUp("分納残数","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![単価], DLookUp("単価","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![備考], DLookUp("備考","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![分納回数], DLookUp("分納回数","T20受注M","手配番号=[Forms]![F20受注分納印刷]![手配番号]"))
値の代入 ([Forms]![F20受注分納印刷]![略称], DLookUp("略称","T05取引先M","取引先コード=[Forms]![F20受注分納印刷]![取引先コード]"))
マクロの中止
サブマクロの最後

マクロの概要

項目 内容
目的 選択した手配番号の受注内容をフォームの各コントロールへ展開表示する
実行タイミング 手配番号コンボボックスの更新後処理
処理内容 取引先コード・図番・納期・数量など各項目をDLookupで代入。取引先コードを取得後、それを条件に取引先の略称もあわせて取得

マクロの設置場所

項目 内容
格納先 F20受注分納印刷フォーム/手配番号コンボボックスの更新後処理
呼び出し元 ユーザーが手配番号を選択した時点で自動実行

登録ボタンのマクロ設計(入力チェックとテーブルへの蓄積)

登録ボタンを押すと、まず必須項目と数量の整合性をチェックし、問題がなければ発行枚数分の行を印刷用テーブルへ追加します。

分納OKサブマクロの入力チェック

登録ボタンの実体はこの「分納OK」サブマクロです。手配番号の入力漏れや存在確認から、分納数量・発行枚数・発行者まで6段階のチェックを順番に行い、すべて通過した場合のみ登録処理へ進みます。

サブマクロ:分納OK

サブマクロのテキスト表示
サブマクロ:分納OK
If IsNull([手配番号]) Then
 メッセージボックス(手配番号を入力して下さい。, はい, 警告, エラー)
 コントロールの移動(手配番号)
 マクロの中止
If 文の最後
If DCount("手配番号","T20受注M","手配番号=Forms![F20受注分納印刷]![手配番号]")=0 Or IsNull(DCount("手配番号","T20受注M","手配番号=Forms![F20受注分納印刷]![手配番号]")) Then
 メッセージボックス(手配番号は存在しません。, はい, 警告, エラー)
 コントロールの移動(手配番号)
 マクロの中止
If 文の最後
If IsNull([分納数量]) Then
 メッセージボックス(分納数量を入力して下さい。, はい, 警告, エラー)
 コントロールの移動(分納数量)
 マクロの中止
If 文の最後
If [Forms]![F20受注分納印刷]![分納残数]<[Forms]![F20受注分納印刷]![分納数量] Then
 メッセージボックス(分納残数をオーバーしています。, はい, 警告, エラー)
 コントロールの移動(分納数量)
 マクロの中止
If 文の最後
If IsNull([発行枚数]) Then
 メッセージボックス(発行枚数を入力して下さい。, はい, 警告, エラー)
 コントロールの移動(発行枚数)
 マクロの中止
If 文の最後
If IsNull([従業員コード]) Then
 メッセージボックス(発行者を入力して下さい。, はい, 警告, エラー)
 コントロールの移動(従業員コード)
 マクロの中止
If 文の最後
警告音
If MsgBox("登録してよろしいですか?",33,"確認")=1 Then
 マクロの実行
  マクロ名   M20受注.分納更新
  実行回数   =[Forms]![F20受注分納印刷]![発行枚数]
  繰り返し条件式
Else
 メッセージボックス(処理を中止します, はい, なし, 中止)
 マクロの中止
If 文の最後
マクロの実行
 マクロ名   M20受注.分納更新1
 実行回数
 繰り返し条件式
コントロールの移動(手配番号)
マクロの中止
サブマクロの最後

マクロの概要

項目 内容
目的 手配番号の存在・数量の整合性・必須項目の入力漏れを順にチェックし、問題なければ登録処理へ進む
実行タイミング 登録ボタンクリック時
処理内容 6段階の入力チェック→確認ダイアログ→分納更新マクロを発行枚数分ループ実行→分納更新1マクロを実行

マクロの設置場所

項目 内容
格納先 F20受注分納印刷フォームの「登録」ボタン
呼び出し元 ユーザーによるボタンクリック
分納数量が分納残数を超えていないかのチェックは、分納残数 < 分納数量 という1行の条件式だけで実現しています。オーバー入力による過剰登録を、複雑な計算なしに防いでいます。

分納更新・分納更新1サブマクロ(テーブルへの追加とクリア)

分納更新マクロは、フォームの入力内容をT20受注分納印刷テーブルへ1行追加するだけのシンプルな処理です。これを発行枚数分だけループさせることで、同じ内容の行を必要枚数分テーブルに貯めます。

サブマクロ:分納更新

サブマクロのテキスト表示
サブマクロ:分納更新
メッセージの設定(いいえ)
クエリを開く(Q20受注分納印刷追加, データシート, 編集)
サブマクロの最後

Q20受注分納印刷追加クエリ デザインビュー

T20受注分納印刷テーブルに追加されます。

分納更新に続けて実行される分納更新1マクロは、登録完了メッセージを出したうえで入力欄をクリアし、次の手配番号をすぐに登録できる状態に戻します。

サブマクロ:分納更新1

サブマクロのテキスト表示
サブマクロ:分納更新1
If MsgBox("印刷する分納伝票は、登録されました。") Then
If 文の最後
コントロールの移動(手配番号)
マクロの実行 (M20受注.分納キャンセル,,)
再クエリ ()
マクロの中止
サブマクロの最後

マクロの概要

項目 内容
目的 フォームの内容をテーブルへ追加し(分納更新)、完了メッセージ後に入力欄をクリアして次の登録に備える(分納更新1)
実行タイミング 分納OKマクロの確認ダイアログでOK後、発行枚数分ループ実行された後
処理内容 (分納更新)追加クエリを実行→(分納更新1)完了メッセージ→手配番号へフォーカス移動→分納キャンセルマクロで入力欄クリア→サブフォームを再クエリ

マクロの設置場所

項目 内容
格納先 M20受注共通マクロ内「分納更新」「分納更新1」サブマクロ
呼び出し元 分納OKマクロからのマクロの実行アクション

分納キャンセルサブマクロ(入力欄のクリア)

登録完了後やキャンセルボタン押下時に呼び出される共通マクロです。フォーム上の全コントロールをNullに戻し、手配番号へフォーカスを移すことで、次のデータをすぐに入力できる状態にします。フォームフッターに設置されているキャンセルボタンにも同じマクロが割り当てられており、入力途中の内容を破棄したい場合はこちらからも同様にクリアできます。

サブマクロ:分納キャンセル

サブマクロのテキスト表示
サブマクロ:分納キャンセル
値の代入
 アイテム = [取引先コード]
 式    = Null
値の代入 ([図番], Null)
値の代入 ([図番ID], Null)
値の代入 ([納期], Null)
値の代入 ([数量], Null)
値の代入 ([受注日], Null)
値の代入 ([単価], Null)
値の代入 ([分納残数], Null)
値の代入 ([分納回数], Null)
値の代入 ([略称], Null)
値の代入 ([手配番号], Null)
値の代入 ([分納数量], Null)
値の代入 ([従業員コード], Null)
値の代入 ([発行枚数], Null)
値の代入 ([備考], Null)
コントロールの移動(手配番号)
再クエリ ()
マクロの中止
サブマクロの最後

マクロの概要

項目 内容
目的 フォーム上の全入力・表示コントロールをNullに戻し、次の手配番号を入力できる状態にする
実行タイミング 登録完了時(分納更新1マクロから呼び出し)、およびキャンセルボタンクリック時
処理内容 全コントロールにNullを代入→手配番号へフォーカス移動→再クエリ

マクロの設置場所

項目 内容
格納先 M20受注共通マクロ内「分納キャンセル」サブマクロ
呼び出し元 分納更新1マクロ、およびフォームの「キャンセル」ボタン
登録・クリア・再入力をワンセットにすることで、1件登録するたびにフォームを閉じ直す必要がありません。複数の手配番号をテンポよく連続登録し、まとめて分納伝票印刷ボタンで一括印刷する、という運用を前提にした作りです。

分納伝票印刷ボタンのマクロ設計

分納伝票印刷ボタンは、プレビュー確認→実印刷という2段階の確認を経てからT20受注分納印刷テーブルの内容をレポートに出力し、印刷後はテーブルをクリアします。

サブマクロ:分納印刷

サブマクロのテキスト表示
サブマクロ:分納印刷
警告音
If MsgBox("分納伝票をプレビューで確認してから印刷してください。よろしいですか?",4+32)=6 Then
 レポートを開く(R20受注分納印刷, 印刷プレビュー, , , 標準)
 ウィンドウを閉じる(フォーム, F20受注分納印刷, 確認)
Else
 メッセージボックス(処理を中止します, はい, なし, 中止)
 マクロの中止
If 文の最後
警告音
If MsgBox("分納伝票の印刷をしてよろしいですか?",4+32)=6 Then
 レポートを開く(R20受注分納印刷, 印刷, , , 標準)
 メッセージの設定(いいえ)
 クエリを開く(Q20受注分納印刷削除, データシート, 編集)
 メッセージボックス(分納伝票の印刷が完了しました。, はい, なし, 完了)
 ウィンドウを閉じる(, , 確認)
 フォームを開く(F20受注分納印刷, フォーム ビュー, , , , 標準)
 マクロの中止
Else
 メッセージボックス(処理を中止します, はい, なし, 中止)
 ウィンドウを閉じる(, , 確認)
 フォームを開く(F20受注分納印刷, フォーム ビュー, , , , 標準)
 マクロの中止
If 文の最後
サブマクロの最後

マクロの概要

項目 内容
目的 プレビューでの最終確認を挟んでから分納伝票を印刷し、印刷済みデータをテーブルから削除する
実行タイミング 分納伝票印刷ボタンクリック時
処理内容 1段階目:プレビューを開くためフォームを閉じる→2段階目:実際に印刷→印刷済みデータを削除クエリで消去→完了メッセージ→フォームを再度開く

マクロの設置場所

項目 内容
格納先 F20受注分納印刷フォームのサブフォームヘッダー「分納伝票印刷」ボタン
呼び出し元 ユーザーによるボタンクリック

印刷済みデータを削除するQ20受注分納印刷削除クエリ

分納伝票印刷ボタンから実際の印刷処理が完了した直後に実行される削除クエリです。T20受注分納印刷テーブルの全件を対象に、Fromで丸ごと削除します。印刷済みのデータをそのまま残しておくと、次回登録時に古いデータが混在してしまうため、印刷完了のタイミングでテーブルを必ず空の状態に戻す役割を担っています。

Q20受注分納印刷削除クエリ デザインビュー

分納伝票発行フォームはポップアップ表示のため、開いたままだと常に最前面に表示され、後ろにあるプレビュー画面が隠れてしまいます。そのためプレビューを開く直前にあえてフォームを閉じ、確認が終わったらフォームを開くアクションでフォームを開き直しています。ポップアップフォームならではの表示順の制約を、閉じて開き直すという単純な操作で解決している設計です。

分納伝票レポート(ミシン目4分割帳票)の構成

分納伝票レポートは、ミシン目入りの市販コピー用紙に合わせて1枚を4分割し、それぞれ用途の異なる帳票として使い分けられるように設計されています。

R20受注分納印刷レポート プレビュー(メッセージ表示あり)

R20受注分納印刷レポート デザインビュー

4分割用紙の内訳

位置 帳票名 用途
左上 分納伝票(兼)納品書控 社内控え用。発行者・分納数量・備考などを記録
右上 現品票 納品箱に貼り付けて中身を識別するための票
左下 納品書 客先に添付する正式な納品書
右下 受領書 客先が受領印を押して返送するための受領書
市販のミシン目入りコピー用紙をそのまま使えるよう、4つの帳票の境界線をミシン目の位置にぴったり合わせてレポートをレイアウトしています。1回の印刷で4種の帳票が同時に出力され、あとはミシン目に沿って切り離すだけで、社内控え・現品票・納品書・受領書がそれぞれ独立した紙として使える状態になります。

印刷用テーブル(T20受注分納印刷)とクエリの役割分担

登録から印刷までの間、データは一時的にT20受注分納印刷テーブルに蓄積されます。このテーブルへの「表示」「追加」「削除」を、それぞれ役割の異なる3本のクエリが担っています。

サブフォームに表示するQ20受注分納印刷サブクエリ

登録済み・印刷待ちのデータを、フォーム下部のサブフォームに一覧表示するためのクエリです。

サブフォーム表示用クエリ(Q20受注分納印刷サブ)

フィールド構成

フィールド テーブル
取引先コード/図番/数量/分納残数/分納数量/備考 T20受注分納印刷

登録データを追加するQ20受注分納印刷追加クエリ

登録ボタンを押した際に、フォームの入力内容を1行としてT20受注分納印刷テーブルへ追加するクエリです。発行枚数分ループ実行されることで、同じ内容の行が複数貯まります。

追加用クエリ(Q20受注分納印刷追加)

フィールド構成

フィールド 追加元
取引先コード/手配番号/図番/図番ID/納期/受注日/数量/単価/分納残数/分納回数/従業員コード/備考/分納数量 フォームの各コントロールの値

印刷済みデータを削除するQ20受注分納印刷削除クエリ

分納伝票印刷ボタンから実際の印刷処理が完了した直後に実行される削除クエリです。T20受注分納印刷テーブルの全件を対象に、Fromで丸ごと削除します。印刷済みのデータをそのまま残しておくと、次回登録時に古いデータが混在してしまうため、印刷完了のタイミングでテーブルを必ず空の状態に戻す役割を担っています。

削除用クエリ(Q20受注分納印刷削除)

フィールド構成

項目 内容
対象テーブル T20受注分納印刷
削除範囲 全件(From)
T20受注分納印刷テーブルは、あくまで「これから印刷する分」を一時的に貯めておくだけの作業テーブルです。登録時は追加クエリで1行ずつ積み上げ、印刷後は削除クエリで全件クリアするため、印刷が終わるたびにテーブルは空の状態に戻ります。表示・追加・削除という3つの役割をそれぞれ専用のクエリに分けることで、1本のクエリに条件を詰め込みすぎず、どのクエリが何をしているかが追いやすい構成になっています。

まとめ

分納伝票発行フォームは、「1件ずつ登録して貯める」「まとめて印刷する」という2段階の操作を、登録・クリア・印刷という3種類のマクロで実現しています。手配番号の候補を1年以内に絞り、分納数量が残数を超えないかをチェックし、印刷前にプレビュー確認を挟むなど、随所に誤操作防止の工夫が盛り込まれています。印刷後にテーブルをクリアする削除クエリまで含めて、蓄積→出力→リセットという一連の流れが完結する設計です。

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

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