Microsoft Access 掲示板

6,622 件中 6,081 から 6,120 までを表示しています。
5
hhmmj553 2019/10/29 (火) 18:02:52 fa06c@9043e

グループレベル1ヘッダーにコントロールを作成できました。
ありがとうございました。

4
hhmmj553 2019/10/29 (火) 17:50:13 fa06c@9043e

 CreateGroupLevelメソッドの存在は知りませんでした。
さっそく試してみようと思います。
ありがとうございました。

3

下記が参考になりませんか。フォームでの場合ですが、レポートでも同様な方法で可能です。

列数が変化するクロス集計クエリと連結するフォーム - hatena chips

列数が変化するクロス集計クエリと連結するフォーム - hatena chips

お勧めはしませんが、どうしてもVBAでグループヘッダーを追加したいという場合は、下記が参考になるかと。

CreateGroupLevel メソッド (Access) | Microsoft Docs

2
名前なし 2019/10/29 (火) 16:06:37 60917@9043e

VBAでする理由:
・グロス集計したレコードセットを元にレポートを作成しますので、列見出しが変わります。手作業では大変なのでVBAで作成したいのです。
目的:
・プロジェクトの分析(プロパティ値の表示)

今、自分のプロジェクトのフィールドのプロパティ値、コトントロールのプロパティ値を一覧表にしようとしています。
その時、フィールド名が行見出し、プロパティ名が列見出し、プロパティ値が値になるように、クロス集計しています。
そして、グループレベル1にオブジェクト名を表示させたいのです。
レポートではページヘッダーにプロパティ名を縦長で1行に表示させていますが、とても全部を表示させることはできませんので、重要なプロパティ値、値に変更を加えたプロパティ値のみ表示させています。
この列見出しとしているプロパティ名がプロジェクト毎に変わるので、VBAでレポートを作成したいのです。
ここまではできているのですが、グループレベル1ヘッダーにコントロールを作成できれば、完璧だと思うのです。
よろしくお願いします。

1

デザインビューでグループヘッダーを追加したり、コントロールを追加するのではなくて、VBAでする理由と目的はなんでしょうか。

事前に追加しておいて、必要に応じてVBAで表示/表示をコントロールするほうがはるかに楽ですし、デザインビューで開く必要がないので安全です。

10
rookjim 2019/10/28 (月) 12:17:26

mayuさん

テーブル設計を見直したサンプルのご提示ありがとうございます。
素朴な質問のつもりでしたが、ここまで懇切丁寧に回答いただき、
情報量にただただ圧倒される次第です。

また、その前段にてmayuさんよりご提示いただいた、
SUM集計関数を用いて元のクエリで抽出できなかったレコードを一括で抽出し
別途対処するというアイディアを参考にして下のクエリを作成しました。
こちらで一応望む結果を得ることができましたので、あまりスマートな方法では
ないと自覚していますが、ひとまずこの質問は解決にしようと思います。

SELECT 
 Qクロス結合.[リマインダーID],  Qクロス結合.[リマインダー内容],  Qクロス結合.日付,  Qクロス結合.曜日, 
 IIf( [曜日番号合計] = 0, 0, [曜日番号] ) AS 曜日条件, 
 IIf( [週番号合計] = 0, 0, [週番号] ) AS 週条件 
FROM 
 Qクロス結合  LEFT JOIN ( SELECT  [リマインダーID],  sum(曜日番号) AS 曜日番号合計,  sum(週番号) AS 週番号合計  FROM  T条件  GROUP BY  [リマインダーID] ) AS 番号合計 ON Qクロス結合.[リマインダーID] = 番号合計.[リマインダーID] 
WHERE 
 ( ( ( IIf( [曜日番号合計] = 0, 0, [曜日番号] ) ) In ( select  曜日番号  from  T条件  where  T条件.リマインダーID = Qクロス結合.リマインダーID ) ) 
 AND ( ( IIf( [週番号合計] = 0, 0, [週番号] ) ) In ( select  週番号  from  T条件  where  T条件.リマインダーID = Qクロス結合.リマインダーID ) ) ) 
ORDER BY 
 Qクロス結合.[リマインダーID], 
 Qクロス結合.日付;

以上、大変参考になるご回答数々いただき感謝致します。ありがとうございました。

9

※ 続き

SELECT x.リマインダーID
     , z.日付
     , Weekday( z.日付 )         As 曜日番号
     , ( Day( z.日付 ) + 6 ) \ 7 As 週番号
FROM T_リマインダー  x
   , T_条件          y
   , T_日付          z
WHERE x.リマインダーID  =  y.リマインダーID
  AND x.開始年         <=  Year( z.日付 )
  AND x.終了年         >=  Year( z.日付 )
  AND y.対象月_from    <=  Month( z.日付 ) 
  AND y.対象月_to      >=  Month( z.日付 )
  AND y.週番号_from    <=  ( Day( z.日付 ) + 6 ) \ 7
  AND y.週番号_to      >=  ( Day( z.日付 ) + 6 ) \ 7
  AND y.曜日番号_from  <=  Weekday( z.日付 )
  AND y.曜日番号_to    >=  Weekday( z.日付 )
  AND (
           ( x.リマインダー種別 = 2 AND y.日番号 = 0 )
        OR
           ( x.リマインダー種別 = 1 
               AND
             z.日付 = 
                 DateSerial( Year( z.日付 - y.日番号 ), 
                             Month( z.日付 - y.日番号 ) + 1, y.日番号 ) 
           )
      )
ORDER BY 1, 2 ;

結果 ( 一部抜粋 )

リマインダーID日付曜日番号週番号
12019/01/1272
12019/01/2674
22019/01/2013
22019/02/1713
32019/01/0461
32019/01/0721
42019/01/1052
42019/01/3155
42019/02/1012
42019/02/2854
52019/03/0421
52019/03/1122
52019/04/0121
52019/04/0822
62019/10/2234
8

※ 続き

データ例

< T_リマインダー >

ID内容種別開始年終了年
1第2、第4土曜日220182027
2第3日曜日220172026
3毎週 月曜日と金曜日220112050
4毎月10日と月末日120112025
53月と4月の第1、第2月曜日220132030
6即位の礼120192019

 
リマインダーの種別において
 ・ 日 単位で発生するもの    は 1 を入力
 ・ それ以外のもの ( 週・曜日 ) は 2 を入力
というルールにします

 
< T_条件 >

F1 ---> 条件ID      F5 ---> 週番号_from
F2 ---> リマインダーID  F6 ---> 週番号_to
F3 ---> 対象月_from    F7 ---> 曜日番号_from
F4 ---> 対象月_to     F8 ---> 曜日番号_to
              F9 ---> 日番号

F1F2F3F4F5F6F7F8F9
1111222770
2111244770
3211233110
4311215220
5311215660
64112151710
7411215170
853412220
961010443322
 
※1
掲示板の文字数制限上、F1 や F2 という、表のフィールド名は適宜 読み替えて下さい。

※2
月、週、曜日において
連続した値( 毎月、毎週、火~金、4月~6月 など )は
連続した範囲として1行で表現し、
連続しない場合は行を分け、データを個別に登録します。
この部分が、データ登録における一番の難関だと思いますが
データサンプルをよくご覧になれば、構造を理解できるでしょう。

※3
日単位で発生するリマインダにおいて
日番号フィールドに入力する値は、月末は 0
                それ以外は 日の数字
※4
曜日や週単位で発生するリマインダにおいて
日番号フィールドに入力する値は 0

7

> テーブル設計含めより適した方法を引き続き検討していきたいと思いますので、
> 機会がありましたらぜひよろしくお願い致します。

テーブルの構造を変更する場合のサンプルを以下に載せておきます。

まず、リマインダーは

  ・ 日 単位で発生するもの
  ・ それ以外のもの( 週・曜日 )

の2種に大別できるでしょう。
( 両立しない条件のため )

よって、リマインダの定義テーブルに
種別を管理するフィールドが必要になります。( ※1 )

次に、リマインダーの発生周期は
月、週、曜日、日の組み合わせによることから
条件テーブルに、これらの値を格納するフィールドが必要 ( ※2 )

条件テーブルへデータを登録するにあたり、
行数が増えることに漠然とした不安を感じておられるようなので
行数を抑制できるフィールド構成にします ( ※3 )

特定の日に1度きりで実施されるリマインダと
特定の周期で何度も実施されるリマインダは
入力項目を共通化して統一し、Nullや意味不明の値は許可しない ( ※4 )

※1 ~ ※4 を網羅したテーブル定義

CREATE TABLE T_リマインダー
(
      リマインダーID   INT            NOT NULL
    , リマインダー内容 VARCHAR( 100 ) NOT NULL
    , リマインダー種別 SMALLINT       NOT NULL
    , 開始年           SMALLINT       NOT NULL
    , 終了年           SMALLINT       NOT NULL
    , CONSTRAINT pk_reminder PRIMARY KEY ( リマインダーID )
);

 

CREATE TABLE T_条件
(
      条件ID          AUTOINCREMENT PRIMARY KEY
    , リマインダーID  INT           NOT NULL
    , 対象月_from     SMALLINT      NOT NULL
    , 対象月_to       SMALLINT      NOT NULL
    , 週番号_from     SMALLINT      NOT NULL
    , 週番号_to       SMALLINT      NOT NULL
    , 曜日番号_from   SMALLINT      NOT NULL
    , 曜日番号_to     SMALLINT      NOT NULL
    , 日番号          SMALLINT      NOT NULL
);

 

CREATE TABLE T_日付
(
      日付 DATETIME NOT NULL PRIMARY KEY 
);
6
rookjim 2019/10/27 (日) 22:11:41

mayuさん

大変に熱のこもったご回答をいただきありがとうございます。

ひとまず、中段にご提示いただいた、元のクエリで抽出されないレコードを集計クエリで別途抽出しユニオンクエリで結合するという考え方を参考にさせていただき、
実際の動作を検証してみたいと思います。

また、独学なため実例を見る機会があまりなく、テーブル設計含めより適した方法を引き続き検討していきたいと思いますので、機会がありましたらぜひよろしくお願い致します。以上、ありがとうございました。

5
mayu 2019/10/27 (日) 08:15:03 修正 76b28@61ad5

> ご回答いただいたように複数の条件を全て網羅するようにテーブル構成を変更すると、
> 「月」、「日付」等の並列する条件を追加した際に
> 条件テーブルが長大なものになってしまうため

 
「月」や「日付」の条件をテーブルに追加して長大になるというのは
意味がわかりかねます。
前回の回答で、私はフィールド構成の変更を提案したわけではなく
データの持ち方を変更するよう、示唆したに過ぎません。

したがって、ご自身が考える「 長大にならない 」設計方針と
「月」や「日付」をどのような構成でデータ登録し、
週次や曜日毎に実施するデータと同居させる予定なのか
また、どのような SQL で抽出を行うつもりでいるのか、構想をお聞かせ願えますか。

> [1]については現在のテーブル構成のまま目的の抽出結果を得られる方法を求めております。

 
現状の構成は、以下の問題点が明白ですので

 ・ 第三者から見て、単一の行からテーブルのデータ構造が把握できない
 ・ 相関サブクエリというのは、莫大な演算回数が発生するパフォーマンスの悪い SQL である
 ・ 複雑なサブクエリを複数回発行しても、思ったようにデータが抽出できていない
 ・ 演算フィールドを左辺に指定して抽出条件を指定しているため、インデックスが効かない

運用も構築も この先 地獄を見る覚悟がおありということでしたら
一応、ご希望の回答はしておきます。

なお、週番号だけを指定するリマインダーが あるのかどうか不明ですが
とりあえず、どちらでもいいように冗長な SQL にしておきます。
以下の結果を ユニオンクエリで rookjimさん記載の SQL と結合すればいいでしょう。

SELECT x.リマインダーID
     , z.日付
     , y.曜日番号
     , y.週番号
FROM 
(
    SELECT リマインダーID
      FROM T条件
    GROUP BY リマインダーID
    HAVING Sum( 週番号 )   = 0
        OR Sum( 曜日番号 ) = 0 
)
         x
, T条件  y
, T日付  z
WHERE x.リマインダーID = y.リマインダーID
  AND ( 
         y.曜日番号 = Weekday( z.日付 )
             OR
         y.週番号   = ( Day( z.日付 ) + 6 ) \ 7
      )
ORDER BY 1, 2 ;

 

> または
> ・条件を網羅したテーブルのデータが作成できるようにフォームを再設計する
> ・T条件のデータを複数の条件を全て網羅するように変換するようクエリを作成する
> 等で解決できるかと思うのですが、
> こちらについても具体的な方法をアドバイスいただけますと幸いです。

 
具体的なアドバイスをご希望なら、まずは データベースソフトの扱いにおいて
rookjimさんの方針や考え方は、順番や方向性が真逆である
ということを理解いただかない限り、不毛なやりとりになるでしょう。

> ・条件を網羅したテーブルのデータが作成できるようにフォームを再設計する

のではなく、構築手順は

  1. 条件を網羅した適切な構造のテーブルを設計する
  2. パフォーマンスや見通しの良い SQL を考える
  3. VBAの利用やコントロールの配置は必要最小限に抑え、
    シンプルで保守性の高いインターフェース( フォーム・レポート )の構築を目指す

になります。

添付画像における リマインダーID: 1 の内容においても
発生条件が「 第2、第4土曜日 」ですから
フォーム上で [ 指定日 ] [ 日 ] といった項目を ユーザが指定する必要は無いように思いますが
代替値を入力しない限り、テーブル上でそれらの項目は Null になります。
これらの項目を SQLでどう扱うか、見通しが立っていないのでしたら
テーブルの設計から見直す必要があり、当然、フォームも改変を余儀なくされます。

まずは、テーブル設計からやり直す気が有るのか否か、意思表示をお願いします。

4
rookjim 2019/10/26 (土) 22:20:07

mayuさん
つたない質問内容を読み取っていただき、丁寧な回答いただきありがとうございます。

ご指摘いただき、T条件のテーブルの記述の仕方が、望む抽出結果を得るために適さない形式であることがわかりました。

T条件のテーブルが1レコードごとに1条件の構成になっている理由は、ユーザーがくり返し条件を入力するためのフォームを下のように作成したためです。

画像1

ご回答いただいたように複数の条件を全て網羅するようにテーブル構成を変更すると、
「月」、「日付」等の並列する条件を追加した際に条件テーブルが長大なものになってしまうため➀については現在のテーブル構成のまま目的の抽出結果を得られる方法を求めております。引き続きご教授いただけますと幸いです。

または
・条件を網羅したテーブルのデータが作成できるようにフォームを再設計する
・T条件のデータを複数の条件を全て網羅するように変換するようクエリを作成する
等で解決できるかと思うのですが、こちらについても具体的な方法をアドバイスいただけますと幸いです。

検討いただき大変有り難く思っております。大変わがままな質問で恐縮ですが
何卒宜しくお願いします。

2

質問内容 1, 2 両方ともに関連することですが
Tくり返し条件 テーブルの
データ構成に問題があるでしょう。

一意のリマインダーIDを構成する要素は
  週番号 + 曜日番号
なのですから
週番号だけ とか、曜日番号だけ という
どちらか1つだけを表現した行を作ってはならないのです。

rookjimさんの例で申し上げるなら
リマインダーID:3 の「 毎週月曜と金曜 」というのは

  ・ 週番号は 1 または 2 または 3 または 4 または 5
 且つ
  ・ 曜日番号は 2 または 6

であるのに
週番号の入力値を 0 という非該当の数字で表現していることが
SQL文が複雑になり、思ったように抽出できない原因になっています。
 
T条件

条件IDリマインダーID曜日番号週番号
1172
2174
3213
4321
5322
6323
7324
8325
9361
10362
11363
12364
13365

 
このように
複数の条件( 週 + 曜日 )を全て網羅するようなデータ構成に変更すると
SQL文は以下のように簡潔に記述できて
抽出漏れも解消できます。

SELECT x.リマインダーID
     , y.日付
     , x.曜日番号
     , x.週番号
FROM T条件 x
   , T日付 y
WHERE x.曜日番号 = Weekday( y.日付 )
  AND x.週番号   = ( Day( y.日付 ) + 6 ) \ 7
ORDER BY y.日付
       , x.リマインダーID ;
1
rookjim 2019/10/25 (金) 20:47:54

質問者です。
テーブルの名前は
Tくり返し条件× → T条件○
でした。
大変失礼致しました。
よろしくお願い致します。

10
チョコ 2019/10/22 (火) 13:53:09 f6d67@dab18

hatena様、本当にありがとうございます。
思いもよらいな現象でビックリしています。
ありがとう御座いました。

9

下記の設定でどうでしょうか。

値集合ソース

SELECT ID, アイテム, Space(階層) & アイテム FROM テーブル1 ORDER BY ID;

連結列: 1

列数: 3

列幅: 0cm;0.002cm


解説
コンボボックスのボックス部に表示されるのは、列幅0cm以外の最初の列
上記の場合は、2列目がボックス部に表示される。
2列目は列幅が0.002cmなので存在はするがリストではほぼ見えない状態。
リストには3列から表示されてるように見える。

8
チョコ 2019/10/21 (月) 21:26:27 f6d67@dab18

すいません。
選択後にインデントの表示になってるいるので表示がずれてしまいます。
書式か何かで空白のインデント分を調整出来ますでしょうか?

7
チョコ 2019/10/21 (月) 21:06:52 f6d67@dab18

…凄いです。
目からうろこです!!!!!
ツリービューは設定が大変なので本当に助かります。

ありがとうございます。!!

1

飲食店でしょうか。質問が曖昧過ぎるので具体的に回答はむずかしいです。

Accessはまったくの初めてですか。
だとしたら、まずは、入門書か入門サイトで基本を学習してからでないと難しいと思います。

まずは、テーブル設計から始めてみてください。
下記がテーブル設計については詳しく解説しています。

もう一度学ぶMS-Access
もう一度学ぶMS-Access
もう一度学ぶMS-Access

6
hatena 2019/10/21 (月) 17:15:13 修正

インデントでいいのなら、通常のコンボボックスで、先頭に空白をいれればいいように思います。

例えば、リストのもとになるテーブル設計を下記のようにしておいて、

テーブル1

IDアイテム階層
1親アイテム10
2子アイテム11
3孫アイテム12
4親アイテム10
 
コンボボックスの値集合ソースを下記のように設定
SELECT ID, Space(階層) & アイテム FROM テーブル1 ORDER BY ID;

さらに下記のように設定すれば、

連結列:1

列数:2

列幅:0cm

疑似階層表示になると思います。

5
チョコ 2019/10/21 (月) 16:31:48 f6d67@dab18

あ、階層表示といっても、インデント!?というのでしょうか、
それが設定出来るので、疑似階層表示といえば良いのかも知れません。

4
チョコ 2019/10/21 (月) 16:29:47 f6d67@dab18

やはりそうですか。
コードが短く済むのでいいかなと思ったのですが、
見たところリスト行数の設定も難しそうですし、
keyの設定も、数字を文字列(全角にしても)に変換してもエラーが出ますし…

TreeViewコントロールで実装する事にします。
ありがとうございました。

3

イメージコンボボックスって階層表示に対応してるんですか?

階層表示するなら、自分なら、TreeViewコントロールをボタンのクリックで表示/非表示させる方針で行くかな?

Office TANAKA - TreeViewコントロールの使い方

2
チョコ 2019/10/21 (月) 14:37:53 f6d67@dab18

返信ありがとうございます。
階層表示にしたいのでイメージコンボボックスをと考えていました。
色々とググったのですが、詳細が記載されているところが見当たらなくて。

1

イメージコンボボックスは使ったことがないのでご質問に回答できないですが、

ちなみに、画像は使用しなで使おうと考えています。

普通のコンボボックスではダメなんですか?

3

hatenaさま、返信ありがとうございます。

日が変わり脳みそがリセットされたら、解決いたしました。

>一時テーブルへデータをエクスポートするときの抽出条件はどこでどのように設定してますか。

抽出条件に関する「W.回数=T.回数」について、
DELETEのSQLでの記載箇所“どこで”を誤っておりました。
EXSITSの中でこねくり回してしまっておりました。
下記のとおり書いたらうまく動作しました。

DELETE FROM T_受講受付 AS T
WHERE W.回数=T.回数 and NOT EXSITS (SELECT * FROM W_受講受付 AS T WHERE W.申込者=T.申込者)

どうもお騒がせいたしました。

もう不要ではありますが、うまく動作している方のSQLは下記のとおりとしておりました。
(実際のテーブルのフィールドは多いのでstrとしています。)

UPDATE T
INNER JOIN W
ON T.回数=W.回数
SET  & strフィールド &
WHERE T.回数= str抽出した回数

INSERT INTO T ( & strフィールド & )
SELECT & strフィールド &
FROM W

ありがとうございました。
今後ともよろしくお願いいたしますm(__)m

2

とりあえず画像ファイルからの想像ですが、
一時テーブル以外のレコードがすべて削除されているようですね。

データを一時テーブルへ転送するときに、元テーブルに何らかの抽出条件を設定しているはずです。
削除クエリにも、同じ抽出条件を設定しないと、そのような結果になりますね。

1
hatena 2019/10/16 (水) 12:09:44 修正

T_受講受付 の主キー設定を提示してください。

INSERT・ UPDATEは上手くいくのですが

そのうまくいっているSQLを提示してください。

あと、一時テーブルへデータをエクスポートするときの抽出条件はどこでどのように設定してますか。

3

レポートのプレビューに[印刷][閉じる]ボタンを付加する関数を下記で紹介していますので、
よろしかったらご参考に。

印刷プレビューに[印刷][閉じる]ボタンを付加する関数-改良版
以前の記事 印刷プレビューに[印刷][閉じる]ボタンを付加するOpenReport互換関数 - hatena chips の改良版です。 上記の関数は、複数のプレビューを同時に開いたとき、最後に開いたものだけしか[印刷][閉じる]ボタンが付加されません。前に開いていたものからはボタンが消えてしまいます。これを改良して、複数のプレビューにもそれぞれ[印刷][閉じる]ボタンが付加されるようにしました。 また、レポートの開くときイ...
fc2

1
Kitty 2019/10/15 (火) 13:55:26 e4054@a3086

すみません!解決しました

2
Kitty 2019/10/14 (月) 10:20:12 e4054@a3086

ありがとうございました。
ポップアップする方法参考にさせていただきます。

1
hiroton 2019/10/10 (木) 18:36:59 96775@f966d

ちょっと調べてみましたがメニューバーを表示する場合「ファイル」だけは非表示にできないような感じでした。
「ファイル」の中のメニューは好きに弄れるようです。(「閉じる」を非表示にしたりとか)
Access 2016 のリボンをカスタマイズする

「印刷」だけをさせたいなら右クリックのショートカットメニューをカスタマイズするとか、自分の場合はよく、[印刷]と[閉じる]のボタンだけを置いたフォームをポップアップに設定しておいて、レポートを「印刷プレビュー」で開くと同時にフォームを開くようなものを作ります。

2
tokinaito 2019/10/08 (火) 11:15:19 bb5c2@5f550

hatena様大変有り難うございました。
考え方としては次の通りでよろしいんでしょうか?

Public Function 月初(申請日 As Variant) As Variant
    If IsNull(申請日) Then Exit Function
'申請日がNULLなら関数は終わり
    月初 = DateSerial(Year([申請日]), Month([申請日]) + 1, 1)
'月初めが出る
    Do
        Select Case Weekday(月初)
        Case vbMonday To vbFriday
            If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
                Exit Do
            End If
        End Select
        月初 = 月初 + 1
    Loop
'  月初めが月曜から金曜の間で祝祭日がNULLならD0文が修了。土日はNULLじゃないから終了しない
  終了するまで月初に1日プラスする。
End Function

2

hatena様
閲覧してくださった皆様
有難う御座います

>レポートでなら、「分類」テキストボックスの「重複データ表示」プロパティを「はい」にしておけばいいでしょう
此方でレポートが無事に完成できました
有難う御座います

こんなに設定事項があるんですね
驚きました
時間を作って弄ってみます

重ねてアドバイス有難う御座いました

1

レポートでなら、「分類」テキストボックスの「重複データ表示」プロパティを「はい」にしておけばいいでしょう。

2

hatena 様

いつもありがとうございます。
正常に動作できるようになりました。
難しいですが理解できるように勉強致します。

1

下記でどうでしょうか。

Public Function 月初(申請日 As Variant) As Variant

    If IsNull(申請日) Then Exit Function

    月初 = DateSerial(Year([申請日]),Month([申請日])+1,1)

    Do 
        Select Case Weekday(月初)
        Case vbMonday To vbFriday
            If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
                Exit Do
            End If
        End Select
        月初 = 月初 + 1
    Loop 
End Function
1

親子関係でもできますが、集計等が複雑になるのでそこまですることはないと思います。

また、現状の割増等のフィールドを持たせる方法もあまりいい方法とはいえないと思います。
夜間割増以外にも、その他の割増とか割引とか増えてきたりするとその都度テーブル、クエリ、フォーム、レポートの修正が発生します。集計も複雑になります。

単純に「割増」というレコードを追加するのが一番シンプルだと思います。

日付 項目名 料金

○月○日 作業A 10000
○月○日 夜間割増 5000

1

DLookup の第3引数は抽出条件式を文字列として設定します。
現状は、 "文字列" AND "文字列"となってますので、文字列に対する論理演算になり常にFalseになります。
AND は""の中にいれてください。

次に、[テキスト2]が""内に入ってますので、これは単なる"[テキスト2]"という文字列になります。[テキスト2]コントロールを参照するには""の外に出す必要があります。

  Me.テキスト4 = DLookup("[金額]", "クエリ1", "[月]='" & Me.テキスト2 & "' And [学年]='" & Me.テキスト0 & "'")

これで例えばテキスト2が「4月」、テキスト0が「5~6年」なら、第3引数は下記のような条件式として正しい文字列になります。
[月]='4月' And [学年]='5~6年'