VBA非連結テキストボックスからの検索方法

このQ&Aのポイント
  • VBAを使用して、非連結テキストボックスからの検索方法を教えてください。
  • Windows7Pro(32Bit)、Access2010、MySQL5.6 Windows版の環境で検索フォームの非連結テキストボックスからの検索について教えてください。
  • 顧客ID、顧客名、顧客カナ、電話番号を使用して、複数の条件での検索方法を教えてください。
回答を見る
  • ベストアンサー

VBA 非連結テキストボックスからの検索

検索用フォームのテキストボックスからの検索についてご教授ください。 OS:Windows7Pro(32Bit) Ver:Access2010 DB:MySQL5.6 Windows版 ◎検索フォームの非連結テキストボックス txt顧客ID txt顧客カナ(先頭一致) 上記いずれかで、検索したい場合のSQL文の書き方。 ソース Private Sub cmd検索_Click() '顧客情報検索 'Mysql接続変数定義 Dim con As New ADODB.Connection Dim rs As ADODB.Recordset Dim stSQL As String 'DB接続 con.Open "Driver={mySQL ODBC 5.3 Unicode Driver}; Server=localhost; Database=jinq; Uid=jinq_a; Pwd=jinqadmin; " On Error GoTo Err 'SQL文 stSQL = "SELECT * FROM t_kokyaku" stSQL = stSQL & " WHERE(CusID =" & Me!txt顧客ID & ")" stSQL = stSQL & " OR(kana Like ’" & Me!txtお客様カナ & "'%);" Debug.Print "SQL: [" & stSQL & "]" 'SQL文実行&レコードセット代入 Set rs = con.Execute(stSQL) 上記のプロジージャーを実行した結果、当然ですが、エラーとなります。 stSQL:SELECT * FROM t_kokyaku WHERE(CusID =) or(Kana Like 'txt顧客カナ%'); [MySQL][ODBC 5.3(w) Driver][mysqld-5.6.22-enterprise-commercial-advanced-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') OR(kana Like 'txt顧客カナ%')' at line 1 複数のテキストボックスの値で検索する場合、どういった書き方をすればよいのでしょうか? 最終的には、顧客ID、顧客名、顧客カナ、電話番号でいずれかの条件で検索できればと考えています。 アドバイス頂けましたら、幸いです。

  • MySQL
  • 回答数4
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

コードの順序として、 '顧客情報検索 'Mysql接続変数定義 Dim con As New ADODB.Connection Dim rs As ADODB.Recordset Dim stSQL As String 'SQL文 If Not IsNull(Me!txt顧客ID) And Not IsNull(Me!txt顧客カナ) Then stSQL = "SELECT * FROM t_kokyaku" stSQL = stSQL & " WHERE (CusID =" & Me!txt顧客ID & ")" stSQL = stSQL & " OR (顧客カナ Like '" & Me!txt顧客カナ & "%');" End If If Not IsNull(Me!txt顧客ID) And IsNull(Me!txt顧客カナ) Then stSQL = "SELECT * FROM t_kokyaku" stSQL = stSQL & " WHERE (CusID =" & Me!txt顧客ID & ");" End If If IsNull(Me!txt顧客ID) And Not IsNull(Me!txt顧客カナ) Then stSQL = "SELECT * FROM t_kokyaku" stSQL = stSQL & " WHERE (顧客カナ Like '" & Me!txt顧客カナ & "%');" End If If IsNull(Me!txt顧客ID) And IsNull(Me!txt顧客カナ) Then MsgBox "検索できません" Exit Sub End If Debug.Print "SQL: [" & stSQL & "]" 'DB接続 con.Open "Driver={mySQL ODBC 5.3 Unicode Driver}; Server=localhost; Database=jinq; Uid=jinq_a; Pwd=jinqadmin; " 'SQL文実行&レコードセット代入 Set rs = con.Execute(stSQL) のようにするほうが、いろいろとベターでは、と思います。 MySQLに接続する前に Exit Sub を実行することもありますから。

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

書き方はいろいろですが、ベタに書けば、 'SQL文 のところを、 'SQL文 If Not IsNull(Me!txt顧客ID) And Not IsNull(Me!txt顧客カナ) Then stSQL = "SELECT * FROM t_kokyaku" stSQL = stSQL & " WHERE (CusID =" & Me!txt顧客ID & ")" stSQL = stSQL & " OR (顧客カナ Like '" & Me!txt顧客カナ & "%');" End If If Not IsNull(Me!txt顧客ID) And IsNull(Me!txt顧客カナ) Then stSQL = "SELECT * FROM t_kokyaku" stSQL = stSQL & " WHERE (CusID =" & Me!txt顧客ID & ");" End If If IsNull(Me!txt顧客ID) And Not IsNull(Me!txt顧客カナ) Then stSQL = "SELECT * FROM t_kokyaku" stSQL = stSQL & " WHERE (顧客カナ Like '" & Me!txt顧客カナ & "%');" End If If IsNull(Me!txt顧客ID) And IsNull(Me!txt顧客カナ) Then MsgBox "検索できません" Exit Sub End If Debug.Print "SQL: [" & stSQL & "]" 'SQL文実行&レコードセット代入 Set rs = con.Execute(stSQL) のような感じ。

sujino
質問者

お礼

piroin654様 なんども、回答いただき有難うございます。 やっぱり、個別にIF文を書かないといけないのですね、今回はわかりやすくするため、顧客IDと顧客カナのみですが、理想としてはもっと条件を増やしたいので、その際非常に複雑になると思い質問させていただきました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

エラー内容は、 erver version for the right syntax to use near ') OR(kana Like 'txt顧客カナ%')' at line 1 ですけど? >今のコーディングでは、顧客ID(CusID)がNullでは抽出できないのでは? >と考えてます。 Accessの側のデータがNullなのか、MySQLの側がNull(0)の場合なのか どちらなのでしょうか。 こういうことなのか、 stSQL = stSQL & " WHERE (CusID =" & Me!txt顧客ID & " OR NULL)" または、 stSQL = stSQL & " WHERE (CusID =" & Nz(Me!txt顧客ID, 0) & ")"

sujino
質問者

補足

piroin654様 何度もアドバイス頂き、有難うございます。 私の質問の仕方が悪いのだと思いますが、具体的には 顧客IDと顧客カナの非連結テキストボックスがあります。 で、テキストボックスの内容がNullの場合は、検索条件に加えない。 txt顧客IDがNullなら、Where 顧客カナ LIKE txt顧客カナ% txt顧客IDが空欄でなければ、Where 顧客ID = txt顧客ID txt顧客ID・txt顧客カナ 両方とも空欄でなければ、Where 顧客ID = txt顧客iID OR 顧客カナ LIKE txt顧客カナ% なるのではと、初心者の浅知恵では考えております。 その為、IFで各テキストボックスの状態を確認して、抽出条件文を作成しないといけないと思いますが、簡潔にコーディングする方法があれば、お教えください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

「%」の位置が、 tSQL = stSQL & " OR(kana Like ’" & Me!txtお客様カナ & "'%);" ではなく、 stSQL = stSQL & " OR(kana Like '" & Me!txtお客様カナ & "%');" のように、「'」の内側にいれるのでは? それと、   Like ’" & のように、Likeの後ろの「'」が全角になっています。

sujino
質問者

お礼

piroin654様 回答有難うございます。 >tSQL = stSQL & " OR(kana Like ’" & Me!txtお客様カナ & "'%);" すいません単純に打ち間違いです。 私が知りたいのは、複数条件の検索時の書き方についてです。 今のコーディングでは、顧客ID(CusID)がNullでは抽出できないのでは? と考えてます。 いずれかの条件で抽出する方法をアドバイス頂けましたら幸いです。

関連するQ&A

  • SQLでテキストボックスの文字を前方一致検索をするには?

    visual basic2005 を使ってSQLのデータを検索するプログラムを作っています。 テキストボックスに入力された文字を検索したいのですが、 構文がうまくいかずに困っています。 dim txt as string = textBox1.text "SELECT * FROM tesut WHERE line LIKE '" & txt & "'" このようにline行にtxtの値が含まれているものを検索したいです。 完全一致ではなく前方一致にしたいのですが、その文がうまくかけなくて困っています。 どうかアドバイスをお願いします

  • access 非連結のサブフォームの値を取得してテーブルへ追加したい

    いつもお世話になります。 以下のようにしたいのですがうまくいきません。 F_Mainのボタンを押す ↓ F_Sub1(F_Mainと連結していない単票形式)のTxt1の値と F_Sub2(F_Mainと連結した単票形式)のTxt2の値を テーブル1のTxt3、Txt4へ書込む F_Mainのボタンには以下を既述してます。 Dim cnADO As New ADODB.Connection Dim rsADO As New ADODB.Recordset Dim stSql As String Set cnADO = CurrentProject.Connection rsADO.CursorLocation = adUseClient stSql = "insert into テーブル1 (Txt3,Txt4) values (" & Me.F_SUB1!Txt1 & "," & Me.F_SUB2!Txt2 & ");" cnADO.Execute stSql cnADO.Close: Set cnADO = Nothing -----ここまで 以下のように連結フォームのF_SUB2のみにするとテーブル1に追加できました。 stSql = "insert into テーブル1 (Txt3,Txt4) values (" & Me.F_SUB2!Txt2 & "," & Me.F_SUB2!Txt2 & ");" 非連結フォームのTxt1の値を取得できていないのだと思いますが どのようにすればよいのかわからないのでご教示ください。

  • access VBAで検索および抽出が出来ません・・・

    VBA初心者なのですが、あるサンプルデータを参考に顧客管理のフォームを作成しています。 検索条件が未入力なら全リストを、条件入力すれば検索・抽出したいのです。 未入力の場合は全リストが表示されていますが、条件入力すると真っ白になります・・・ リストボックスで表示するようにしています。 なぜ出来ないのか、どなたか詳しく教えてください。宜しくお願いします。 ______________________________________ Private Sub subSetFiler() Dim strWhere As String '変数の初期設定 strWhere = "" 'フリガナを部分一致で検索 If IsNull(Me![txtFurigana]) <> True Then If strWhere <> "" Then strWhere = strWhere & " And" End If strWhere = strWhere & "tm01_Kokyaku.tm01_Furigana Like'*" & Me![txtFurigana] & "*'" End If '物件を部分一致で検索 If IsNull(Me![txtBukken]) <> True Then If strWhere <> "" Then strWhere = strWhere & " And" End If strWhere = strWhere & "tm01_Kokyaku.tm01_Bukken Like '*" & Me![txtBukken] & "*'" End If 'Where文字列の加工 If strWhere <> "" Then strWhere = "Where" & strWhere End If 'リストボックスノ値集合ソース更新 Me![1stKokyakuCode] = Null Me![1stKokyakuCode].RowSource = "SELECT [tm01_Kokyaku].[tm01_Code] AS コード, [tm01_Kokyaku].[tm01_KokyakuName] AS 顧客名, [tm01_Kokyaku].[tm01_Bukken] AS 物件名, [tm01_Kokyaku].[tm01_Gouchi] AS 号地, [tm01_Kokyaku].[tm01_Address1] AS 住所, [tm01_Kokyaku].[tm01_Tel] AS 電話番号 " & _ "FROM tm01_Kokyaku" & _ strWhere & " " & _ "ORDER BY [tm01_Kokyaku].[tm01_Bukken], [tm01_Kokyaku].[tm01_Gouchi]" Me![1stKokyakuCode].Requery

  • Excel-VBAでMySQのレコード件数を得たい

    Excel-VBAでレンタルサーバーにあるMySQLのテーブルのレコード件数を得たいのですが、うまくいきません。 色々と調べて下記のようなコードにしたのですが、結果「-1」と表示されます。 レコードは1500件ほどあります。 Excel-VBAからテーブルにレコードを挿入したり、Excel-VBAにレコードをもってきたりはできますので、アクセス自体は問題ないと思います。 どうにも分からず困ってます、どなたか教えてください。 環境としては、Excel2000 WindowsXP MySQL5 ver5.xx です。 Sub testxx() Dim con As ADODB.Connection Dim rs As ADODB.Recordset Dim connectionString As String Dim kensu As Integer connectionString = "Driver={MySQL ODBC 5.1 DRIVER};" _ & " SERVER=xxxx.xxxx.jp;" _ & " DATABASE=xxxDB;" _ & " USER=xxxuser;" _ & " PASSWORD=xxxpass;" Set con = New ADODB.Connection con.Open connectionString sqlStr = "select * from LinkTable" Set rs = con.Execute(sqlStr) 'kensu:件数----------- kensu = rs.RecordCount MsgBox (kensu) 'kensu:件数----------- con.Close End Sub

  • VBAで使う「MySQL」と言う変数名について

    ネットなどでVBAのサンプルコードを見ていると Dim MySQL As String としているのを何度か見かけますが MySQLとはACCESSとは別のアプリケーションだと思っているのですが なぜ MySQL と言う変数名を使うのでしょうか? ADOで Set RS = New ADODB.Recordset SQL = "SELECT * FROM T生徒名" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic としたいために Dim SQL As String と宣言するなら納得できますが MySQLは違和感を感じます。 どうでもいいことですが教えてください。 よろしくお願い致します。

  • VBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更される

    エクセルVBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更されてしまいます。 Dim rst As New ADODB.Recordset rst.CursorType = adOpenStatic と「adOpenStatic」に設定したいのですが、 Set rst = con.Execute(sql_str, , adCmdText) のようにクエリを実行した直後にCursorTypeを調べると、「adOpenForwardOnly」に変わってしまっています。 (設定直後に調べると、ちゃんとadOpenStaticになっています) 「CursorType」を何に設定しても、Execute直後に「adOpenForwardOnly」になってしまっていまうようです。 CursorTypeをadOpenStaticにして、RecordCountを使いたいのですが、、、 CursorTypeが変わってしまう原因をお知りの方は、教えていただけるとありがたいです。 Dim rst As New ADODB.Recordset Dim con As New ADODB.Connection con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" rst.CursorType = adOpenStatic rst.LockType = adLockReadOnly MsgBox "前 = " & rst.CursorType Set rst = con.Execute(sql_str, , adCmdText) MsgBox "後 = " & rst.CursorType

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • VBAでレコードセットの総レコード数を取得する方法

    Dim con As ADODB.Connection Dim rsData As ADODB.Recordset Dim DNSname$,USERname$,PASSw$,cnt&  Set con = CreateObject("ADODB.Connection")  con.Open "DSN=" & DNSname & "; UID= " USERname & "; PWD=" & PASSw  Set rsData = New ADODB.Recordset  rsData.Open SQL, con  Do While Not rsData.EOF   rsData.MoveLast   cnt=rsData.RecordCount   rsData.First  LOOP といいコードで総レコード数が取得できるかなとやってみたところ、rsData.MoveLastのところで、「行セットは逆フェッチをサポートしていません」というエラーが出ました。 なにかほかの方法で総レコード数を取得する方法があるのでしょうか? 自分で他に試したことは、rsData.EOFまでrsData.MoveNextでもっていきrsData.EOF-1レコードの.RecordCountを取得すしようと試みましたが、最後のレコードまできても.RecordCountは「-1」のまま変化しませんでした。レコードセットの呼び込み方が不味いのでしょうか?

  • Access VBAでのデータ抽出の仕方

    Access VBAでのデータ抽出の仕方 Access VBAでデータを抽出して、テキストボックスにデータを配置したいと思います。 Formにtxt1~txt10までのテキストボックスが10個あります。 テーブルからデータを引っ張ってきてレコードセットにいれます。 Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Dim SQL As string SQL = "Select * from Table1" Set objADOCON = Application.CurrentProject.Connection Set objADORS = objADOCON.Execute(SQL) これでレコードセットを取得しました。このレコードセットは「ID」列があり、プライマリーキーを設定しています。またZAIKOという列もあります。 ID=001の時、在庫は100 ID=002の時、在庫は200 といったように条件を絞って、テキストボックスに値を入れたいと思います。 objADORS.Filter = "[ID] = '001'" txt1.value = objADORS!ZAIKO objADORS.Filter = "[ID] = '002'" txt2.value = objADORS!ZAIKO ..... を10回繰り返せば条件毎に値がセットするのはわかります。 ただし、あまりスマートなやり方ではなく、もっといい方法があるんじゃないかと思うのですが考えつきません。 何か良い方法、手段がありましたらお教え下さい。 よろしくお願いします。

  • Accessでの検索結果表示

    Accessでの検索画面を作っているのですが *検索項目* ・顧客ID ・電話番号 ・氏名(前方一致で検索したい) *顧客テーブル* ・顧客ID ・電話番号 ・氏名 ・氏名カナ ・住所 3つを複合的な検索項目として、検索ボタンを押下した際に フォーム上のテキストボックスに顧客テーブルから 検索した住所を表示させたいと思っています。 現在、顧客コードだけを 検索項目として以下のようなコードを記述しているのですが これでさえもうまくいきません。 *************************** Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strRet As String Set cn = CurrentProject.Connection rs.Open "顧客テーブル", cn, adOpenKeyset, adLockOptimistic strRet = "顧客ID='" & Me!CustmID & "' " rs.Find strRet If Not rs.EOF Then Me.Address = rs!住所 Else: MsgBox "該当なし" End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub **************************** 現状、何が悪いのかそしてどのようにこのプログラムを 改良すれば本来やりたいことができるのか 教えていただけますでしょうか。よろしくお願いいたします。