Microsoft Access 掲示板

サブクエリをVBAで実行したい

11 コメント
views
4 フォロー

地域 ID 収入
東京 1 100
東京 2 50
東京 3 50
東京 4 60
大阪 1 120
大阪 2 80
大阪 3 20
札幌 1 90
札幌 2 70
札幌 3 60
札幌 4 50

↑ MT_testの内容です。

SELECT * FROM テーブル1
WHERE 地域 IN
(
SELECT 地域 FROM テーブル1
WHERE ( ID = 1 And 収入 >= 100 )
OR ( ID = 2 And 収入 >= 60 )
OR ( ID = 3 And 収入 >= 20 )
GROUP BY 地域
HAVING Count(1) = 3
);

地域⇒文字型
ID、収入⇒数値型

これをVBAで実行できるのでしょか?
NETで調べてもそれらしいコードを見つけれなく困っています。

お手数ですが、ご教示していただけないでしょうか?

naonao
作成: 2020/07/14 (火) 18:28:30
通報 ...
1

できますよ。
サブクエリを含むSQLでも、SQLに変わりはないので、普通にレコードセットとして開けます。

Dim strSQL As String
strSQL = "サブクエリを含むSQL"

Dim rs As DAO.RecordSet
Set rs = CurrentDB.OpenRecordset(strSQL)
2
naonao 2020/07/17 (金) 09:24:43 09c37@96514

hatena様

返信遅くなりました。回答ありがとうございます。
strSQL = "サブクエリを含むSQL"

””の中にSQL文を記載したのですが、書き方が悪いのか実行できません。

また、( など、どのように記載するのか分かりません。

本当に図々しいお願いですが、このコードをどのように記載するのか、
お手本を見せていただけないしょうか?

3
hatena 2020/07/17 (金) 20:59:16 修正

最初の質問のSQLでうまくいかないということですか?

そのSQLをクエリのSQLビューに記述して開いた場合は、希望の結果が表示されますか。

本当に図々しいお願いですが、このコードをどのように記載するのか、
お手本を見せていただけないしょうか?

というか、現状のうまくいかないコードを先に提示してください。

4
naonao 2020/07/21 (火) 09:20:35 09c37@96514

hatena様 

遅くなりました。

Dim strSQL As String
strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1"
WHERE (ID = 1 And 収入 >= 100)

Or (ID = 2 And 収入 >= 60) _
Or (ID = 3 And 収入 >= 20)
GROUP BY 地域
HAVING Count(1) = 3
);"

自分なりに調べましたが、ここまでが限界でした。
申し訳ありません。

5
hiroton 2020/07/21 (火) 10:42:18 29d86@f966d

それでやってみて「どううまくいかない」んですか?
そっくりそのままやろうとするとコードに記述した時点でエラーメッセージが出ると思いますが

VBAは基本1行1命令の言語で、改行は命令の終わりという特別な文字です。SQLのようにただの文字の区切りというわけではないので、改行を消して1行で記述するか、それなりの対処が必要です

方法: コード内でステートメントを分割および連結する (Visual Basic)

6
naonao 2020/07/23 (木) 12:29:04 09c37@96514

返信遅くなりました。

VBAの文字のコードが赤くなり、正しく記載できていない状態です。
この ")"の記載方法がわからなくて困っています。

記載いただいたURL参考にしてみます

7

hirotonさんの提示したリンク先にも方法が解説してありますが、
 方法: コード内でステートメントを分割および連結する - Visual Basic

分かりにくい場合は、下記も参考にしてみてください。

ソースコードが長い時に途中で改行する方法[エクセルVBA]

8
kitasue 2020/07/23 (木) 18:07:07 ce705@e9d43

    Dim strSQL As String
    strSQL = ""
    strSQL = strSQL & "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1" & vbNewLine
    strSQL = strSQL & "WHERE (ID = 1 And 収入 >= 100)" & vbNewLine
    strSQL = strSQL & "Or (ID = 2 And 収入 >= 60)" & vbNewLine
    strSQL = strSQL & "Or (ID = 3 And 収入 >= 20)" & vbNewLine
    strSQL = strSQL & "GROUP BY 地域" & vbNewLine
    strSQL = strSQL & "HAVING Count(1) = 3" & vbNewLine
    strSQL = strSQL & ");"
でいかがでしょうか。

9

あるいは、

Dim strSQL As String
strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1 " _
       & "WHERE (ID = 1 And 収入 >= 100) " _
       & "Or (ID = 2 And 収入 >= 60) " _
       & "Or (ID = 3 And 収入 >= 20) " _
       & "GROUP BY 地域 " _
       & "HAVING Count(1) = 3" _
       & ");"

とか。

10
hiroton 2020/07/27 (月) 11:41:21 ad4d5@f966d

回答はお二人提示されている通りですので、基本的なところをすこし

自分の載せたリンクは回答の裏付けのためで、そこで勉強してほしいという意図はほぼありません。質問の要点も分からない状態だったし

最初に記載した通りですが、VBAでは改行(Enterキーを押して入力される画面に見えないモノ)は特別な意味を持ちます。文字列はダブルクオーテーション(「"」)で囲みましょうというルールがありますが、この改行を超えて「改行を改行文字として文字列に含めること」はできません。

ではどうするかというと、今回のようにSQLとして扱う文字列であれば、改行は別に改行でなくともいいので半角スペースに置き換えてVBAの命令文1行で済ませてしまうというのが一番単純です。

strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1 WHERE (ID = 1 And 収入 >= 100) Or (ID = 2 And 収入 >= 60) Or (ID = 3 And 収入 >= 20) GROUP BY 地域 HAVING Count(1) = 3);"

最初のhatenaさんの回答(>> 1)の通りですね。

では、テキストとして改行を入れたい場合どうしたらいいかというと、改行として認識される文字コードを埋め込むという手法をとります。具体的にはkitasueさんが提示されている通り、vbNewLineをテキストの改行したい場所に文字列として連結してあげればいいです。文字列を連結する場合はお互いを「 & 」で繋げます

strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1" & vbNewLine & "WHERE (ID = 1 And 収入 >= 100)" & vbNewLine & "Or (ID = 2 And 収入 >= 60)" & vbNewLine & " Or (ID = 3 And 収入 >= 20)" & vbNewLine & " GROUP BY 地域 " & vbNewLine & "HAVING Count(1) = 3" & vbNewLine & ");"

最初の1行の表示からそうですが長いですね。こうなってくるとVBAコード上の見栄えの問題からコード上で改行を使ってどうにかできないかと考えることになります。

ちなみに、個人的にはアンダースコアを使った方法はいろいろと厄介なのでオススメしません。


ついでにたまに自分がやる手法でも

Sub main()
    Dim strSQL As String
    
    addLine strSQL, "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1"
    addLine strSQL, "WHERE (ID = 1 And 収入 >= 100)"
    addLine strSQL, "Or (ID = 2 And 収入 >= 60)"
    addLine strSQL, "Or (ID = 3 And 収入 >= 20)"
    addLine strSQL, "GROUP BY 地域"
    addLine strSQL, "HAVING Count(1) = 3"
    addLine strSQL, ");"
    
    MsgBox strSQL
End Sub

Sub addLine(str As String, addStr As String)
    str = str & vbNewLine & addStr
End Sub
11
名前なし 2020/09/03 (木) 11:36:14 09c37@96514

ご回答いただきましてありがとうございました。
返信がおくれて大変申し分けありませんでした。
本当に感謝します。
ありがとうございました。