アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
下記のコードは一度
教えて頂いたコードを
一部変更しました。
変更箇所は
NS = NS & " [顧客マスタ$] T LEFT JOIN [取引先$] S"
NS = NS & " ON T.取引先 = S.取引先$"

テーブルを結合しました。
実行すると指定された種別がSQLステートメントの
FROM句にある複数のテーブルを参照しました。
と表示されてしまいます。
わかる方おしえてくれませんでしょうか
よろしくお願いいたします。

Dim objCn As New ADODB.Connection
Dim objRS As ADODB.Recordset
Dim NS As String
Dim a() As String
Dim d As Long
Dim cnt As Long

With Me.ListBox3
For d = 0 To .ListCount - 1
If .Selected(d) Then
cnt = cnt + 1
ReDim Preserve a(1 To cnt)
a(cnt) = .List(d)
End If
Next
If cnt = 0 Then Exit Sub
End With


With objCn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Extended Properties") = "Excel 12.0"
.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name
End With
Cells.Clear
NS = " "
NS = NS & " SELECT"
NS = NS & " S.種別,T.年齢"
NS = NS & " FROM"
NS = NS & " [顧客マスタ$] T LEFT JOIN [取引先$] S"
NS = NS & " ON T.取引先 = S.取引先$"
NS = NS & " WHERE"
NS = NS & " 種別 IN ('" & Join(a, "' , '") & "')"
NS = NS & " AND"
NS = NS & " 日付2"
NS = NS & " BETWEEN #" & ListBox1.List(ListBox1.ListIndex) & "#"
NS = NS & " AND #" & ListBox2.List(ListBox2.ListIndex) & "#"


Set objRS = New ADODB.Recordset
Set objRS = objCn.Execute(NS)

With Worksheets("Sheet2")
.Range("A2:b10").ClearContents
.Range("A2").CopyFromRecordset objRS
For i = 0 To objRS.Fields.Count - 1
.Cells(1, i + 1).Value = objRS.Fields(i).Name
Next
End With

「SQL のエラー処理」の質問画像

質問者からの補足コメント

  • うーん・・・

    テーブル名をそえてもだめです。
    NS = NS & " SELECT"
    NS = NS & " 顧客マスタ.種別,取引先.年齢"
    NS = NS & " FROM"
    NS = NS & " [顧客マスタ$] LEFT JOIN [取引先$] "
    NS = NS & " ON 顧客マスタ.取引先コード = 取引先.取引先コード"
    NS = NS & " WHERE"
    NS = NS & " 顧客マスタ.種別 IN ('" & Join(a, "' , '") & "')"
    NS = NS & " AND"
    NS = NS & " 顧客マスタ.日付2"
    NS = NS & " BETWEEN #" & ListBox1.List(ListBox1.ListIndex) & "#"

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/01/12 22:52
  • " s.種別 IN ('" & Join(a, "' , '") & "')"と言うことでしょうか

      補足日時:2020/01/12 23:10

A 回答 (3件)

両方のテーブルに「種別」って列があるのでは?


それで「種別 IN (〜」の種別がどっちの「種別」か区別付かなくなっているのでは?
この回答への補足あり
    • good
    • 0
この回答へのお礼

s.種別 IN ('" & Join(a, "' , '") & "')"
ありがとうございました。

お礼日時:2020/01/13 07:48

> テーブル名をそえてもだめです。



エラー内容は同じですか?


 元が
S.種別,T.年齢
[顧客マスタ$] T LEFT JOIN [取引先$] S
 なのに
顧客マスタ.種別,取引先.年
[顧客マスタ$] LEFT JOIN [取引先$]
 になってます。
S→顧客マスタ T→取引先 と変換してますけど、どっちが意図したものなのですか?


 今、てもとにExcelが無いので確認できませんが
顧客マスタ.種別
 ではなく
[顧客マスタ$].種別
 だったりしませんか?
 あるいは、元々は S T と別名付けているのだから、そのまま S.種別 とかでいいのでは?
    • good
    • 0
この回答へのお礼

s.種別 IN ('" & Join(a, "' , '") & "')"
ありがとうございました。

お礼日時:2020/01/13 07:48

ちょっと書きなおします




「指定された種別がSQLステートメントのFROM句にある複数のテーブルを参照しました。」

とでるのは。

T ([顧客マスタ$]の別名) と S ([取引先$] の別名) の両方のテーブルの「種別」って列があって、
「種別 IN (〜」の「種別」が、 「S.種別」なのか 「T.種別」なのか 判断できなくなっているのでは?
それならば、解決策は、 「S.種別」なのか 「T.種別」なのかを明示することです。
※ 別名を付けているので「本来のテーブル名」は使えません。

どちらを指定するのが正しいかは、あなたしか知りません。
「選択したものを[取引先$]から探す」
「選択したものを[顧客マスタ$]から探す」
どちらのケースもありえるからです。


-----------------
> テーブル名をそえてもだめです。

補足のSQLでは、上記のS,Tが無くなっていています。
この場合、テーブル名での指定になります。
Excelのではどうか知りませんが、通常のSQLでは
 FROM [顧客マスタ$]
と指定したのなら、その列は
 [顧客マスタ$].種別
等と、FROMに記述された名前がそのまま使われます。
ところが、補足のプログラムでは
 顧客マスタ.種別
と「FROMで指定されていない名前」が使われています。

「テーブル名をそえてもだめ」なのは、「FROMで指定されていない名前」を使っているからではないだろうか?
それならば「存在しない項目を使っています」的なエラーメッセージになっているのでは?
そこを確認するために
「エラー内容は同じですか?」
とお尋ねした次第です。

実際、どうなのでしょうか?
    • good
    • 0
この回答へのお礼

s.種別 IN ('" & Join(a, "' , '") & "')"
ありがとうございました。

お礼日時:2020/01/13 07:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!