では、ついでに 内容が具体的ではなかったのでクエリ側でDMax関数を使う形で回答していましたが、VBA上だけで完結する内容であれば、DMaxの計算は外に出してしまったほうが分かりやすくなると思います
Dim maxValue As Long 'ここの型宣言は適切なモノで For A1 = 1 To 4 maxValue = DMax("変位" & A1, "テーブル", "№>=1 AND №<=9") StrSQL = _ " SELECT A" & A1 & ", 変位" & A1 & ", №" & _ " FROM テーブル" & _ " WHERE テーブル.変位" & A1 & " = " & maxValue _ " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"
レポートをダブルクリックで開いた後にもうワンクリックする手間を省きたくて解決法を探しているので、フォーム作ってまで実現したいことではないですね。。考え方は参考になります。 単純に設定で変えられたりできないもんでしょうか。。。
レポートのなんやかんやってレポートを開こうとしてるときに制御できないみたいですね しかたないので制御用のフォームを作ってなんやかんやしてみる
開くレポート
Private Sub Report_Load() If Nz(OpenArgs) <> "auto" Then DoCmd.OpenForm "制御用のフォーム名", , , , , , Me.Name End Sub
制御用のフォーム
Private Sub Form_Load() DoCmd.Close acReport, OpenArgs DoCmd.OpenReport OpenArgs, acViewPreview, , , , "auto" Reports(OpenArgs).ZoomControl = 0 DoCmd.Close acForm, Me.Name End Sub
ご指摘の通り宣言の型が違っておりました。さらっと解決いたしました。ありがとうございます!!
それだと最大化されます。 自分がやりたいのは、ナビゲーションウィンドウからダブルクリックで開いた時に レポートがウィンドウ枠の大きさに合わせて全体が表示されるようにすること。 サイズの自動調整ではなく、任意の大きさでウィンドウ枠を保存し、その大きさで開かれるようにしたい。
それだと最大化される。
以下、サンプルコードを実行してみました
Sub test() Dim StrSQL As String Dim A1 As Long A1 = 1 'ここからコピペ StrSQL = _ " SELECT A" & A1 & ", 変位" & A1 & ", №" & _ " FROM テーブル" & _ " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _ " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;" 'ここまでコピペ Debug.Print StrSQL End Sub
イミディエイトウィンドウには
SELECT A1, 変位1, № FROM テーブル WHERE テーブル.変位1 = DMax('変位1','テーブル','№>=1 AND №<=9') ORDER BY テーブル.変位1 DESC , テーブル.№ DESC;
と表示されエラーは発生しません
問題があるとすればStrSQLの型宣言が間違っているくらいですかね
StrSQL
質問の内容がよく分からないですが読み込み時イベントでなんやかんやしたらいいんじゃないですかね
Private Sub Report_Load() DoCmd.Maximize End Sub
ありがとうございます
StrSQL = _ " SELECT A" & A1 & ", 変位" & A1 & ", №" & _ " FROM テーブル" & _ " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _ " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;"
の全文が黄色になってしまいました。
ナビゲーションウィンドウをダブルクリックで開いた時、レポートが毎回左下にずれており、全体を表示するためにレポートを一回クリックしなければなりません。 左下にずれる原因と、対処法をご教示願いたい。
teratailでは「不可能である」と回答されたが、Hatenaさん、どうにかする方法はないでしょうか。 回答をお待ちしております。
Access2003はサポートがとっくの昔に切れているので、正常に動作する保証はありません。 新しいAccessを導入して移行することをお勧めします。 職場で使用するということならなおさらです。
パッと見る限りは記述には問題なさそうですね。そのエラーが出たとき、デバッグボタンでエラーの出た行を表示するとどの行がハイライトしていますか?
ありがとうございます。直接文字列と A1 で入力したのですが
For A1 = 1 To 4 StrSQL = _ " SELECT A" & A1 & ", 変位" & A1 & ", №" & _ " FROM テーブル" & _ " WHERE テーブル.変位" & A1 & " = DMax('変位" & A1 & "','テーブル','№>=1 AND №<=9')" & _ " ORDER BY テーブル.変位" & A1 & " DESC , テーブル.№ DESC;" Set rs = CurrentDb.OpenRecordset(StrSQL) rs.MoveLast aaa = rs.RecordCount If aaa = 1 Then Else MsgBox aaa End If Next
Dmaxの文章を追加したら「エラー13 型が一致しません」になってしまいました。 よろしくお願いいたします
お二方ご回答ありがとうございます。 ご意見を参考にして、組み立ててみます。
HGP正楷書体でもHG正楷書体PROと同じく、表示はされるが字体が異なりました。 表示はされるが字体が違うというのは?に置き換わるよりもタチが悪そうなので、 現状のまま、StrConvで?に置き換えて抽出する方法を採ろうと思います。
私のところでも字体は違うようでした。 調べてみると「HG正楷書体-PRO」は有料のフォントのようなので、課金しないと使えないのかもしれません。
HG正楷書体-PRO / RICOH(リコー) | フォント専門店 Font Garage
こちらにもHG正楷書体-PROがありましたので変更してみたところ、文字は表示されますが字体は違いました。 スクリーンショットを添付したいのですが、どのようにすれば貼り付けられますでしょうか?.pngです
すみません、外字が?に変わるのは追加クエリを実行した時ではなく、Strconv([フィールド],4)で半角から全角に変換するクエリを実行した時でした。 例えば「吉(上が士ではなく土)」といったレコード上で太字っぽく表示される文字は、全角変換用のクエリを実行した時に?に置き換わります。
上が土の吉は異体字ですね。Unicodeにはありますので、現在の環境なら通常は正しく表示できます。 Strconv関数はUnicode非対応なので?に文字化けします。
全角変換は、Strconvを使わずに、自作関数を作成してください。例えば、下記などを参考に。
文字化け対応StrConv - Qiita
主にHGP正楷書体をレポート用のフォントとして使用しています。
当方の環境(Win11)では「HGP正楷書体」は入っていないですね。昔、そのようなフォントが入っていた記憶があるので古いフォントなのでしょう。 「HG正楷書体-PRO」というフォントは入っていたので、これで確認してみましたが正常に表示されました。正楷書体なのでおそらく字体は同じだと思われます。
hirotonさんコメントありがとうございます。確かにそうですね、入/出の累計を使ったら繰越処理をわざわざ追加クエリでしなくていけますね。その方が動的に数字がでますね。前月繰越○○個、当月入●●個、当月出△△個、次月繰越(残数)□□個という事にしたかったのです。これも一番最初(前期から残っている分)の入力するだけで不要な処理はせずにだせますね。 ありがとうございました。
エクセルもAccessのテーブル、フォーム、レポートも、ユニコードに対応しているので、エクセルで正しく表示されるなら、通常はAccessでも正しく表示されるはずです。
ただし、VBAはいまだにユニコード非対応(Shift-JIS依存)の部分がありますので、使い方によっては非Shift-JIS文字が「?」に変わることがあります。
現行のシステムでは、客先からのExcelデータをインポートし、レポートのレコードソースにする出力用テーブルに追加する際、外字が「?」に置き換わることを利用して、
追加クエリや、通常の代入操作なら「?」に変わることはないはずです。 現状のシステムでは、具体的にどのように「出力用テーブルに追加」しているのですか。
レポートで使用しているフォントでその字がなければ結局Illustratorで修正しなくてはなりません。
今どきのフォントでユニコードでないフォントはないと思いますが、具体的にどのような文字が、修正が必要になりますか。
在庫数は入力を開始してから算出日までの、すべての入庫からすべての出庫を引くと算出できます。この数を求めるだけであれば選択クエリ1つで可能です
回答ありがとうございます。 仮にAccessの出力用テーブル上で正しく表示されたとしても、レポートで使用しているフォントでその字がなければ結局Illustratorで修正しなくてはなりません。
物質テーブル
合致していれば、組み合わせを登録。登録がない組み合わせは、合致しない。
文字の問題は難しいですね
Excelデータをインポートし、レポートのレコードソースにする出力用テーブルに追加する際、外字が「?」に置き換わる
Excel上で正しく表示されているならACCESSでもそのまま表示されるよう、原因の究明と解決を行うべきだと思います
「『外字は必ずIllustratorで作字を行うこと』というルールがあるので外字は化けてほしい」という要望があるなら今の方法でいいんじゃないでしょうか?意味が分かりませんが
物質名、法令のどちらも増えることが確実
物質名をデータとして、フィールドを法令名にした
フィールド(列)が増える設計はNGです
法令適合テーブル
Excelのような表示にしたい場合はクロス集計クエリが使えます
hatena さん
ありがとうございます。 テーブル名で解決できました。 お手数お掛けいたしました。
CurrentDb.Execute "Update フォーム名 Set フィールド名 = 0;"
CurrentDb.Executeはクエリ(SQL文)を実行するものです。 これはテーブルまたはクエリを対象にするものです。
フォーム名ではなくフォームのレコードソースのテーブル名(またはクエリ名)にしてください。
申し訳ございません。回答はいただいておりました。
もう少し前後がないと何ともですが必要そうなところを記述すると
Dim strSQL As String Dim フィールドカウンタ As Long For フィールドカウンタ = 1 to 4 strSQL = "テーブル.A" & フィールドカウンタ & " = DMax('A" & フィールドカウンタ & "','テーブル','№>=1 AND №<=9')" Next
1~4と、数字部分だけが変わるのであればその前の部分までは直接文字列で記述しておけばいいです
難しい問題ですね。使用する言語それぞれについて知識を深め、それぞれ適切に使う。というあいまいな答えになってしまいます
前提として、自分がどのような言語を使っているのか?ということをはっきりさせておく必要があります。その言語というのが「VBA」と「SQL」となりますが、Microsoft Access上において、より厳密には「ACCESS VBA」と「ACCESS SQL」となります 特に、SQLは様々なデータベースで採用されていますが、それぞれのデータベースで少しずつカスタマイズされていて微妙に仕様が変わったりします
これらを踏まえて例えば、Microsoft Accessという環境の上で何かの処理をしたい場合、
ダブルクオーテーションで記述 DMax("変位2","テーブル","ID>=1 AND ID<=9")
という記述は、ACCESSのクエリデザインやフォーム上(テキストボックスのコントロールソース)、VBAなど、どこで記述しても使える記述ですが、
シングルクオーテーションで記述 DMax('変位2','テーブル','ID>=1 AND ID<=9')
は、VBAでは使えません。VBAではシングルクオーテーションはそれ以降をコメントとするという記述になるので、この記述は構文エラーになってしまいます このような観点からは「SQL構文を直接VBAで操作する」というようなことが無ければ「ダブル」だけ覚えておけば済むともいえます Accessというアプリケーションとしても、文字列として補完される場合はダブルクオーテーションが使われるのがデフォルトですね
しかしながら、今回の問題のように、VBAでSQL構文を作ることを考えた場合は、シングルクォーテーションを使ったほうが見やすい・記述が少ないというメリットが得られます。コードを記述するうえではミスをしにくい記述を心がけるというのが大事になってくるので、「VBAでSQL構文を操作する場合に限って」はシングルクオーテーションを使えるようになったほうがいいと思います。
続けてすみません。SQLに使用したいので入力してみたのですがエラーになってしまいました。
テーブル.変数 & A1 = "DMax('" & 変数 & A1 & "','テーブル','№>=1 AND №<=9')"
A1は1から4まで変化していきます。こちらはfor Nextで回しています。 教えていただけますか?
つたない説明ですみません。クエリの抽出条件で「ダブルクオーテーション」を使うことは知っていたのですが、囲ってしまうと決め打ちの名前になってしまって思っていた変数として動かなくて...。「ダブルクオーテーション」を3つ使うと、固定した名前と変数と分けることができるのですね、ありがとうございます。ちなみに、これから覚えるとして「シングル」と「ダブル」どちらがおすすめでしょうか?
hirotonさん ありがとうございます。なるほどそういう事ですね。その方が加工するのが分かり易い感じですね。ちょっと固定観念にとらわれてました。トライしてみます。アイデアありがとうございました。
全容と、問題としているポイントがわからないのでなんともですが、「SQL文をVBAで作ろうとして躓いている」ですかね?
VBA上では「"(ダブルクオーテーション)」で囲まれた部分は文字列として処理されます。その文字列内で「"」そのものを記述したい場合は、記述したい位置で「"」を2つ続けて記述します
"
文字列="DMax(""" & 変数 & """,""テーブル"",""№>=1 AND №<=9"")"
"DMax(""" & 変数 & """,""テーブル"",""№>=1 AND №<=9"")"
もしくは、SQLでは文字列を指定するのに「"」のほか「'」を使っても良いので
'
文字列="DMax('" & 変数 & "','テーブル','№>=1 AND №<=9')"
のように書き換えても動作します
ありがとうございます。SQLビューをみて簡単なものは、抽出できるようになりました。 次は、クエリの条件を下記のような条件にしたいです。 (テーブル.フィールド)=DMax("フィールド","テーブル","№>=1 AND №<=9") vbaで処理したいので、フィールドは「変数」にしたいのですが、Dmax関数の中の変数の書き方がわかりませんでした。 お願いいたします
hatenaさん ありがとうございます。スクショして頂いた分の最後に記載して頂いてましたね。失礼しました。 こんな機能があったのですね、全然知りませんでした。その名の通り書式が条件により変更出来るとしか思っていませんでした。早速試してみます。本当にありがとうございました。
「生の」とは例えば20日締めなら「締日」のフィールドを用意し「20」と保存しておくなどです その他、「支払月」として当月=0、翌月=1、翌々月=2・・・、「支払日」として日の数値を保存するようにすればそのまま日付計算に使えるようになります
ただ、数値としてそのまま保存できない条件として、「末締め」「末払い」のような、「該当月の末日」が指定される場合などもあります。このような、結果として日付が変動するような条件については、日にちのデータだけでは表現できないので工夫や、条件分岐せざるを得ないこともあるでしょう
さらに複雑な条件も考えられますが、いずれにせよ、現在の質問のような「締め日ID」「支払日ID」というデータのとり方は無駄に複雑でわかりにくいもににするだけのものです これを改善するだけでもかなりすっきりしたクエリになりますよ
書式の右側のボタンの一番右端のボタンが 有効/無効の切り替えボタンになっていると思います。
下記のリンク先の画像の赤丸で囲まれたボタンです。
Access Tips #348 条件付き書式でテキストボックスが使用可能になってしまうときは? | T'sWare
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
では、ついでに
内容が具体的ではなかったのでクエリ側でDMax関数を使う形で回答していましたが、VBA上だけで完結する内容であれば、DMaxの計算は外に出してしまったほうが分かりやすくなると思います
レポートをダブルクリックで開いた後にもうワンクリックする手間を省きたくて解決法を探しているので、フォーム作ってまで実現したいことではないですね。。考え方は参考になります。
単純に設定で変えられたりできないもんでしょうか。。。
レポートのなんやかんやってレポートを開こうとしてるときに制御できないみたいですね
しかたないので制御用のフォームを作ってなんやかんやしてみる
開くレポート
制御用のフォーム
ご指摘の通り宣言の型が違っておりました。さらっと解決いたしました。ありがとうございます!!
それだと最大化されます。
自分がやりたいのは、ナビゲーションウィンドウからダブルクリックで開いた時に
レポートがウィンドウ枠の大きさに合わせて全体が表示されるようにすること。
サイズの自動調整ではなく、任意の大きさでウィンドウ枠を保存し、その大きさで開かれるようにしたい。
それだと最大化される。
以下、サンプルコードを実行してみました
イミディエイトウィンドウには
と表示されエラーは発生しません
問題があるとすれば
StrSQL
の型宣言が間違っているくらいですかね質問の内容がよく分からないですが読み込み時イベントでなんやかんやしたらいいんじゃないですかね
ありがとうございます
の全文が黄色になってしまいました。
ナビゲーションウィンドウをダブルクリックで開いた時、レポートが毎回左下にずれており、全体を表示するためにレポートを一回クリックしなければなりません。
左下にずれる原因と、対処法をご教示願いたい。
teratailでは「不可能である」と回答されたが、Hatenaさん、どうにかする方法はないでしょうか。
回答をお待ちしております。
Access2003はサポートがとっくの昔に切れているので、正常に動作する保証はありません。
新しいAccessを導入して移行することをお勧めします。
職場で使用するということならなおさらです。
パッと見る限りは記述には問題なさそうですね。そのエラーが出たとき、デバッグボタンでエラーの出た行を表示するとどの行がハイライトしていますか?
ありがとうございます。直接文字列と A1 で入力したのですが
Dmaxの文章を追加したら「エラー13 型が一致しません」になってしまいました。
よろしくお願いいたします
お二方ご回答ありがとうございます。
ご意見を参考にして、組み立ててみます。
HGP正楷書体でもHG正楷書体PROと同じく、表示はされるが字体が異なりました。
表示はされるが字体が違うというのは?に置き換わるよりもタチが悪そうなので、
現状のまま、StrConvで?に置き換えて抽出する方法を採ろうと思います。
私のところでも字体は違うようでした。
調べてみると「HG正楷書体-PRO」は有料のフォントのようなので、課金しないと使えないのかもしれません。
HG正楷書体-PRO / RICOH(リコー) | フォント専門店 Font Garage
こちらにもHG正楷書体-PROがありましたので変更してみたところ、文字は表示されますが字体は違いました。
スクリーンショットを添付したいのですが、どのようにすれば貼り付けられますでしょうか?.pngです
上が土の吉は異体字ですね。Unicodeにはありますので、現在の環境なら通常は正しく表示できます。
Strconv関数はUnicode非対応なので?に文字化けします。
全角変換は、Strconvを使わずに、自作関数を作成してください。例えば、下記などを参考に。
文字化け対応StrConv - Qiita
当方の環境(Win11)では「HGP正楷書体」は入っていないですね。昔、そのようなフォントが入っていた記憶があるので古いフォントなのでしょう。
「HG正楷書体-PRO」というフォントは入っていたので、これで確認してみましたが正常に表示されました。正楷書体なのでおそらく字体は同じだと思われます。
主にHGP正楷書体をレポート用のフォントとして使用しています。
すみません、外字が?に変わるのは追加クエリを実行した時ではなく、Strconv([フィールド],4)で半角から全角に変換するクエリを実行した時でした。
例えば「吉(上が士ではなく土)」といったレコード上で太字っぽく表示される文字は、全角変換用のクエリを実行した時に?に置き換わります。
hirotonさんコメントありがとうございます。確かにそうですね、入/出の累計を使ったら繰越処理をわざわざ追加クエリでしなくていけますね。その方が動的に数字がでますね。前月繰越○○個、当月入●●個、当月出△△個、次月繰越(残数)□□個という事にしたかったのです。これも一番最初(前期から残っている分)の入力するだけで不要な処理はせずにだせますね。
ありがとうございました。
エクセルもAccessのテーブル、フォーム、レポートも、ユニコードに対応しているので、エクセルで正しく表示されるなら、通常はAccessでも正しく表示されるはずです。
ただし、VBAはいまだにユニコード非対応(Shift-JIS依存)の部分がありますので、使い方によっては非Shift-JIS文字が「?」に変わることがあります。
追加クエリや、通常の代入操作なら「?」に変わることはないはずです。
現状のシステムでは、具体的にどのように「出力用テーブルに追加」しているのですか。
今どきのフォントでユニコードでないフォントはないと思いますが、具体的にどのような文字が、修正が必要になりますか。
在庫数は入力を開始してから算出日までの、すべての入庫からすべての出庫を引くと算出できます。この数を求めるだけであれば選択クエリ1つで可能です
回答ありがとうございます。
仮にAccessの出力用テーブル上で正しく表示されたとしても、レポートで使用しているフォントでその字がなければ結局Illustratorで修正しなくてはなりません。
物質テーブル
合致していれば、組み合わせを登録。登録がない組み合わせは、合致しない。
文字の問題は難しいですね
Excel上で正しく表示されているならACCESSでもそのまま表示されるよう、原因の究明と解決を行うべきだと思います
「『外字は必ずIllustratorで作字を行うこと』というルールがあるので外字は化けてほしい」という要望があるなら今の方法でいいんじゃないでしょうか?意味が分かりませんが
フィールド(列)が増える設計はNGです
法令適合テーブル
Excelのような表示にしたい場合はクロス集計クエリが使えます
hatena さん
ありがとうございます。
テーブル名で解決できました。
お手数お掛けいたしました。
CurrentDb.Executeはクエリ(SQL文)を実行するものです。
これはテーブルまたはクエリを対象にするものです。
フォーム名ではなくフォームのレコードソースのテーブル名(またはクエリ名)にしてください。
申し訳ございません。回答はいただいておりました。
もう少し前後がないと何ともですが必要そうなところを記述すると
1~4と、数字部分だけが変わるのであればその前の部分までは直接文字列で記述しておけばいいです
難しい問題ですね。使用する言語それぞれについて知識を深め、それぞれ適切に使う。というあいまいな答えになってしまいます
前提として、自分がどのような言語を使っているのか?ということをはっきりさせておく必要があります。その言語というのが「VBA」と「SQL」となりますが、Microsoft Access上において、より厳密には「ACCESS VBA」と「ACCESS SQL」となります
特に、SQLは様々なデータベースで採用されていますが、それぞれのデータベースで少しずつカスタマイズされていて微妙に仕様が変わったりします
これらを踏まえて例えば、Microsoft Accessという環境の上で何かの処理をしたい場合、
という記述は、ACCESSのクエリデザインやフォーム上(テキストボックスのコントロールソース)、VBAなど、どこで記述しても使える記述ですが、
は、VBAでは使えません。VBAではシングルクオーテーションはそれ以降をコメントとするという記述になるので、この記述は構文エラーになってしまいます
このような観点からは「SQL構文を直接VBAで操作する」というようなことが無ければ「ダブル」だけ覚えておけば済むともいえます
Accessというアプリケーションとしても、文字列として補完される場合はダブルクオーテーションが使われるのがデフォルトですね
しかしながら、今回の問題のように、VBAでSQL構文を作ることを考えた場合は、シングルクォーテーションを使ったほうが見やすい・記述が少ないというメリットが得られます。コードを記述するうえではミスをしにくい記述を心がけるというのが大事になってくるので、「VBAでSQL構文を操作する場合に限って」はシングルクオーテーションを使えるようになったほうがいいと思います。
続けてすみません。SQLに使用したいので入力してみたのですがエラーになってしまいました。
A1は1から4まで変化していきます。こちらはfor Nextで回しています。
教えていただけますか?
つたない説明ですみません。クエリの抽出条件で「ダブルクオーテーション」を使うことは知っていたのですが、囲ってしまうと決め打ちの名前になってしまって思っていた変数として動かなくて...。「ダブルクオーテーション」を3つ使うと、固定した名前と変数と分けることができるのですね、ありがとうございます。ちなみに、これから覚えるとして「シングル」と「ダブル」どちらがおすすめでしょうか?
hirotonさん ありがとうございます。なるほどそういう事ですね。その方が加工するのが分かり易い感じですね。ちょっと固定観念にとらわれてました。トライしてみます。アイデアありがとうございました。
全容と、問題としているポイントがわからないのでなんともですが、「SQL文をVBAで作ろうとして躓いている」ですかね?
VBA上では「
"
(ダブルクオーテーション)」で囲まれた部分は文字列として処理されます。その文字列内で「"
」そのものを記述したい場合は、記述したい位置で「"
」を2つ続けて記述します"DMax("""
& 変数 &
""",""テーブル"",""№>=1 AND №<=9"")"
もしくは、SQLでは文字列を指定するのに「
"
」のほか「'
」を使っても良いのでのように書き換えても動作します
ありがとうございます。SQLビューをみて簡単なものは、抽出できるようになりました。
次は、クエリの条件を下記のような条件にしたいです。
(テーブル.フィールド)=DMax("フィールド","テーブル","№>=1 AND №<=9")
vbaで処理したいので、フィールドは「変数」にしたいのですが、Dmax関数の中の変数の書き方がわかりませんでした。
お願いいたします
hatenaさん ありがとうございます。スクショして頂いた分の最後に記載して頂いてましたね。失礼しました。
こんな機能があったのですね、全然知りませんでした。その名の通り書式が条件により変更出来るとしか思っていませんでした。早速試してみます。本当にありがとうございました。
「生の」とは例えば20日締めなら「締日」のフィールドを用意し「20」と保存しておくなどです
その他、「支払月」として当月=0、翌月=1、翌々月=2・・・、「支払日」として日の数値を保存するようにすればそのまま日付計算に使えるようになります
ただ、数値としてそのまま保存できない条件として、「末締め」「末払い」のような、「該当月の末日」が指定される場合などもあります。このような、結果として日付が変動するような条件については、日にちのデータだけでは表現できないので工夫や、条件分岐せざるを得ないこともあるでしょう
さらに複雑な条件も考えられますが、いずれにせよ、現在の質問のような「締め日ID」「支払日ID」というデータのとり方は無駄に複雑でわかりにくいもににするだけのものです
これを改善するだけでもかなりすっきりしたクエリになりますよ
書式の右側のボタンの一番右端のボタンが 有効/無効の切り替えボタンになっていると思います。
下記のリンク先の画像の赤丸で囲まれたボタンです。
Access Tips #348 条件付き書式でテキストボックスが使用可能になってしまうときは? | T'sWare