器用貧乏の独り言

器用貧乏なおっさんが気の向くままに。

【VBA】ダブルクォーテーションを含んだSQL文を変数に格納する方法


皆さんこんにちは。
今日は少々マニアックな内容になります。

ダブルクォーテーションとは、VBAで文字列を扱う際によく使う記号です。

“ ←こんな記号です。

SQL文にも、このダブルクォーテーションが登場することがあります。

VBASQLを扱う際、SQL文を一旦文字列型の変数に格納することがよくあります。

こんなイメージです。
※オブジェクト定義等 小難しい話は一旦省略します。

Dim strSQL As String
strSQL = "SELECT * FROM Table_Name"
​DoCmd.RunSQL(strSQL)

このくらい短いSQL文なら良いのですが、長いSQL文の場合は、変数に格納した方が見た目がきれいに収まります。

さて、ここからが本題です。

SQL文の中にダブルクォーテーションが登場するとどうなるでしょうか。

例としてこんなケースを取り上げたいと思います。

元データが入っているテーブルが、こんな感じだったとします。
※テーブル名は「Table1」ということにしましょう。

クエリを実行して、「連番」と「文字」のフィールドを結合させます。
実行結果はこんな感じになります。

このクエリのSQL文はこんな感じになります。

SELECT [連番] & "_" & [文字] 
AS [連番+文字],データ1 ,データ2 
FROM Table1

VBAでこのSQLを実行させるとして、変数にこのままSQL文を格納するとエラーが出ます。
SQL文中のダブルクォーテーションが悪さをするんですね。

このエラーを避けるためには、こんな感じの記述になります。

Dim strSQL As String
strSQL = "SELECT [連番] " & Chr(34) & "_" & Chr(34) & "[文字] " & _
"AS [連番+文字],データ1 ,データ2 " & _
       "FROM Table1"
DoCmd.RunSQL(strSQL)

「""で囲まれた文字を文字列として扱う」

というルールなので、「""」自体を文字列として扱うためには一工夫必要になります。

このコードの場合、

Chr(34) = “

として扱われます。

もう一つの記述方法としてこんな書き方もあります。

Dim strSQL As String
strSQL = "SELECT [連番] “ & """"& "_" & """" & "[文字] " & _
"AS [連番+文字],データ1 ,データ2 " & _
       "FROM Table1"
DoCmd.RunSQL(strSQL)

「""」を「""」で囲むと「"」として扱われます。

↑「何言ってんだ?」って感じですよね。

どちらも動作としては全く同じ動きをしますので、お好みの方で記述すればOKです。
私は、Chr(34)の方が好みです。

SQLに関わらず、VBAで文字列を扱う場合はダブルクォーテーションの扱いには注意が必要です。

VBAユーザーにとっては、知っておいて損のない知識だと思います。

少々小難しい内容になりましたが、誰かの役に立つと嬉しいです。