- ベストアンサー
ADOでエクセルに接続した後の文字検索方法について
http://home.att.ne.jp/zeta/gen/excel/c04p42.htm こちらのページ下の方で■ADOレコードセットを取得して検索しますを 参考にさせて頂き、 検索.xlsを作成→VBAに下のように記述してtest.xlsのA列の中の文字列”excel”を検索して、 もしexcelという文字があれば該当セルの横のセルの文字を返すというものです、 この中で、test.xlsのA列を検索する部分の記述で RS.Find RS.Fields(0) & "='excel'" の部分でうまく行きません。 エラー内容としては 実行時エラー ’3001’: 引数が間違った型、許容範囲外、または競合しています。 と出てしまいます。 ためしにtest.xlsのA1セルにkoumokuと入力して RS.Find RS.Fields(0) & "='excel'"を 以下のように書き換るとうまく行きます RS.Find "koumoku='excel'" test.xlsには項目を作らずに今回は 項目指定ではなく列を指定して文字列を検索したいのですが どなたかお知恵を拝借させていただきたく存じます。 Public Sub test() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Set CN = New ADODB.Connection CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Excel 8.0" CN.Open "c:\test.xls" SQL = "SELECT * FROM [Sheet1$]" Set RS = New ADODB.Recordset RS.Open SQL, CN, adOpenStatic, adLockReadOnly 'RS.Find "koumoku='excel'" →これだとOK RS.Find RS.Fields(0) & "='excel'" If RS.EOF Then Debug.Print "Not Found" Else Debug.Print RS.Fields(1) TextBox1.Text = RS.Fields(1) End If End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
下記のようなエクセルでシートデータを作った。 氏名列は内容的には可笑しな例だがすみません。WEB例を使えるように した。 Sheet1 A1:C5 氏名 年齢 住所 excel 44 千葉 aaa 23 東京 ffff 33 神奈川 excel 12 埼玉 ーーーー エクセルの標準モジュールModule1に(WEBのコード例を一部修正し、確認のためMsgBoxを多用) Public Sub test() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Set CN = New ADODB.Connection CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Excel 8.0" CN.Open ThisWorkbook.FullName MsgBox ThisWorkbook.FullName MsgBox ActiveSheet.Name SQL = "SELECT * FROM [" & ActiveSheet.Name & "$]" Set RS = New ADODB.Recordset RS.Open SQL, CN, adOpenStatic, adLockReadOnly '-- MsgBox RS.Fields.Count For i = 0 To RS.Fields.Count - 1 MsgBox RS.Fields(i).Name Next '-- RS.Find RS.Fields(0).Name & "='excel'" If RS.EOF Then MsgBox "Not Found" Else MsgBox RS.Fields(1) End If End Sub ツールー参照設定もWEB解説どおり済ます。 一旦ブック名Adotest.xlsで保存(ここが肝心かも。Book1のままだとうまく行かない。) MsgBox RS.Fields.Count For i = 0 To RS.Fields.Count - 1 MsgBox RS.Fields(i).Name Next 実行時には、私のデータでテスト例では 3 ーー 氏名 年齢 住所 と順次表示される。 最後に 44と表示されるが これは(私の例で)A列(フィールド名「氏名」)で内容が"excel"を検索し 見つかった第2行目の RS.Fields(1)すなわちB列(フィールド名は「年齢」) の44を表示している。 A列には2つexcelがあるが、上記のコードでは、Findを発行しているだけなので、始めの(上から最初の)1つしか発見できてないわけだ。 質問のWEB例に修正する箇所などもあり、混乱するが、上記の実行のMsgBoxの表示内容とこの説明でわかるだろう。
その他の回答 (3)
- nas02
- ベストアンサー率70% (22/31)
とりあえず、先頭行が項目名ではなくデータであれば、以下のように指定しないと1行目が項目名となります。 CN.Properties("Extended Properties") = "Excel 8.0;HDR=No;" この場合の項目名は、プロバイダにより(F1、F2とか)自動で振られるとの事なので、A列の項目名はF1になるのではないでしょうか? 後の指定は分りますよね? [HOWTO] Visual Basic または VBA から ADO を Excel データで使用する http://support.microsoft.com/kb/257819
- hotosys
- ベストアンサー率67% (97/143)
RS.Find RS.Fields(0).Name & "='excel'" では? RS.Fields(0)では"excel"とかが入ってると思います。 RS.Fields(0).Nameなら"koumoku"とかが入ってると思います。
- INTLINSIDE
- ベストアンサー率42% (383/907)
その"koumoku"に相当するのがFields(0)では無いのでは。 Debug.Print RS.Fields(0) で、excelが入ってるか確認。 あるいは For Each fld In RS.Fields Debug.Print fld.Name Next とかやって、フィールド名を確認してみては。