帳票フォームに非連結のコンボボックスを設置して、その選択した値によって帳票フォームのソースを抽出表示したいという事がある。
今回は、VBAコードでSQLを使って抽出しているのですが、「’」「”」「&」の使い方が今一つ分からず色々とやった結果を備忘録としてまとめておこうと思います。
コンボボックス1個でレコードソースを抽出
これはなんとなくすぐにできました。
Public Sub 抽出ボタン_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset On Error GoTo Err_Handler Set cn = CurrentProject.AccessConnection Set rs = New ADODB.Recordset With rs Set .ActiveConnection = cn .Source = "SELECT * FROM orderdata_sorting_nsys WHERE shipper ='" & Me!search_mado & "'" .LockType = adLockOptimistic .CursorType = adOpenKeyset .Open End With Set Me.Recordset = rs rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing ExitErr_Handler: Exit Sub Err_Handler: MsgBox "エラー: " & Err.description rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
つまり、SQLで抽出している部分が下記の部分になるわけだが1個だけなら「’」「”」「&」の使い方は下記のような法則で記述すればいいようです。
.Source = "SELECT * FROM orderdata_sorting_nsys WHERE shipper ='" & Me!search_mado & "'"
コンボボックス2個でAND抽出
2個になると一気に難易度があがりエラーが出たり思ったデータが抽出されなかったりと大変な事になりました。
様々なパターンの「’」「”」「&」を試してようやく抽出できるようになったコードが下記のようになります。
.Source = "SELECT * FROM orderdata_sorting_nsys WHERE shipper ='" & Me!search_mado & "' And delivery_name = '" & Me!delivery_mado & "'"
VBAコード内でSQLを使う場合は、
「”」SELECT * FROM table_name WHERE field1 =「’」「”」「&」combo1「&」「”」「’」And field2 =「’」「”」「&」combo2「&」「”」「’」「”」
と言うふうになるようです。
なにかと忘れた頃に使うので備忘録にしたいと思います。
更に日付範囲の抽出をAND
更に、日付範囲にて、抽出したい場合はどうしたらいいでしょうか!?
これも色々と試した結果下記のようになりました。
.Source = "SELECT * FROM orderdata_sorting_nsys WHERE shipper ='" & Me!search_mado & "' And delivery_name = '" & Me!delivery_mado & "' And pu_date Between #" & Me!pu_start & "# AND #" & Me!pu_end & "#" '"
未だに「’」「”」「&」の使い方が曖昧ですが、何とかできるようになったので、なんとなくこんな感じの組み合わせでANDもできるんだなって思えておけば何とかなりますね。