Microsoft Access 掲示板

サブフォームでのDlookup「型が一致しません」の対処方法について

7 コメント
views
4 フォロー

初めまして。
ご教授の程、よろしくお願い申し上げます。

win10;access2016使用

メインフォームにレコードソース;T仕入情報
サブフォームにレコードソース;T仕入明細を使用しています。
T仕入情報には、
仕入先ID(オートナンバー型)
T仕入明細には、
商品分類ID(オートナンバー型)
仕入大分類ID(オートナンバー型)
仕入中分類ID(オートナンバー型)
仕入商品ID(オートナンバー型)
入数(数値型;整数)
仕入単価(通貨型)
があります。
また、サブフォームのT仕入明細の値集合ソースには、
仕入先ID各社の仕入商品テーブルをユニオンクエリした「UQ仕入商品一覧」を利用しようと考えております。
仕入商品テーブルはいずれも、
仕入先ID(オートナンバー型)
仕入商品ID(オートナンバー型)
商品分類ID(オートナンバー型)
仕入大分類ID(オートナンバー型)
仕入中分類ID(オートナンバー型)
仕入商品名(短いテキスト)
入数(数値型;整数)
仕入単価(通貨型)です。

入数と仕入単価は常に一定のものと、そうではなく日常的に変化が伴うものが混合するため、値の代入を利用したく、
順番としては、
1・メインフォームの仕入先ID;コンボボックス(イベント更新後処理でサブフォームを再クエリ)
2・仕入先ID(コンボボックス)選択。(イベント更新後処理で商品分類IDを再クエリ)
3・商品分類ID(コンボボックス)選択。(イベント更新後処理で仕入大分類ID再クエリ)
3・仕入大分類ID(コンボボックス)選択。(イベント更新後処理で仕入中分類ID再クエリ)
4・仕入中分類ID(コンボボックス)選択。(イベント更新後処理で仕入商品ID再クエリ)
5・仕入商品ID(コンボボックス)選択。(イベント更新後処理で仕入先IDと仕入商品IDから入数と仕入単価の値の代入)
6・数量(テキストボックス)入力
7・入数(テキストボックス)
8・仕入単価(テキストボックス)

以上です。
1~4までは問題なくできたのですが、5がどのようにしても出来ません。
色々と調べましたが、まだ知識が足りず、解決できずにおります。

仕入先ID(オートナンバー型)と仕入商品ID(オートナンバー型)の組み合わせであれば重複することはないので、抽出できると考えたのですが、ユニオンクエリを使用するのが間違いなのでしょうか。

どなたかご教授よろしくお願い申し上げます。画像1
画像2

AFA
作成: 2022/04/28 (木) 19:28:40
最終更新: 2022/04/28 (木) 19:30:06
通報 ...
1

投稿者です。
あまりにも拙い説明で、非常に分かりにくいかと存じます。
明日改めて、各種画像を添付致しますので、何卒、ご教授のほど、よろしくお願い申し上げます。

2
りんご 2022/04/29 (金) 01:44:26 c564b@0e907

 DLookup、正直苦手なのでしっかり回答出来ないのですが、追加情報があればいいかもと。
 抽出条件無しでの動作確認、単独条件での動作確認、パラメータの代わりに適当な値を入れて動作確認はどうでしたか?パラメータの参照は想定通り?(仕入商品IDが何処を参照する事になるのか誰か解説して欲しい。)
 念の為、コンボボックスについても確認です。仕入先IDや仕入商品IDですが、1列目ならば連結列は1、2列目ならば連結列は2となっていますか?
 念の為、仕入先IDや仕入商品IDについても確認です。オートナンバー型との事ですか、0001、0002、0003みたいな感じではないですよね?実はNULLもあったり、なんてことはないですよね?

4

りんご 様

お忙しい中大変ご丁寧にありがとうございました。

>抽出条件無しでの動作確認、単独条件での動作確認、パラメータの代わりに適当な値を入れて動作確認はどうでしたか?

抽出条件無での動作確認は問題ございませんでした。
また、単独条件での動作確認ですが、仕入商品ID(オートナンバー型)を単独条件としたところ、本来導き出したい数値とは異なるものが代入されました。
わたくしの勝手な推測なのですが、仕入商品ID(オートナンバー型)は仕入先ID各社の仕入商品テーブルがあり、仕入商品ID(オートナンバー型)が重複するため、別のものを代入しているのではないかと考えます。
パラメータの代わりにダイレクトに仕入先IDを3仕入商品IDを3として動作してみたところ、
いずれも「エラー13 型が一致しません」となりました。
わたくしの式の書き方が悪いことが原因と思います。(恥ずかしながら、調べながら利用している素人です)
下記3通り試しました。
入数 = DLookup(入数, "UQ仕入商品一覧", "仕入先ID =  3" And "[仕入商品ID] =  3")
入数 = DLookup(入数, "UQ仕入商品一覧", "[仕入先ID] =  3" And "[仕入商品ID] =  3")
入数 = DLookup(入数, "UQ仕入商品一覧", "Forms![F仕入入力]!仕入先ID =  3" And "[仕入商品ID] =  3")

>念の為、コンボボックスについても確認です。仕入先IDや仕入商品IDですが、1列目ならば連結列は1、2列目ならば連結列は2となっていますか?

プロパティシートにて連結列確認いたしました。
連結列はコンボボックスすべてにおいて「1」でした。

>念の為、仕入先IDや仕入商品IDについても確認です。オートナンバー型との事ですか、0001、0002、0003みたいな感じではないですよね?実はNULLもあったり、なんてことはないですよね?

仕入先IDと仕入商品IDは頭に0等は入らず全て整数の「1.2.3…」となっております。
またNULLはございません。
全てのIDには必ず整数が入るようにしております。

hatena様から教えていただきました通りに変更したところ、入数には正しい数値が代入されました。

3

とりあえずエラーの行を下記のように変更してみてください。

入数 = DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & Forms![F仕入入力]![仕入先ID] & " And 仕入商品ID = " & [仕入商品ID])
5
AFA 2022/04/29 (金) 15:46:11 修正 9c318@fac4f >> 3

hatena 様

お忙しい中大変ご丁寧にありがとうございました。

お教え下さった通りに変更しましたところ、
無事、成功しました。
お教えくださった内容をもとに、何が間違えていたのかを調べました。
正解か分かりかねますが、変数を扱いたいにもかかわらず、お教え下さった下記のように
入数 = DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & Forms![F仕入入力]![仕入先ID] & " And 仕入商品ID = " & [仕入商品ID])

「"入数"」と「" & Forms![F仕入入力]![仕入先ID] & " 」としていなかったことについて調べました。

「"入数"」については「"」を付けなくてもよいという記述もあり、まだ理解できておりません。
継続して調べてまいります。
「" & Forms![F仕入入力]![仕入先ID] & " 」については、変数を扱うにおいては「"&変数&"」としなければならないとの結論に至りました。(正解か不明ですが…)

色々と調べていたものの、一週間ほど悩んでおりましたので、解決して一安心しております。
本当に有難うございました。

6

まずは公式のヘルプで確認しましょう。

Application.DLookup メソッド (Access) | Microsoft Docs

これによると引数はすべて文字列で指定することが分かります。

>「"入数"」については「"」を付けなくてもよいという記述もあり、まだ理解できておりません。

どこで調べたか分かりませんが、それはあきらかに間違いですね。

第3引数は、抽出条件式を文字列として指定します。
具体的にはクエリのSQL文のWhere句に設定する条件式になります。
例えば 仕入先IDが 1、仕入商品IDが 2 のものを抽出するとき、SQLでは下記のようになります。
(SQLが分からなければ、デザインビューで条件を設定してからSQLビューにすれば確認できます。)

SELECT 入数 FROM UQ仕入商品一覧
WHERE 仕入先ID = 1 And 仕入商品ID = 2;

これをDLookupに変換すると、下記のようになります。

DLookup("入数", "UQ仕入商品一覧", "仕入先ID = 1 And 仕入商品ID = 2")

1 と 2 の部分は固定値ではなく、フォームのテキストボックスの値を参照することになるので、文字列の外に出して、

DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & 1 & " And 仕入商品ID = " & 2)

この固定値の部分をコントロール参照式に変更します。

DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & Forms![F仕入入力]![仕入先ID] & " And 仕入商品ID = " & [仕入商品ID])

ここで注意することは、DLookup関数の第3引数に設定するのはSQLの条件式ということです。
SQLとVBAは似ていますが、まったく別のものだということを意識してください。

VBAとSQLでも文字列の扱いの違いは、下記で詳しく解説していますので、ご参考に。

Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips

7

hatena 様

>まずは公式のヘルプで確認しましょう。
これによると引数はすべて文字列で指定することが分かります。

ありがとうございます。
文字列式とありました。
今後は公式のヘルプを何度も読み直し、しっかりと確認いたします。

>どこで調べたか分かりませんが、それはあきらかに間違いですね。

今回のエラーに関して様々な質問板等を見ているときに、DLookup (Expr, Domain, Criteria)ではExprの部分は""で囲まなくてOKです!と書いてあったので、お恥ずかしくも鵜吞みにしておりました。。。

また、きめ細やかなご解説本当に有難うございます。
リンクまで貼って下さり有難うございます。
拝見しました。
素人のわたくしにも理解できるように、詳しくご解説してくださっているので、
とても分かりやすく、勉強になりました。

重ね重ね御礼申し上げます。