Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : その他)
DLOOKUPフォームでの表示について
投稿日時: 22/07/19 01:56:41
投稿者: Watanabe-45

テーブル名:T_2022年度
フィールド: 科目コード 2022年度4月 2022年度5月 テスト
列     511 2000 4000 1000
列       512 2500 4500 1500
列 513 2600 4600 1600
 
フォーム名:Q_2022年度1
コンボボックス⇒対象月のフィールドで作成
表形式のフォームで科目コードに連動した金額を表示させてたい。
 
科目コードのコンボボックス、イベント終了時のコード
Private Sub 対象月_Click()
科目 = DLookup(Forms!Q_2022年度1!対象月, "T_2022年度", "科目コード= " & Forms!Q_2022年度1!コードF)
End Sub
 
実行後の結果
2022年度4月 2022年度5月、数字を含むフィールドをを選択すると、実行時エラー クエリ式’2022年6月’の構文エラー 演算子がありません。
コンボボックスの文字列のみの[テスト]フィールドを選択すると 511 1000、512 1000 513 1000と科目コードに連動せず、一番最初のコードが表示されてしまい行き詰ってしまっております。
解決方法をご教授いただければ幸いです。
表示させたい処理 2022年度4月を選択すると 511 2000、512 2500 513 2600

回答
投稿日時: 22/07/19 09:51:47
投稿者: Suzu

引用:
フィールド: 科目コード 2022年度4月 2022年度5月 テスト
列     511 2000 4000 1000
列       512 2500 4500 1500
列 513 2600 4600 1600

 
 
これは、・・ どいう意図の表でしょうか?
データシートビュー の 表示を意図した 表示をそのまま表しているのでしょうか?
「列」 と言うのは どういう意味でしょうか?
 
 
--------------------------------------------------------------------------------------
テーブル名 が 数値付きの 年度 を使用していると言うことは
年度が変われば、テーブルも増えるのですか?
その場合、クエリも、フォームも、更には VBAも変えなければならないのではありませんか?
 
Accessでは、そんな使い方は あまりしません。
 
 
フィールド構成案
 
 
案1.【年度・月度・科目 が 同じレコードが複数存在しうる場合】
ID 年度  月度  科目  金額
1  2022   4   511  2000
2  2022   4   512  2500
3  2022   4   513  2600
4  2022   5   511  4000
5  2022   5   512  4500
6  2022   5   513  4600
7  2022   6   511  1000
8  2022   6   512  1500
9  2022   6   513  1600
10  2022   4   511  2700
 
 
 
案2.【年度・月度・科目 が 同じレコードが存在しない場合】 かつ 【科目数が変動する場合】
(フィールドのインデックス で、年度・月度・科目 に対しインデックスを設定し、固有にします
 詳しくは  hatenaさん の所の
 複数のフィールドの組み合わせで重複がないようにする
https://hatenachips.blog.fc2.com/blog-entry-26.html
  を参考にどうぞ。)
 
年度  月度  科目  金額
2022   4   511  2000
2022   4   512  2500
2022   4   513  2600
2022   5   511  4000
2022   5   512  4500
2022   5   513  4600
2022   6   511  1000
2022   6   512  1500
2022   6   513  1600
 
 
 
案3.【年度・月度・科目 が 同じレコードが存在しない場合】 かつ 【科目数が変動しない場合】
年度  月度  511  512  513
2022   4  2000 2500  2600
2022   5  4000 4500  4600
2022   6  1000 1500  1600
 
のどれかになる事が多いです。
 
 
Excel と 同じ見せ方にする方向で テーブル設計 を行うと 運用上使いづらくなります。
 
Accessは、
縦方向(行方向)へ レコードを追加するのは簡単ですが、
横方向(列方向)へ 列を追加すると 全部の見直しが必要になる事もあります。
 
その事をふまえ、データの検索はどこのフィールドで行うか、
全フィールド のうち、どこの複数フィールド に対し、一意な値が入るのか
等を考慮し、テーブルの設計を行います。
 
 
※コンボボックスの値でデータ修正したい
https://www.moug.net/faq/viewtopic.php?t=81372
判らないなら、判らない とアクションがあれば、何か助けになる事があるかもしれません。
何もなく 閉じてしまっては、質問者・回答者 お互いに何のメリットもありませんよ。

回答
投稿日時: 22/07/19 10:47:49
投稿者: ニャッチュ

ACCESS(に限らず)の各種名称で数字・記号から始まると不具合のモトになります。
実際なっていますし。
 
もしフィールド名の訂正が出来ない状態まで進行しているのでしたら、DLookupの第1パラメータのフィールド名表記パートを [ ] ブラケットで囲むようにすると問題は解決すると思います。
 

科目 = DLookup("[" & Forms!Q_2022年度1!対象月 & "]", "T_2022年度", "科目コード= " & Forms!Q_2022年度1!コードF)

投稿日時: 22/07/19 23:13:04
投稿者: Watanabe-45

 ニャッチュさん
回答いただきありがとうございます。
ブラケットで囲むということが、調べてもずっとわからず3週間ほど試行錯誤してしまいました。
前進できますし、今後のアクセスでの資料づくりにも役立てられると思います。
ありがとうございました。
 
 Suzuさん
長年エクセルを使用し続けてしまったことと、今までの資料がエクセルだったためこのようなテーブルづくりとなってしまいました。
前年度比較や、前月比較などフォームでのコンボボックスの連動で資料作りを目的としました。
Suzuさんのご亭案いただいたテーブルの中では案3が用途に一番マッチすると思われます。
当初、案3も構想にあったのですが、月ごとの数字の比較などになるとフィールドの増減を求めるため、作りやすさからの選択となっておりました。
難しいですが、案3も同時に進めていきたいと思います。
投稿ありがとうございました。
 
 
 
 

回答
投稿日時: 22/07/20 09:06:31
投稿者: Suzu

Watanabe-45 さんの引用:
長年エクセルを使用し続けてしまったことと、今までの資料がエクセルだったためこのようなテーブルづくりとなってしまいました。
前年度比較や、前月比較などフォームでのコンボボックスの連動で資料作りを目的としました。
Suzuさんのご亭案いただいたテーブルの中では案3が用途に一番マッチすると思われます。
当初、案3も構想にあったのですが、月ごとの数字の比較などになるとフィールドの増減を求めるため、作りやすさからの選択となっておりました。

 
・データの保存のカタチ
・見せ方のカタチ
 
別に考えた方が良いです。
 
テーブル名として年度があると言うことは、2022だけでなく他の年度もあるのですよね。
それを、フィールドとして持たせます。
  
 ID 年度  月度  科目  金額
1  2022   4   511  2000
2  2022   4   512  2500
3  2022   4   513  2600
4  2022   5   511  4000
5  2022   5   512  4500
6  2022   5   513  4600
7  2022   6   511  1000
8  2022   6   512  1500
9  2022   6   513  1600
10  2022   4   511  2700

xx  20xx  4  511  1200
xx  20xx  5  511  1300

と有ったとしても、
 
 
年度のフィールドに対し抽出条件 【2022】を指定する事で
 ID 月度  科目  金額
1  4   511  2000
2  4   512  2500
3  4   513  2600
4  5   511  4000
5  5   512  4500
6  5   513  4600
7  6   511  1000
8  6   512  1500
9  6   513  1600
10 4   511  2700
 
単年の データのみを取得する事が可能です。
 
そこ発展させクロス集計クエリを使用し
 
    4   5   6
511 4700  4000  1000
512 2500  4500  1500
513 2600  4600  1600
 
とする事は可能です。
 
 
    4   5   6   7・・・2   3
511 4700  4000  1000
512 2500  4500  1500
513 2600  4600  1600
の様に、データのない月をフィールドとして表示する事も可能です。
 
 
上記のクエリが出来れば、年度毎にフォームを直す必要がありません。
 
フォーム上のコンボボックス等のコントロールを配置し
ユーザーに年度を指定させ抽出条件とする事ができます。
 
更に
 ・コンボボックスの 値  を抽出条件としたクエリ
 ・コンボボックスの値-1 を抽出条件としたクエリ
の 2つのクエリを用意すれば、
コンボボックスに 【2022】 を指定させ 2022/2021 のデータの比較もできますよね。

回答
投稿日時: 22/07/20 09:17:05
投稿者: Suzu

T_2022年度
   2022年度4月  2022年度5月  2022年度6月
511   2000     4000      1000
512   2500     4500      1500
513   2600     4600      1600
 
があるとき
 
 
SELECT 2022 AS 年度, 4 AS 月, [T_2022年度].[科目], [T_2022年度].[2022年度4月] AS 金額
FROM T_2022年度
から
 
年度  月  科目  金額
2022  4  511   2000
2022  4  512   2500
2022  4  513   2600
 
 
SELECT 2022 AS 年度, 5 AS 月, [T_2022年度].[科目], [T_2022年度].[2022年度5月] AS 金額
FROM T_2022年度
から
 
年度  月  科目  金額
2022  5  511   4000
2022  5  512   4500
2022  5  513   4600
 
が抽出できます。
 
毎度、この抽出クエリを使う方法もありますが
 
 
私なら、上記クエリに、追加クエリをを適用し
 
年度  月  科目  金額
 
の テーブルにデータとして入れ込んでしまいます。

回答
投稿日時: 22/07/20 09:25:47
投稿者: Suzu

連投すみません。
 
クロス集計クエリについて、これは、集計クエリ になりますので、
そのクエリで得られたデータそのものは、編集できません。
 
なので
 
年度  月度  科目  金額
のテーブルから、
 
   4    5    6
511 2000  4000  1000
512 2500  4500  1500
513 2600  4600  1600
 
の画面を作り、その画面から 赤の値 を修正しようとしてもできません。
 
 
年度  月度  科目  金額
2022   4   511  2000
 
この状態の値を修正する必要があります。

投稿日時: 22/07/21 00:44:34
投稿者: Watanabe-45

Suzuさん
 
色々と教えていただきありがとうございます。
前回ご提案いただいた中で、案3.【年度・月度・科目 が 同じレコードが存在しない場合】 かつ 【科目数が変動しない場合】が一番マッチしていると思いましてテーブル作成をしてみました。
年度  月度  511  512  513
2022   4  2000 2500  2600
2022   5  4000 4500  4600
2022   6  1000 1500  1600
 
クロス集計をして月比較や年度比較などを行いたいことを考えると、案2.【年度・月度・科目 が 同じレコードが存在しない場合】 かつ 【科目数が変動する場合】のテーブルに変換して、まずは、ご意見いただきましたクロス集計を実践したいと思います。その後、フォームを使った年度選択など展開していければと(希望ですが)。
 
データの入力のしやすさや条件などから案3のテーブル作りから始めるのがよいかと思いましたが、案2のテーブルに変更する、テーブル作成クエリでテーブルを作成することはできますか?
クエリやDLOOKでできるかなと思いましたが、どれもうまくいきませんでした。
 
初歩的な部分ばかりで恐縮ですが、ご教授いただければ幸いです。

回答
投稿日時: 22/07/21 10:16:31
投稿者: Suzu

案2.
年度  月度  科目  金額
2022   4   511  2000
2022   4   512  2500
2022   4   513  2600
2022   5   511  4000
2022   5   512  4500
2022   5   513  4600
2022   6   511  1000
2022   6   512  1500
2022   6   513  1600
 
から
 
案3.
年度  月度  511  512  513
2022   4  2000 2500  2600
2022   5  4000 4500  4600
2022   6  1000 1500  1600
 

案4.
年度 科目   4   5   6
2000 511  2000 4000 1000
2022 512  2500 4500 1500
2022 513  2600 4600 1600
 
は クロス集計クエリを使用し変換できます。
 
 
 
案3.または 案4. から
クロス集計クエリ を使って 案2. の形へは変換できません。
 
投稿日時: 22/07/20 09:17:05 の 手法を用いて
案3. であれば 科目毎のクエリ を作成し、
 科目毎のクエリ を年度/月度 で連結し そのクエリからテーブル作成クエリ
 
案4. であれば 月毎のクエリ を作成
 月毎のクエリ を年度/科目 で連結し そのクエリからテーブル作成クエリ
 
を行うことになります。

投稿日時: 22/07/22 00:18:45
投稿者: Watanabe-45

 Suzuさん
 
何度もいろいろ教えていただきありがとうございました。
案2のテーブルを作って進めていきたいと思います。
当初の質問投稿からだいぶ脱線してしまいましたが、イメージがだいぶわいてきました。
できる限り、自分で調べて進めていきたいと思います。
何度もありがとうございました。