• ベストアンサー

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.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)
回答No.3

とりあえず、先頭行が項目名ではなくデータであれば、以下のように指定しないと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)
回答No.2

RS.Find RS.Fields(0).Name & "='excel'" では? RS.Fields(0)では"excel"とかが入ってると思います。 RS.Fields(0).Nameなら"koumoku"とかが入ってると思います。

回答No.1

その"koumoku"に相当するのがFields(0)では無いのでは。 Debug.Print RS.Fields(0) で、excelが入ってるか確認。 あるいは For Each fld In RS.Fields Debug.Print fld.Name Next とかやって、フィールド名を確認してみては。

関連するQ&A

  • excelでのado接続での検索

    シートのA列に商品コードが入っており、別ブックのA列に商品コード、B列に商品名が入っています。 現シートのA列を一行ずつ読んで、その商品コードをキーに別ブックの商品コードを検索し一致するコードがあれば現シートのB列に別ブックの商品名をセットする、という作業を勉強がてらado接続を使って実行したいと思い、下記のコードで実行してみました。 Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = New ADODB.Connection CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Excel 8.0" CN.Open "C:\Users\*****\Desktop\shohinmaster.xls" For i = 2 To 最終行 Set RS = New ADODB.Recordset RS.Open "SELECT * FROM [shohin$] WHERE 商品コード = '" & Cells(i, 1) & "' ", CN If RS.EOF Then Cells(i, 2) = "???" Else Cells(i, 2) = 商品名 End If Next これで実行しますと、現シートの商品名は空白という結果になります。???とすらセットされませんでした。 また RS.Open の行の '" & Cells(i, 1) & "' という箇所なのですが、現シートの商品コードは数値で 入っているのですが、別シートの商品コードは文字列としてセットされていますのでこの形式にしております。 EXCELは2016、OSはWINDOWS7です。 どこが誤っているのかアドバイスいただければ幸いです。宜しくお願い致します。

  • ExcelでADOを使って他のブックを参照したい

    いつも楽しく勉強させていただいております。 VBA関連のサイトを参照して同じブックにあるシートをADOを使って参照することに成功しました。 Dim CN As New ADODB.Connection Dim RS As New 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 SQL = "SELECT * FROM [userlist$]" RS.Open SQL, CN, adOpenStatic, adLockReadOnly Do Until RS.EOF Debug.Print RS![P-1] RS.MoveNext Loop RS.Close CN.Close これを現在開いている別のブック、たとえばBook1にあるシートを参照するにはどこをどう書き換えたらいいでしょうか。

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • ADOを使用してExcelファイルをオープンし、内部結合したい。

    エクセルに2つのシートがあります。 シート名"男性用","女性用" それぞれのシートに"名前"の列があります。 この2つのシートを内部結合して検索したいのですが 可能でしょうか ----------------------シート1個の場合 Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Properties("Extended Properties") = "Excel 8.0" cn.Properties("Data Source") = App.Path & "\test.xls" cn.Open Dim cmd As ADODB.Command Set rst = New ADODB.Recordset rst.Source = "Select * From [男性用$]" rst.ActiveConnection = cn rst.CursorType = adOpenDynamic rst.Open , , , , adCmdText '------------------------------ これで取り出せますがシート2つを内部結合させたいばあい rst.Source = "Select * From [男性用$]" はどう変えたらいいでしょうか excelでなければ select * from 男性用 inner join 女性用 on 男性用.名前=女性用.名前 となると思いますが。

  • アクセスVBA。ADO

    CSVから列を分割してテーブルにしたいかったので 下記のコードを記述しましたが、 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim datacount As Long Set cn = New ADODB.Connection With cn .ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\;" .Properties("Extended Properties").Value = "text;HDR=YES;" .Open End With Set rs = cn.Execute("SELECT * FROM 構成マスタ.csv") datacount = rs.Fields.Count For i = 0 To datacount strsql = "SELECT " & rs.Fields(i).Name & " INTO " & rs.Fields(i).Name & " FROM 構成マスタ.csv;" cn.Execute strsql Next i rs.Close cn.Close Set rs = Nothing Set cn = Nothing SQLを実行するところで、「日付エラー」となってしまいます。 データには特に日付等はないのでエラーになる原因がわかりません。 どなたかご教示いただけますでしょうか。

  • ADOでテーブルにハイパーリンクを追加したい(アドレスと表示文字列は別)

    アクセスのtblのURLフィールドに 表示文字列→aaa URL→http://www.yahoo.co.jp/ を追加したいのですがうまくいきません。 (URLフィールドのデータ型はハイパーリンク型です) Sub test() Dim moji As String Dim URL As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\Documents" & "\access.mdb" Set rs = New ADODB.Recordset rs.Open "tbl", cn, adOpenStatic, adLockPessimistic moji = "aaa" URL = "http://www.yahoo.co.jp/" rs.AddNew rs("URL") = "#" & moji & "#" rs("URL") = "#" & URL & "#" rs.Update Set rs = Nothing Set cn = Nothing End Sub を実行すると 結果は 表示文字列もアドレスも「http://www.yahoo.co.jp/」になってしまいます。(そりゃそうか) どうすれば 表示文字列→aaa URL→http://www.yahoo.co.jp/ が実現できるのでしょうか? よろしくお願いします。 (ヴァージョンは2003です)

  • Excel VBA ADOでのCSV取込みについて

    下記は、Excel VBAでADOを使って、CSVデータを取り出すソースです。ソースは、とあるサイトからほぼ丸写しです。 Sub main()   Const DRIVER As String = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ="   Const PROVIDER As String = "Provider=MSDASQL;Extended Properties="""   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Dim idx As Integer   Dim strSQL As String   cn.ConnectionString = PROVIDER & DRIVER & "C:\"""   cn.Open   '全件数取得   strSQL = "SELECT * FROM Sample.csv"   'CSVファイルの内容を取得   Set rs = cn.Execute(strSQL)   rs.MoveFirst   Do Until rs.EOF     For idx = 0 To rs.Fields.Count - 1       Debug.Print rs.Fields(idx).Value '←ここ     Next idx     rs.MoveNext   Loop   Set rs = Nothing   cn.Close   Set cn = Nothing End Sub ここで、「'←ここ」と示した行のrs.Fields(idx).Valueって、実際には「001」と書かれた値は、ダブルクォーテーションでも入ってない限りは「1」と変換されちゃいますよね?これをちゃんと、実際の値「001」のまま取得することって出来ないのでしょうか?

  • EXCELVBAでADOにてデータ更新(削除)がうまくいかない。

    EXCELファイル(DB.XLS)とEXCELファイル(入力.XLS)を用意し、入力.XLSからデータベース.XLSへ更新処理を行いたいのですが削除処理がうまくいきません。 現状はADOにて表示、追加、修正、削除をしようと考えており下記記述(1)で削除処理を書いているのですが「クエリーが複雑すぎます。」エラーが発生しています。 又、別削除処理としてDim MYCMD As ADODB.CommandからMYCMD.CommandText = "DELETE FROM [データベース$] WHERE 日付 = " & Range("D4")でMYCMD.Executeしても行削除ができません。 これはhttp://support.microsoft.com/default.aspx?scid=kb;ja;257819にも記載があるように仕様なのかもしれませんが・・・ ただ、Worksheets("データベース").Rows(2).Deleteのように同一のブック内にデータベースがあれば削除可能でした。 別ファイル(DB.xls)の行削除はできないのでしょうか?特にADOでなくてもかまいませんが、できるだけOS側の設定は手動設定させたくないです。 OS:WindwsXP SP2 ソフト:Microsoft Excel2003 ※表示(select)、追加(.AddNew)は下記記述(1)と少し異なりますが可能でした。 ''入力.XLSの記述(1) ''**********削除処理2 ADO[Microsoft.Jet.OLEDB.4.0] クエリーが複雑すぎますのエラー Dim strCn As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim test_sql As String strCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ThisWorkbook.Path & "\DB.xls;" & _ "Extended Properties=Excel 8.0" Set cn = New ADODB.Connection cn.Open strCn Set rs = New ADODB.RecordsetEXCEL With rs .CursorLocation = adUseClient .Open "Select * from [データベース$]", cn, adOpenStatic, adLockOptimistic Do test_sql = "日付 = " & Range("D4") rs.Find test_sql If rs.EOF = True Then Exit Do rs.Delete 'ここでエラー Loop .Update .Close End With Set rs = Nothing cn.Close Set cn = Nothing ''***********

  • ADO エクセル→エクセル PW付きファイル接続

    以前も http://okwave.jp/qa/q8283354.html で同じような質問をしたのですが ADOでエクセルからエクセルに接続する方法を教えてください。 接続先のエクセルファイルにはPWがかかっています。 Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .Properties("Extended Properties") = "Excel 12.0" .Properties("Data Source") = ActiveWorkbook.Path & "\test.xlsx" .Properties("Password") = "0000" .Open End With 上記では、.Open部分で -------------------------------------------------------- 実行時エラー-2147217843 アプリケーションを起動できません。 システムデータベースが存在しないか、またはほかのユーザーが排他的にシステムデータベースを開いています。 -------------------------------------------------------- となります。 .Properties("Password") をコメントアウトすると、 -------------------------------------------------------- 実行時エラー -2147467259 外部テーブルのフォーマットが正しくありません。 -------------------------------------------------------- となり、そのまま再度F5を押すと -------------------------------------------------------- 実行時エラー -2147217843 認証に失敗しました。 -------------------------------------------------------- となります。 ちなみに参照設定は Microsoft ActiveX Data Objects 2.7 Library にチェックを入れています。 .Properties("Data Source") = ActiveWorkbook.Path & "\あああ.xlsx" のように、存在しないファイル名にした時は、 .Openを無事通過しますが、データの操作取得はできません。 どなたかわかる方ご教授おねがいします。

  • Excel ado処理について

    現在、Excel(インターフェース用)⇔(社内LAN経由)⇔Excel(マスターファイル×4)間で ADOを使用して、データ処理を行おうとしております。 (なお、今までは、画面更新OFFにしてファイルを素直にOPENして 各ファイルデータを格納して処理を行っていたのですが、 業務人員&量の拡大に伴い、Excelの競合が激しくなり、ADOによる処理へと 対応変更を考えております) マスターファイル×4はAccessのように、主キーが振ってあり、連結しております。 インターフェース用のExcelから各マスターファイルをADOで読み込み、 インターフェース用のExcelへとデータを転記する処理を作成中ですが、 なぜか、マスターファイル(A・B・C・D)のうち、Cのファイルのみ、データを10件ほど認識しておらず、 A=B=D≠Cとなってしまいます。 マスターファイルを直接開いて確認しますが、データ数は間違いなく一致しておりますが、 VBA上では認識しておりません。 自分なりに解析したところ、Cのファイルだけ、 "RS.MoveNext"の部分でデータが10件ほど飛んでいると思っております。 以下がそのソースですが、 どこが問題なのか?または、考えうる原因が他にあれば、ご教授いただきたいです。 本当に困っています。宜しくお願い致します。 --------------------------------------------------------------------- Sub StorageData() 'Frag初期値 SW_OK = True On Error GoTo ErrADO '取引先詳細 'ADO定型分 Set CN = New ADODB.Connection CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Excel 8.0" CN.Open Path00 & "反響データ\" & FileName01 Set RS = New ADODB.Recordset RS.Open SQL, CN, adOpenStatic, adLockReadOnly ReDim Data00(RS.RecordCount, 20) Ctr = 1 Do For i = 0 To 20 If Not RS.BOF Then Data00(Ctr, i) = RS.Fields(i) End If Next i i = 0 RS.MoveNext Ctr = Ctr + 1 Loop Until RS.EOF Ctr = Ctr - 1 ' ReDim Preserve Data00(Ctr, 20) Ctr = 0 Set RS = Nothing CN.Close 'お客さま詳細 'ADO定型分 Set CN = New ADODB.Connection CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Excel 8.0" CN.Open Path00 & "反響データ\" & FileNam

専門家に質問してみよう