• 締切済み

VBAでVLOOKUPを使いデータ検索したい

皆様、毎度お世話になっております。 いまExcelでマクロを組んでおりまして、色々なサイトを見て勉強しながら作成しております。 通常、VLOOKUP関数のみで参照範囲から検索すると、条件が1つのみになってしまうのですが... (本来なら条件を複数設定できるのかもしれませんが、、、何分、私が知識不足でして) 皆様のお手を煩わせて申し訳ありませんが、ご教授いただけませんでしょうか? 参照元データを「Book2.xls」、マクロを走らせるデータを「Book1.xls」とします(office2000を使用しております) 「Book2.xls」には以下の内容を入力したとします。   A B C  1 1 a ア  2 2 b イ  3 3 c ウ  4 4 d エ  5 5 e オ  6 6 f  カ  7 ・ 8 ・ 「Book1.xls」の標準モジュールに以下のマクロを組んでいます。 '=================================================== Sub main()   Dim rs As Object   Dim sql_str As String   Dim retcode As Long   retcode = open_ado_excel(ThisWorkbook.Path & "\book2.xls") '       ADOでExcelブックBook2.Xlsに接続   If retcode = 0 Then     f_num = Application.InputBox("input find number")     '↑ 検索するナンバーを入力     If TypeName(f_num) <> "Boolean" Then      sql_str = "select [名称] from [Sheet1$] where [NO] = " & f_num & ";"      'ナンバーを検索するSQLの作成      Set rs = exec_sql(sql_str, retcode) 'SQLの実行      If retcode = 0 Then        If rs.EOF <> True Then ' 見つかった         MsgBox rs![名称]        Else '見つからない         MsgBox "not found"         End If        rs.Close        Set rs = Nothing      Else        MsgBox Error$(retcode)        End If      End If     call close_ado()   Else     MsgBox Error(retcode)     End If End Sub 別の標準モジュールに '============================================================= Public cn As Object 'コネクションオブジェクト '============================================================= Function open_ado_excel(book_fullname As String) As Long 'ADOでExcelブックに接続する 'in book_fullname -- 接続するブックのフルパス 'ot open_ado_excel-- リターンコード 0-正常 その他--エラー   On Error Resume Next   Set cn = CreateObject("ADODB.Connection")   link_opt = "Provider=Microsoft.Jet.OLEDB.4.0;" & _        "Data Source=" & book_fullname & ";" & _        "Extended Properties=Excel 8.0;"   cn.Open link_opt   open_ado_excel = Err.Number   On Error GoTo 0 End Function '================================================= Sub close_ado() '接続したExcelブックの切断   On Error Resume Next   cn.Close   Set cn = Nothing   On Error GoTo 0 End Sub '================================================= Function exec_sql(sql_str, retcode) As Variant 'SQLの実行 'in : sql_str --- 実行するSQL 'ot : retcode ---リターンコード 0-正常 その他--エラー 'exec_sql--------SQLを実行した結果 '        今回は、Recordsetオブジェクトを返す On Error Resume Next   Set exec_sql = Nothing   Set exec_sql = cn.Execute(sql_str)   retcode = Err.Number   On Error GoTo 0 End Function このマクロだと条件が1つのみになってしまうのです。 これを複数の条件を指定できるようにしたいのです。 (できれば、ユーザーフォームで複数条件を指定したいのですが・・・) どのようにマクロを組めばよろしいのか、恐れ入りますがご教授ください。 なるべく早い回答をお願いします。 システムへデータを上げなければならないので・・・ 私情を挟み申し訳ありませんが、何卒宜しくお願いします。

みんなの回答

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.2

No.1さんへの補足に対する回答になってしまいますが、横から失礼いたします。 Range("Bj:Jj").Select ですが、これはBJ列からJJ列を選択するという意味になると思います。 Range("B" & j & ":J" & j).Select としたらうまくいく可能性があるのではないでしょうか。 あるいは、貼り付け先は左上の1つのセルだけを選択すればいいはずなので、 Range("B" & j).Select でいかがでしょう。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

お互いが、エクセルのファイルで、ADOを使用してですか? アクセス経験者の方かと思いますが、とりあえず エクセルのフィルターオプションの機能を試してみては如何でしょうか? エクセル2000では確認できませんが、エクセルを使うのであればエクセルの機能を使った方が 便利で簡単です。この場合はVlookup関数ではなくフィルター オプション http://www.eurus.dti.ne.jp/yoneyama/Excel/filter3.htm を参考に説明しますと Book2の1行目は フィールド名 です。 Book1の A1~B3 に抽出の条件があるとします。 Book1の4行目以降に、結果を表示させるとします。 試した操作は、Book1からフィルター明細設定(2010の場合) フィルターオプション 抽出した範囲に チェック リスト範囲   Book1のA~G列 抽出条件の範囲 Book2のA1~B2 抽出範囲    Book2のA4~G4 を実行させたら、A2~B2で指定した条件にあったデータが抽出されました。 マクロの記録の結果は Sub Macro1() Workbooks("book1.xls").Sheets("データ").Columns("A:G").AdvancedFilter Action _ :=xlFilterCopy, CriteriaRange:=Range("A1:B2"), CopyToRange:=Range("A4:F4") _ , Unique:=False End Sub と1行で済みます。 マクロの考え方ですが、Book1のシート上のボタンを押すと Book2を開いて、指定したフィルターオプションを実行して Book2を閉じる。 もちろん、途中の動作の表示が不要であれば表示をしない方法もあります。 フォーム上のテキストボックスを使うことも可能ですが、特に問題なければ シートのセルを利用してみてh如何でしょうか。

blue-rapis
質問者

お礼

ご回答いただきありがとうございます。 早速、参考にさせていただいたのですが、中々上手く行きません・・・。 もう少し粘ってみようかと思います。

blue-rapis
質問者

補足

いま、また新しくマクロを組んでいるのですが・・・ --------------------------------------------- Private Sub CommandButton2_Click() For i = 2 To Worksheets.Count For j = 2 To Worksheets(i).UsedRange.Rows.Count If Worksheets(i).Range("B" & j).Text = UserForm1.ComboBox1.Value And _ Worksheets(i).Range("C" & j).Text = UserForm1.ComboBox2.Value And _ Worksheets(i).Range("D" & j).Text = UserForm1.ComboBox3.Value And _ Worksheets(i).Range("E" & j).Text = UserForm1.ComboBox4.Value And _ Worksheets(i).Range("F" & j).Text = UserForm1.ComboBox5.Value And _ Worksheets(i).Range("G" & j).Text = UserForm1.ComboBox6.Value Then MsgBox i & "番目のシートの" & j & "行目に存在します。" Exit Sub End If Next Next MsgBox "存在しませんでした" End Sub --------------------------------------------- で作成し、メッセージに表示される行の対象セルを検索をしているシートに抽出したいのですが... --------------------------------------------- Private Sub CommandButton2_Click() For i = 2 To Worksheets.Count For j = 2 To Worksheets(i).UsedRange.Rows.Count If Worksheets(i).Range("B" & j).Text = UserForm1.ComboBox1.Value And _ Worksheets(i).Range("C" & j).Text = UserForm1.ComboBox2.Value And _ Worksheets(i).Range("D" & j).Text = UserForm1.ComboBox3.Value And _ Worksheets(i).Range("E" & j).Text = UserForm1.ComboBox4.Value And _ Worksheets(i).Range("F" & j).Text = UserForm1.ComboBox5.Value And _ Worksheets(i).Range("G" & j).Text = UserForm1.ComboBox6.Value Then Worksheets(i).Select Range("Bj:Jj").Select Selection.CurrentRegion.Copy Sheets("検索").Select Range("B2").PasteSpecial Paste:=xlValues Exit Sub End If Next Next MsgBox "存在しませんでした" End Sub --------------------------------------------- 検索はされるのですが、シートに抽出されません。 どのようにマクロを組めばいいか分かりません。 よろしくお願いします。

関連するQ&A

  • 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

  • EXCELへのデータ出力

    VB6.0で開発しています。 下記のようにEXCELへのデータ出力は出来たのですが EXCELのシートのA列とB列は文字列にしたいのです。 今はA列とB列に数字を入れると右詰になってしまいます。 どうすればいいでしょうか? 教えてください。 Dim s3cn_ado As variant Dim dsn As String Dim tbl As String Dim tky As String Dim sql As String Dim rs As variant Dim fnm As String Dim mds As boolean Dim fno As Integer Dim i As Integer Dim j As Integer Dim k As long Dim s As String Dim ct As long Dim exl As Object dsn = "dsn=SAK3_ADO;uid=SAK;pwd=SAK" tbl = "sak.受注m" tky = "受注番号 = ''" '0 件のダミー問い合わせ用のキー" fnm = "g:\tmp\test.xls" mds = true set s3cn_ado = CreateObject ("ADODB.Connection") s3cn_ado.Open dsn sql = "select * from " & tbl & " where " & tky set rs = s3cn_ado.Execute(sql) j = rs.fields.count - 1 redim ctyp(j) as boolean For i = 0 to j select case rs(i).type case 131, 139 ctyp(i) = true case else ctyp(i) = false end select Next rs.close Set exl = CreateObject("Excel.Application") exl.Application.Visible = True exl.Application.Workbooks.Open FileName:=fnm k = 1 if mds then k = 2 end if s3cn_ado.BeginTrans on error resume next for k = k to 65536 s = "" If exl.Cells(k, 1) = "" Then Exit For For i = 0 To j if ctyp(i) then s = s & "," & exl.Cells(k, i + 1) else s = s & ",'" & exl.Cells(k, i + 1) & "'" end if Next s = mid(s, 2) sql = "insert into " & tbl & " values (" & s & ")" s3cn_ado.Execute sql if err <> 0 then s3cn_ado.RollbackTrans close fno s3cn_ado.Close msgbox "更新エラー" & chr(10) & err & ": " & error _ & chr(10) & ct + 1 & " 件目に問題あり" _ & chr(10) & sql end end if ct = ct + 1 next s3cn_ado.CommitTrans on error goto 0 exl.Application.DisplayAlerts = False exl.Application.Quit s3cn_ado.Close

  • 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 ''***********

  • excel vba で .mdb のデータ抽出

    excel vba で postdata.mdbのpostレコードから条件に合うデータを抽出しようとしています。 数日間、いろいろ調べていますが分かりません。 おそらく、SQLの部分だと思うのですが・・・ adoは初めて使う素人なので教えていただけないでしょうか。 On Error GoTo ErrGyo Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Open ThisWorkbook.Path & "\postdata.mdb" Dim Rs As ADODB.Recordset Dim SQL As String Dim T_ken As String Dim T_si As String Dim T_mati As String Dim i As Long T_ken = TextBox1.Value  ’フォームにテキストボックス T_si = TextBox2.Value T_mati = TextBox3.Value SQL = "SELECT * FROM post WHERE ken like '" & T_ken & "' and si LIKE '" & T_si & "' and mati LIKE '" & T_mati & "'" Set Rs = New ADODB.Recordset Rs.Open SQL, cn, adOpenForwardOnly, adLockReadOnly MsgBox Rs.RecordCount  ’ここでチェックすると -1 となる??? If Rs.RecordCount = 0 Then MsgBox "該当するレコードは見つかりませんでした。", vbInformation Else For i = 1 To Rs.RecordCount Cells(i, 1) = Rs!num Cells(i, 2) = Rs!ken Cells(i, 3) = Rs!si Cells(i, 4) = Rs!mati Rs.MoveNext Next End If Rs.Close: Set Rs = Nothing cn.Close: Set cn = Nothing Exit Sub ErrGyo: MsgBox "postdataへの接続に失敗しました", vbCritical

  • VBA ADOに関して

    お世話になります。 VBAに関して質問があります。 ADOでDBから値を取得する際、 TEXT型の値が全く取れてきません。 どなたか取得方法をご教授下さい。 宜しくお願い致します。 DB:Sybase OS: RedHat 8.0 Dim rs As ADODB.Recordset Dim sql As String sql = "select * from " & tblName //dbはADODB.Connection Set rs = db.Execute(sql) Do While Not rs.EOF //ここでTEXT型だと、取れてきません。  If IsNull(rs.Fields('Field名').Value) Then End If rs.MoveNext Loop

  • 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にあるシートを参照するにはどこをどう書き換えたらいいでしょうか。

  • 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 /------------------------------------------------/

  • ADOを使用してExcelファイルをオープンした場合にリソースが解放されない

    こんにちは。 いつもお世話になっております。 Excelがインストールされていない環境でExcelファイルの中身を参照するために ADOを使用した処理を実装しています。 以下のようなコードで動作しましたが、一度処理を実行後に続けて処理を実行した場合に ファイルアクセスのエラー(ConnectionのOpen時)が発生してしまいます。 (実行時エラー'2147418113 (8000ffff)'「致命的なエラーです。」) EXEを終了し、再度処理を実行するとうまく動作します。 おそらくExcelファイルのインスタンスが解放できていないという類のエラーであると思いますが、原因が分かりません。 (EXE起動後の2回目の処理で必ず発生するわけではなく、3回目の場合があるのも謎です。) 何か分かりましたらご教示下さい。 --------------------------------------------------------------------------------- inputFileName = App.Path + "\test.xls" outPutFileName = App.Path + "\test.csv" On Error GoTo errorHdr Set cn = New ADODB.Connection With cn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" + inputFileName + ";" + "Extended Properties=Excel 5.0;" .Open End With strSQL = "SELECT * FROM [sheet1$]" Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open strSQL, cn, adOpenDynamic, adLockReadOnly, adCmdText On Error GoTo 0 x = FreeFile Open outPutFileName For Output As #x Do Until rs.EOF buff = "" For col = 1 To rs.Fields.Count If col < rs.Fields.Count Then buff = buff & rs.Fields(col - 1).Value & "," Else buff = buff & rs.Fields(col - 1).Value End If Next If Len(buff) = rs.Fields.Count - 1 Then Exit Do End If Print #x, buff rs.MoveNext Loop Close #x rs.Close Set rs = Nothing cn.Close Set cn = Nothing MsgBox "完了しました。", vbInformation Exit Sub errorHdr: On Error GoTo 0 MsgBox "ファイルのオープンに失敗しました。", vbCritical If rs Is Nothing = False Then If rs.State = adStateOpen Then rs.Close End If Set rs = Nothing End If If cn.State = adStateOpen Then cn.Close End If Set cn = Nothing End Sub --------------------------------------------------------------------------------- <環境> Windows 2000(SP4), VB6.0(S6) ※ExcelファイルはExcel 95で作成(2500行×15列程度)

  • VBAのデバックをどなたかお手伝いください。

    もちろん自分でも調べてはいるのですが、急いでいるため、もしどなたか教えてくだされば大変助かります。 この(下記の)Then 以降からがわかりません。 Do Until rs.EOF '該当レコードあり If rs!MCD = "3162" Then '--------------------------------------------- strcriteria = "CAT = '" & rs!CAT & "'" ' --- A rs2.Find strcriteria, 0, adSearchForward If rs2.EOF Then ' Else rs!仕入単価世代1 = rs!仕入単価 rs!仕入単価 = rs2!discount End If '--------------------------------------------- rs!更新日 = Now() rs.Update End If 情報が不足していればお答えします。どうぞ宜しくお願いいたします。 (補足)これより前に入力されているのは以下のものです。 Dim cn As ADODB.Connection Dim cn2 As ADODB.Connection Dim rs As ADODB.Recordset Dim rs2 As ADODB.Recordset Dim strmsg As String Dim lngRet As Long Dim strcriteria As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset Set cn2 = CurrentProject.Connection Set rs2 = New ADODB.Recordset rs.Open "商品2_T", cn, adOpenKeyset, adLockOptimistic rs2.Open "商品2_T25discountてすと", cn2, adOpenKeyset, adLockOptimistic

  • 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へ移行させるにはどうすればいいのでしょうか? よろしくお願いします。