質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

3回答

780閲覧

Access の 関数の使い方

access

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2023/02/27 10:12

編集2023/02/27 10:16

実現したいこと

関数で同じクエリ内の別の項目を取得したい。

こんな選択クエリ結果があります。
イメージ説明

これを以下のような "結果"フィールドを追加したいです。

イメージ説明

これを実現するだけですと、 デザインビューで 結果:[著者] を追加するだけで終わる話なのですが、以下のプロセスを辿って結果フィールドに値を入れたいのです。
そのプロセスとは、「タイトル列の値をサブタイトル列から検索し、該当のサブタイトルの著者を結果フィールドに反映する」というものです。
例えば、1行目のデータでいうと、「タイトル列の "光速ジグ入門" を サブタイトル列から検索し、ヒットした行の著者をとってくる(1行目の場合は、立山秀利となる)」
ということです。
つまり、エクセルでいうVlookupのようなことがしたいのです。

なんとなくこうかなと思って以下の関数をやってみました。
イメージ説明

すると、結果がこうなりました。
イメージ説明

どのような間違いをしてしまっているでしょうか?

初心者すぎて色々言葉が拙く申し訳ございません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2023/02/27 12:48

同一のサブタイトルで異なる著者の行が発生する場合があり、その場合は、最初の著者を「結果」に表示したい、ということで良いでしょうか?
m.ts10806

2023/02/27 21:45

タイトルはもう少し要件に寄せられたほうが良いと思います(本当に関数の使い方だけならリファレンス確認だけで済みます) あと最後の一文は不要です。要件と関係ない文言はなるべくないほうが読み手の負担が減ります
access

2023/02/28 01:03

YT0014さま はい、その通りです。
guest

回答3

0

「タイトル=サブタイトルの時、著者を結果フィールドに反映する」
という事なら、行内の参照のみで済みます。
クエリーのフィールド欄に新たな列として以下の式を投入して下さい。

結果:iif(タイトル=サブタイトル, 著者, Null)

iif関数

投稿2023/02/28 05:19

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2023/02/28 06:30

要求仕様が異なるそうです。 「質問へのコメント」欄をご確認ください。
sazi

2023/03/01 02:57

選択クエリーの結果から求めるなら、この回答で良いとは思うのですが、そもそもタイトルからサブタイトルを抽出するなら、元の選択クエリーの結合条件を見直すのが効率的ですね。 質問にその情報が無いので回答は出来ませんけれど。
guest

0

まず、DLookupの使い方は、hatena19様のご回答をご参照ください。

ただし、このクエリの場合、「クエリ1」の中で「クエリ1」を呼ぶことになるので、無限ループが発生しそうです。

その場合は「クエリ2」などの名前をつけて、結果列がないクエリを別に作成する必要があると思われます。
結果列を参照していないので、無限ループにはなりません。

速度改善が必要な場合は、結果列のないクエリを別に作成することをご検討ください。
結果列のDLookupは、結果列のないクエリを指定してください。

投稿2023/02/28 01:29

編集2023/02/28 01:58
YT0014

総合スコア1708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2023/02/28 01:46

DLookup内で結果列を参照していないので無限ループにはなりません。サンプルで確認してみましたが、エラーなく結果が表示されました。 ただし、クエリ1がレコード数分呼び出されることになるので処理が重くなるのは否めないですね。 ここはクエリ1の元になるテーブルを設定する方がいいでしょう。クエリ1でどのような処理をしているかにもよりますが。
YT0014

2023/02/28 02:01

ご指摘ありがとうございます。 質問文のDLookup()使用のクエリが正常に動作しているのですから、余計な指摘でした。 勝手ながら、速度改善の指針として、削除せずに残させていただきます。
guest

0

DLookupの第3引数はSQLの抽出条件(Where句)を文字列として設定するという仕様になります。

例えば1行目はサブタイトル='光速ジグ入門'という条件式になりますので、そのような文字列を返す式を第3引数に設定します。光速ジグ入門は各行で異なりますが、 [タイトル] で取得できます。

具体的には下記のような式でご希望の結果になるでしょう。

結果: DLookup("著者", "クエリ1", "サブタイトル='" & [タイトル] & "'" )

追記

どのような間違いをしてしまっているでしょうか?

タイトル=サブタイトルという条件式だと、例示のデータだと、すべてのレコードがTrueになります。
DLookupは条件式が最初にTrueになったレコードの値を返します。よって、先頭レコードの著者立山秀利が結果に表示されることになります。

投稿2023/02/27 12:44

編集2023/02/28 07:22
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問