納期範囲検索ボタン共通マクロ設計
複数の照会フォームで共通利用している、納期範囲を指定してデータを絞り込む仕組みを紹介します。今日・前日・翌日、今週・前週・翌週、今月・前月・翌月といったボタン一つで期間を切り替えられる入力アシストで、受注照会をはじめ複数の照会フォームで多用しているパターンです。共通マクロとして1箇所にまとめることで、ロジックの重複を避けつつ保守性を高めています。
照会フォームにおける納期範囲検索の全体像
納期範囲検索は「いつから」「いつまで」の2つの非連結コントロールと、期間を自動セットするボタン群、検索ボックス、再検索ボタンで構成されています。ボタンを押すたびに日付が計算し直され、サブフォームが再クエリされる仕組みです。
フォームサンプル 受注データ照会
フォームサンプル デザインビュー
主な構成要素
| コントロール | 種別 | 役割 |
|---|---|---|
| いつから/いつまで | 非連結テキスト | 検索対象の納期範囲を保持 |
| 今日/前日/翌日 | ボタン | 当日を基準に1日単位で期間を移動 |
| 今週/前週/翌週 | ボタン | 当週を基準に1週間単位で期間を移動 |
| 今月/前月/翌月 | ボタン | 当月を基準に1ヶ月単位で期間を移動 |
| 全期間 | ボタン | 実データの最古〜最新の納期で全件表示に切り替え |
| 再検索 | ボタン | 検索ボックスをクリアし、フォームを開いた直後の状態に戻す |
※サンプルデータ内の取引先名・図番等はすべて架空の情報です(詳細はサイドバーウィジェット参照)
このページでは日付範囲検索の仕組みに絞って解説します。取引先検索・図番検索・手配番号検索・納期回答検索といったインクリメンタルサーチ系のコントロールは別の仕組みのため、このページでは扱いません。
フォームを開いた時の初期表示マクロ
フォームを開いた瞬間に、いつから・いつまでへ初期値が自動セットされます。過去1年分をデフォルト表示にしつつ、前週・翌週・前月・翌月ボタンはこの時点であらかじめ使用不可にしておく設計です。
サブマクロ:注文期間開く時
- サブマクロのテキスト表示
-
サブマクロ:注文期間開く時 値の代入 アイテム = [Forms]![F20受注リスト]![いつから] 式 = Format(DateAdd("yyyy",-1,Date()),"yy/mm/dd") 値の代入 アイテム = [Forms]![F20受注リスト]![いつまで] 式 = Format(DMax("納期","T20受注M"),"yy/mm/dd") 値の代入 ([前週].Enabled, False) 値の代入 ([翌週].Enabled, False) 値の代入 ([前月].Enabled, False) 値の代入 ([翌月].Enabled, False) 再クエリ () コントロールの移動 (F20受注リストサブ) 並べ替えの設定 ([納期] DESC, ) コントロールの移動 (取引先検索) マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | フォームを開いた時点で「直近1年〜納期の最大値」を初期表示範囲としてセットする |
| 実行タイミング | フォームを開く時(オンロード) |
| 処理内容 | いつから=1年前の日付/いつまで=T20受注M内の納期最大値を代入→週・月系ボタンを無効化→サブフォームを納期降順で再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | F20受注リストフォームのイベントプロパティ(フォームを開く時) |
| 呼び出し元 | フォームのオープン、および再検索ボタンからの再実行 |
前週・翌週・前月・翌月をあらかじめ無効化しておく理由は次の章で解説します。今日・今週・今月ボタンとセットで理解すると設計意図がつながります。
今日・前日・翌日ボタンのマクロ設計
日単位で期間を動かす3つのボタンです。今日ボタンだけは他の2つと違い、期間の再設定に加えて他ボタンの使用可否をすべて自分でコントロールする作りになっています。
今日ボタン
今日ボタンは、いつから・いつまでを両方とも本日の日付にセットしたうえで、前日・翌日ボタンを使用可能に、前週・翌週・前月・翌月ボタンを使用不可にします。
サブマクロ:今日
- サブマクロのテキスト表示
-
サブマクロ:今日 値の代入 ([いつから], Date()) 値の代入 ([いつまで], Date()) 値の代入 ([前日].Enabled, True) 値の代入 ([翌日].Enabled, True) 値の代入 ([前週].Enabled, False) 値の代入 ([翌週].Enabled, False) 値の代入 ([前月].Enabled, False) 値の代入 ([翌月].Enabled, False) 再クエリ () マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | 検索範囲を本日1日分に絞り込み、日単位のボタンだけを使用可能にする |
| 実行タイミング | 今日ボタンクリック時 |
| 処理内容 | いつから/いつまでに本日日付を代入→前日・翌日を有効化、前週・翌週・前月・翌月を無効化→再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | F20受注リストフォームの「今日」ボタン |
| 呼び出し元 | ユーザーによるボタンクリック |
前日・翌日ボタン
前日・翌日ボタンは、現在のいつから・いつまでの値からそれぞれ1日を加減算するだけのシンプルな作りです。
サブマクロ:前日
- サブマクロのテキスト表示
-
サブマクロ:前日 値の代入 ([いつから], [いつから]-1) 値の代入 ([いつまで], [いつまで]-1) 再クエリ () マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | 表示中の期間を1日前・1日後にスライドさせる |
| 実行タイミング | 前日/翌日ボタンクリック時 |
| 処理内容 | いつから・いつまでにそれぞれ±1日した値を代入→再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | F20受注リストフォームの「前日」「翌日」ボタン |
| 呼び出し元 | 今日ボタンで有効化された状態でのユーザークリック |
今週・前週・翌週ボタンのマクロ設計
週単位のボタンは、今日ボタンと違って「ローカル側での使用可否制御」と「共通マクロでの日付計算」の2段構えになっています。
今週ボタン
今週ボタンを押すと、まずローカルマクロで前日・翌日ボタンを使用不可にし、続けて共通マクロ「M99共通マクロ.今週」を呼び出して実際の日付計算とその他ボタンの使用可否をまとめて処理します。
サブマクロ:今週(ローカル)
- サブマクロのテキスト表示
-
サブマクロ:今週 値の代入 アイテム = [前日].Enabled 式 = False 値の代入 アイテム = [翌日].Enabled 式 = False マクロの実行 (M99共通.今週,,) マクロの中止 サブマクロの最後
- サブマクロのテキスト表示
-
サブマクロ:今週 値の代入 アイテム = [いつから] 式 = Date()-Weekday(Date(),3) 値の代入 アイテム = [いつまで] 式 = [いつから]+6 値の代入 アイテム = [前月].Enabled 式 = False 値の代入 アイテム = [翌月].Enabled 式 = False 値の代入 アイテム = [前週].Enabled 式 = True 値の代入 アイテム = [翌週].Enabled 式 = True 再クエリ コントロール名 マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | 表示範囲を「今週の月曜〜日曜」に切り替え、週単位のボタンを使用可能にする |
| 実行タイミング | 今週ボタンクリック時 |
| 処理内容 | (ローカル)前日・翌日を無効化→(共通)当週の開始日を算出し終了日をそこから+6日で算出→月系ボタンを無効化、週系ボタンを有効化→再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | ローカル側:F20受注リストフォームの「今週」ボタン/共通側:M99共通マクロ内「今週」サブマクロ |
| 呼び出し元 | ローカルマクロからマクロの実行アクションで呼び出し |
前週・翌週ボタン
現在のいつから・いつまでに対して、それぞれ7日を加減算するだけのマクロです。
サブマクロ:前週
- サブマクロのテキスト表示
-
サブマクロ:前週 値の代入 ([いつから], [いつから]-7) 値の代入 ([いつまで], [いつまで]-7) 再クエリ () マクロの中止 サブマクロの最後
- サブマクロのテキスト表示
-
サブマクロ:翌週 値の代入 ([いつから], [いつから]+7) 値の代入 ([いつまで], [いつまで]+7) 再クエリ () マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | 表示中の期間を1週間前・1週間後にスライドさせる |
| 実行タイミング | 前週/翌週ボタンクリック時 |
| 処理内容 | いつから・いつまでにそれぞれ±7日した値を代入→再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | F20受注リストフォームの「前週」「翌週」ボタン |
| 呼び出し元 | 今週ボタンで有効化された状態でのユーザークリック |
今月・前月・翌月ボタンのマクロ設計
月単位も今週と同じ「ローカル制御+共通マクロ呼び出し」の構造です。ただし月は日数が28〜31日と変動するため、日付計算のロジックが週とは異なります。
今月ボタン
- サブマクロのテキスト表示
-
サブマクロ:今月 値の代入 アイテム = [前日].Enabled 式 = False 値の代入 アイテム = [翌日].Enabled 式 = False マクロの実行 (M99共通.今月,,) マクロの中止 サブマクロの最後
- サブマクロのテキスト表示
-
サブマクロ:今月 値の代入 アイテム = [いつから] 式 = DateSerial(Year(Date()),Month(Date()),1) 値の代入 アイテム = [いつまで] 式 = DateSerial(Year(Date()),Month(Date())+1,0) 値の代入 アイテム = [前月].Enabled 式 = True 値の代入 アイテム = [翌月].Enabled 式 = True 値の代入 アイテム = [前週].Enabled 式 = False 値の代入 アイテム = [翌週].Enabled 式 = False 再クエリ コントロール名 マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | 表示範囲を「今月1日〜月末日」に切り替え、月単位のボタンを使用可能にする |
| 実行タイミング | 今月ボタンクリック時 |
| 処理内容 | (ローカル)前日・翌日を無効化→(共通)当月1日と翌月0日(=当月末日)を算出→週系ボタンを無効化、月系ボタンを有効化→再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | ローカル側:F20受注リストフォームの「今月」ボタン/共通側:M99共通マクロ内「今月」サブマクロ |
| 呼び出し元 | ローカルマクロからマクロの実行アクションで呼び出し |
DateSerial(Year(...),Month(...)+1,0)という書き方は、翌月の0日目=当月末日という仕様を使ったテクニックです。VBAならDateSerial関数の考え方自体は同じですが、If分岐で月末を計算する冗長な書き方をせずに済む点はマクロもVBAも大差ありません。前月・翌月ボタン
前月・翌月は前週・翌週のような単純な加減算ではなく、「いつから」を先に月単位でずらし、その更新後の値をもとに「いつまで」の月末日を計算し直す、逐次代入の作りになっています。
サブマクロ:前月
- サブマクロのテキスト表示
-
サブマクロ:前月 値の代入 アイテム = [いつから] 式 = DateSerial(Year([いつから]),Month([いつから])-1,1) 値の代入 アイテム = [いつまで] 式 = DateSerial(Year([いつから]),Month([いつから])+1,0) 再クエリ () マクロの中止 サブマクロの最後
- サブマクロのテキスト表示
-
サブマクロ:翌月 値の代入 アイテム = [いつから] 式 = DateSerial(Year([いつから]),Month([いつまで])+1,1) 値の代入 アイテム = [いつまで] 式 = DateSerial(Year([いつから]),Month([いつから])+1,0) 再クエリ () マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | 表示中の期間を1ヶ月前・1ヶ月後の月初〜月末にスライドさせる |
| 実行タイミング | 前月/翌月ボタンクリック時 |
| 処理内容 | いつからを対象月の1日に更新→更新後のいつからを参照して、いつまでにその月の末日を代入→再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | F20受注リストフォームの「前月」「翌月」ボタン |
| 呼び出し元 | 今月ボタンで有効化された状態でのユーザークリック |
全期間ボタンと再検索ボタンのマクロ設計
期間指定をリセットする2つのボタンです。全期間は実データの範囲まで一気に広げ、再検索はフォームを開いた直後の状態に戻します。
全期間ボタン
いつから・いつまでに、T20受注M内の納期の最小値・最大値をそれぞれ代入し、実質「全件表示」の状態にします。フォームを開いた時のマクロと似た構造ですが、日付の算出元がDateAdd(相対計算)ではなくDMin(実データの最小値)である点が異なります。
サブマクロ:全期間(注文期間)
- サブマクロのテキスト表示
-
サブマクロ:注文期間 値の代入 アイテム = [Forms]![F20受注リスト]![いつから] 式 = Format(DMin("納期","T20受注M"),"yy/mm/dd") 値の代入 アイテム = [Forms]![F20受注リスト]![いつまで] 式 = Format(DMax("納期","T20受注M"),"yy/mm/dd") 値の代入 ([前週].Enabled, False) 値の代入 ([翌週].Enabled, False) 値の代入 ([前月].Enabled, False) 値の代入 ([翌月].Enabled, False) 再クエリ () コントロールの移動 (F20受注リストサブ) 並べ替えの設定 ([納期] DESC, ) コントロールの移動 (取引先検索) マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | 検索範囲をT20受注M内の実データの納期最小値〜最大値まで広げ、全件表示にする |
| 実行タイミング | 全期間ボタンクリック時 |
| 処理内容 | いつから=納期の最小値/いつまで=納期の最大値を代入→週・月系ボタンを無効化→サブフォームを納期降順で再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | F20受注リストフォームの「全期間」ボタン |
| 呼び出し元 | ユーザーによるボタンクリック |
注意:このマクロ内のフォーム名・テーブル名(F20受注リスト、T20受注M)は例として掲載したもので、実際は流用先のフォーム名・テーブル名に合わせて書き換える必要があります。
再検索ボタン
検索ボックス(取引先検索・図番検索・手配番号検索・注残リスト・納期回答検索)をすべてNullにクリアし、注残リスト表示中の状態を解除したうえで、フォームを開いた時のマクロを再実行して初期状態に戻します。
サブマクロ:リスト再検索
- サブマクロのテキスト表示
-
サブマクロ:リスト再検索 値の代入 ([取引先検索], Null) 値の代入 ([図番検索], Null) 値の代入 ([手配番号検索], Null) 値の代入 ([注残リスト], Null) 値の代入 ([納期回答検索], Null) 値の代入 アイテム = [Forms]![F20受注リスト]![注残リスト表示中].[Visible] 式 = False 値の代入 アイテム = [Forms]![F20受注リスト]![注残リストボタン].[Visible] 式 = True マクロの実行 (M20受注.注文期間開く時,,) 再クエリ () マクロの中止 サブマクロの最後
マクロの概要
| 項目 | 内容 |
|---|---|
| 目的 | 各種検索条件をクリアし、フォームを開いた直後の表示状態に戻す |
| 実行タイミング | 再検索ボタンクリック時 |
| 処理内容 | 検索ボックス5つをNullに設定→注残リスト表示中ボタンを非表示、注残リストボタンを表示に戻す→フォームを開いた時のマクロを再実行→再クエリ |
マクロの設置場所
| 項目 | 内容 |
|---|---|
| 格納先 | F20受注リストフォームの「再検索」ボタン |
| 呼び出し元 | ユーザーによるボタンクリック |
注意:このマクロ内の検索ボックス名(取引先検索・図番検索・手配番号検索・注残リスト・納期回答検索)は、流用先のフォームに設置されている検索ボックス名に合わせて書き換える必要があります。
いつまでコントロールの更新後処理
いつまでコントロールを直接編集した場合にも、ボタン操作と同じようにサブフォームへ即座に反映されるよう、更新後処理には共通マクロ「M99共通.再クエリ」が設定されています。処理内容の詳細はM99共通マクロページで解説済みのため、ここでは呼び出し元としての位置づけのみ記載します。
| 項目 | 内容 |
|---|---|
| 格納先 | F20受注リストフォーム/いつまでコントロールの更新後処理 |
| 呼び出し先 | M99共通マクロ内「再クエリ」サブマクロ |
| 実行タイミング | ユーザーがいつまでの日付を直接入力・変更した時 |
まとめ
納期範囲検索は、いつから・いつまでの2コントロールを軸に、日・週・月それぞれのボタンが期間を計算し直す仕組みです。今日・今週・今月ボタンが起点となって他ボタンの使用可否を切り替えることで、範囲がずれた状態で前後移動してしまう誤操作を防いでいます。週は単純な±7日、月は月初日を先に確定させてから月末日を導く逐次代入という違いも押さえておくと、流用時の書き換え箇所がわかりやすくなります。全期間・再検索の2つのリセット系ボタンも合わせて、複数の照会フォームで共通利用できる設計になっています。
本サイトではマクロを用いた構築手順を中心に紹介していますが、決してマクロを唯一の正解として推奨しているわけではありません。VBAが扱える環境であれば、より多彩で柔軟なプログラムが組めるVBAでの構築をむしろ推奨したいと考えています。
ここでマクロという選択肢を提示しているのは、VBAにハードルを感じている方への「もう一つの入り口」として、また将来的な後継者への引き継ぎ負荷を抑えるという実務上のメリットを考慮してのことです。設計の考え方の一つとして、状況に合わせて活用してください。