地域 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で調べてもそれらしいコードを見つけれなく困っています。
お手数ですが、ご教示していただけないでしょうか?
できますよ。
サブクエリを含むSQLでも、SQLに変わりはないので、普通にレコードセットとして開けます。
hatena様
返信遅くなりました。回答ありがとうございます。
strSQL = "サブクエリを含むSQL"
””の中にSQL文を記載したのですが、書き方が悪いのか実行できません。
また、( など、どのように記載するのか分かりません。
本当に図々しいお願いですが、このコードをどのように記載するのか、
お手本を見せていただけないしょうか?
最初の質問のSQLでうまくいかないということですか?
そのSQLをクエリのSQLビューに記述して開いた場合は、希望の結果が表示されますか。
というか、現状のうまくいかないコードを先に提示してください。
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
);"
自分なりに調べましたが、ここまでが限界でした。
申し訳ありません。
それでやってみて「どううまくいかない」んですか?
そっくりそのままやろうとするとコードに記述した時点でエラーメッセージが出ると思いますが
VBAは基本1行1命令の言語で、改行は命令の終わりという特別な文字です。SQLのようにただの文字の区切りというわけではないので、改行を消して1行で記述するか、それなりの対処が必要です
方法: コード内でステートメントを分割および連結する (Visual Basic)
返信遅くなりました。
VBAの文字のコードが赤くなり、正しく記載できていない状態です。
この ")"の記載方法がわからなくて困っています。
記載いただいたURL参考にしてみます
hirotonさんの提示したリンク先にも方法が解説してありますが、
方法: コード内でステートメントを分割および連結する - Visual Basic
分かりにくい場合は、下記も参考にしてみてください。
ソースコードが長い時に途中で改行する方法[エクセルVBA]
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 & ");"
でいかがでしょうか。
あるいは、
とか。
回答はお二人提示されている通りですので、基本的なところをすこし
自分の載せたリンクは回答の裏付けのためで、そこで勉強してほしいという意図はほぼありません。質問の要点も分からない状態だったし
最初に記載した通りですが、VBAでは改行(Enterキーを押して入力される画面に見えないモノ)は特別な意味を持ちます。文字列はダブルクオーテーション(「
"
」)で囲みましょうというルールがありますが、この改行を超えて「改行を改行文字として文字列に含めること」はできません。ではどうするかというと、今回のようにSQLとして扱う文字列であれば、改行は別に改行でなくともいいので半角スペースに置き換えてVBAの命令文1行で済ませてしまうというのが一番単純です。
最初のhatenaさんの回答(>> 1)の通りですね。
では、テキストとして改行を入れたい場合どうしたらいいかというと、改行として認識される文字コードを埋め込むという手法をとります。具体的にはkitasueさんが提示されている通り、vbNewLineをテキストの改行したい場所に文字列として連結してあげればいいです。文字列を連結する場合はお互いを「 & 」で繋げます。
最初の1行の表示からそうですが長いですね。こうなってくるとVBAコード上の見栄えの問題からコード上で改行を使ってどうにかできないかと考えることになります。
ちなみに、個人的にはアンダースコアを使った方法はいろいろと厄介なのでオススメしません。
ついでにたまに自分がやる手法でも
ご回答いただきましてありがとうございました。
返信がおくれて大変申し分けありませんでした。
本当に感謝します。
ありがとうございました。