2011-07-21 16 views
3

次のコードを実行しようとしていますが、DLookUpで「型の不一致」コンパイルエラーが発生しています。Access VBA:型不一致エラーを返すDLookUp関数

DLookUpは値を返しますか? このコードでは、strSQLレコードセットで、SKUS_ORDERED列がcurSKU2と等しい場所を探します。 strSQL、temp、curSKU2はすべて文字列型変数として初期化されます。

... 
strSQL = "SELECT * FROM ORDER_DATA WHERE [ORDER]=" & curOrder 

Dim temp As String 
temp = DLookup("SKUS_ORDERED", db.OpenRecordset(strSQL), SKUS_ORDERED = curSKU2) 
... 

タイプミスマッチはどこですか? 誰か助けてくれますか?

EDIT:

 ... 
     Set fld_orders = rst_orders.Fields("ORDER") 
     curOrder = fld_orders.Value 

     Dim temp As String 
     temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder) 

     If temp <> Null Then MsgBox temp 
     ... 

全体のコードはかなり長いですが、ここでcurOrderが初期化されているところの大きな抜粋だが、これは、ネストされたループ内で、curSKU2は、ループの外に早く初期化されています。それが役に立てば幸い。

答えて

5

第2パラメータがRecordSetではなく文字列である必要があるため、不一致が発生します。
三番目の引数のパラメータのいずれかが(あなたのケースのように)可変である場合、3番目の引数は同様に連結された文字列である必要がある:

temp = DLookup("SKUS_ORDERED", "ORDER_DATA", _ 
      "SKUS_ORDERED = '" & curSKU2 & "' and ORDER = " & curOrder) 

EDIT:

コードがなくても、Nullを使用している場所を確認することは困難です。
テーブル名と列名は正しいですか?
どのようなタイプの変数ですか?彼らは本当に価値がありますか?
変数を宣言して入力する方法を見ることができるコードをいくつか追加できますか?

"_"は改行を示します。私は1行で全体の文を記述することができたが、その後、あなたが完全にそれを見るためにスクロールする必要があるだろう:

temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' and ORDER = " & curOrder) 

EDIT 2:

あなたは両方の部分を示すことができました変数が宣言され、curSKU2も初期化されますか?あなたが投稿したものでは、curSKU2がいっぱいになっているかどうか、そしてどちらのタイプがどちらであるかは分かりません。

さらに、tempは文字列として宣言されているため、決してNULLになることはありません。
これは、2つの結果があります。

  1. If temp <> Nullは意味がありませんが。
  2. DLookupは、レコードが見つからないときにNullを返します。したがって、型の不一致が行temp = DLookup(...)にある可能性があります。
    代わりにtemp = Nz(DLookup(...))を試してください。
+0

私はこれを試しましたが、今は "NULLの無効な使用"を取得しています、どこでnullを使用していますか? – Shubham

+0

なぜ "ORDER_DATA"の後に "_"文字があるのですか?それは何をするためのものか? – Shubham

+0

私は私の答えを編集しました、上記を参照してください! –

2

コードのこのセクションを変更することをお勧めします...これに

Dim temp As String 
temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder) 

...

Dim temp As String 
Dim strCriteria As String 
strCriteria = "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder 
Debug.Print strCriteria 
Debug.Print TypeName(DLookup("SKUS_ORDERED", "ORDER_DATA", strCriteria)) 
temp = DLookup("SKUS_ORDERED", "ORDER_DATA", strCriteria) 

エラーが表示された場合は、のDebug.Printステートメントからの出力を表示するために、イミディエイトウィンドウに切り替えます。

最初は、新しいクエリでテストすることができますWHERE条件のために、あなたにテキストを与える:

SELECT SKUS_ORDERED FROM ORDER_DATA WHERE [strCriteria text here] 

型名()関数は、あなたのDLookup(で返される値のデータ型を教えてくれます) 。 TypeNameがNullと表示された場合、文字列値をNullにすることはできないため、文字列変数(temp)に代入しようとするとエラーが発生します。

+0

助けてくれてありがとう、これはあまりにも機能します! – Shubham