Microsoft Access 掲示板

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

11 コメント
views
4 フォロー
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
通報 ...