[[20230126151935]] 『Sqliteに接続しWHEREで取得→シートに反映したい』(SUP) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Sqliteに接続しWHEREで取得→シートに反映したい』(SUP)

お世話になります。
Sqliteに接続・取得についてです。
WHEREで直接取得したい文字を打てばできるのですが、ComboBox1と合わせてやるとオブジェクトが必要ですとデバックが出てしまいます。どう直せばいいでしょうか?
また、コードもネットででてきたものを手直ししたのでいまいちわかっていません。

Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
'Connection生成と接続文字列の設定
Set con = New ADODB.Connection
con.connectionString = "DRIVER=SQLite3 ODBC Driver;Database=C:\Users\my\Desktop\記録各種.db"

'sqliteに接続
con.Open
Dim sSql As String
'select文発行
'Set rs = con.Execute("SELECT * FROM 服薬記録 WHERE 薬='風邪薬'")
Set sSql = "SELECT * FROM 服薬記録 WHERE 薬='& ComboBox1 & ""')"

Set rs = con.Execute(sSql)
'結果をセルに書き込む
rs.MoveFirst
i = 2
Do Until rs.EOF = True
Sheets("服薬検索結果").Cells(i, 1).Value = rs.Fields(0).Value
Sheets("服薬検索結果").Cells(i, 2).Value = rs.Fields(1).Value
Sheets("服薬検索結果").Cells(i, 3).Value = rs.Fields(2).Value
Sheets("服薬検索結果").Cells(i, 4).Value = rs.Fields(3).Value
rs.MoveNext
i = i + 1
Loop

'接続を閉じる
con.Close
Set con = Nothing

< 使用 Excel:Excel2019、使用 OS:Windows11 >


 " が足りないですよ。 
(tkit) 2023/01/26(木) 15:40:23

Set sSql =

sSqlはString型変数なのでSet不要です。
Setを記述しているのでVBA側が右辺の文字列を「オブジェクトではない」とエラーを吐き出しています。
(お邪魔します) 2023/01/26(木) 15:47:57


ありがとうございます。
sSql = "SELECT * FROM 服薬記録 WHERE 薬='" & ComboBox1.Value & "')"""

として修正と"はSELECTの前でなく最後の')に"を色々変えてみたのですが、場所によってはコメントアウトしたり、「near ")" : syntax error (1)」が出てしまいます。
何が違うのかとSQL文の中の""の数の意味が知りたいです。

(SUP) 2023/01/26(木) 17:54:58


 sSql = "SELECT * FROM 服薬記録 WHERE 薬='" & ComboBox1.Value & "'"

  で、ComboBox1.Valueが「風邪薬」なら
 「SELECT * FROM 服薬記録 WHERE 薬='風邪薬'」ですね。

 余談。
 例えばクッソ長いSELECT文(当然クッソ遅いけど^^;)なんかは、
 予め別ファイルに書いておいて読み込んだりしますね。
 ほいで、WHERE条件の部分だけVBA側で変換して使う。(使える様に書いておく)

 Const SQL_01 = "SELECT * FROM 服薬記録 WHERE 薬='#WHERECONDITION#'"  '←実際はsqlファイルから読み込む
 sSql = Replace$(SQL_01, "#WHERECONDITION#",  ComboBox1.Value)

 ...みたいな。

 >SQL文の中の""の数の意味
【VBA】ダブルクォーテーションの文字列はChr(34)を使おう | やろまいCode
https://yaromai.jp/double-quotation-chr/

(白茶) 2023/01/26(木) 18:44:58


ありがとうございます。できました。
con.Execute(sSql)で()があるからsSql=の()はいらないってわけですね。

'#WHERECONDITION#'" 'の##で囲む(どういう指示ですか?)ことも初めて見ましたし、sqlファイルから読み込む(作ったこともなく)ってこともしたことなく。sql初心者には勉強しなくてはですね。

""の意味もありがとうございます。VBAでテーブル作成でカラム名を""で囲ったり囲わなかったり。。。でまだ使い分けがわかってないです。
(SUP) 2023/01/26(木) 22:14:35


 > ##で囲む(どういう指示ですか?)
 あ。
 特にその様な作法が定められている訳ではありません。
 私が勝手に付けてるだけです。

 もしSQL内に「WHERECONDITION」というテーブル名やカラム名が記述されていたら
 VBA側のReplace処理でその部分まで置き換わってしまいます。

 その予防措置として、SQL内で(普通は)使用しない(であろう)文字で囲ったんですね。
 なので別に「●」とかでも良かったと思いますよ。

(白茶) 2023/01/27(金) 08:57:42


ありがとうございます。
そうだったんですね。勉強になりました。
(SUP) 2023/01/27(金) 13:16:25

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.