Excelマクロでデータ抽出

このQ&Aのポイント
  • Excelマクロを使用してデータを抽出する方法を教えてください。
  • Excelのデータ抽出をマクロ化したいのですが、エラーが発生しています。
  • オートシェイプの列を条件にしてデータを抽出する方法を教えてください。
回答を見る
  • ベストアンサー

excel マクロでデータ抽出したい

excelの抽出をマクロ化しようと思っています。 キー記録で Sheets("data").Range("B11:O714").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("data").Range("G3:G5"), CopyToRange:=_ Range("B4:O615") , Unique:=False を得たので、これを元にして、条件範囲をオートシェイプのある列を条件にしようと思い、 col = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column で、オートシェイプの列を取得し、 Sheets("data").Range("B11:O714").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("data").Range(Cells(3, col), Cells(5, col)),_ CopyToRange:=Range("B4:O615") , Unique:=False としたのですが、エラーになってしまいます。 colを使って条件範囲をするにはどうしたらいいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

質問のコードは、うまく行かないことは、他の回答者の説明があります。 目的(データ抽出とか言う目的でなく、わかりやすく、手早く使用する(条件を整える)うえで、こういう風にして省力化的に、「しくみ」をしたいと、「文章で!!」説明して質問すべきでしょう。自分の(たぶん、そんなにVBAのエキスパートでない質問者の)アイデアの先行・無理が露出した例だと思うが、よくある。そういう質問者は自作のVBAコードを張り付けて、仕組みの目的はあまり説明しない質問者が多い。その仕組みと言うかアイデアこそ、ここで識者に尋ねるべきと思う。 (例)オートシェイプのある列を条件にしようと思い、・・ チェックを入れた列を条件列にするとかか。 一応VBAを利用するということは、それだけで、省力化になっているわけです。 今回は条件さえも、何とかマウスのクリック指定で何とかしようということか? こういうユーザーインターフェースの部分までいじくるとなると、VBAを超えたスキルがいる場合が多いように思う。 VBAのエクスパートでなければ、他人が使うことまで考慮した仕組みを作るのは、難しいと思う。 エクセルは自分で使う用だと思う。 ーーー 内容は、お気に召さないかもしれないが、やってみた。 シートデータ例 Sheet2のA20:I30 (WEB例から借用した) 出席番号 氏名 国語 算数 理科 社会 合計 順位 評価 1001 佐藤 20 51 48 46 165 9 不可 1002 鈴木 56 64 67 59 246 5 良 1003 高橋 89 92 97 81 359 1 優 1004 田中 71 78 75 85 309 4 良 1005 渡辺 25 34 45 54 158 10 不可 1006 伊藤 48 56 42 52 198 7 可 1007 山本 92 88 84 76 340 2 優 1008 中村 84 89 76 84 333 3 良 1009 小林 61 59 65 54 239 6 可 1010 加藤 34 82 38 49 168 8 可 条件入力シートはSheet3 A1:I6 (条件入力シートがデータシートと分離。これはできるようだ。 条件入力シート <--第1行 出席番号 氏名 国語 算数 理科 社会 合計 順位 評価 佐藤 鈴木 中村 伊藤 氏名をほしいだけ、操作者が入力していく。 (1)直接入力以外では、(2)元シートのコピー貼り付け、(3)全員のある氏名列を用意し、そこからCtrlキーを押しながらD&D、(4)ListBoxで選択、などの方法を思いつくが。 ーーー VBAコード 標準モジュールに Sub Adfilter3() lr2 = Worksheets("Sheet2").Range("B15").End(xlDown).Row '元データ最下行 MsgBox lr2 lr3 = Worksheets("Sheet3").Range("B15").End(xlUp).Row '条件最下行 MsgBox lr3 Worksheets("Sheet2").Range("A20:I30").AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=Worksheets("Sheet3").Range("B2:I" & lr3), _ CopyToRange:=Worksheets("Sheet4").Range("A1:I50"), _ Unique:=False 'Sheet4に抽出 End Sub ーーー 結果 Sheet4に A1:I5 出席番号 氏名 国語 算数 理科 社会 合計 順位 評価 1001 佐藤 20 51 48 46 165 9 不可 1002 鈴木 56 64 67 59 246 5 良 1006 伊藤 48 56 42 52 198 7 可 1008 中村 84 89 76 84 333 3 良 ーーー ほかに、(氏名はイコール条件なのだが)未検討なのは、数値の大小条件です。 上記条件例で、Sheet3の氏名列は空白とし、国語列のC2に>65などと入れる。 Sheet3のA1:I3 条件入力シート 出席番号 氏名 国語 算数 理科 社会 合計 順位 評価 >65 と入れてVBAを実行すると(65点以上) 結果 出席番号 氏名 国語 算数 理科 社会 合計 順位 評価 1003 高橋 89 92 97 81 359 1 優 1004 田中 71 78 75 85 309 4 良 1007 山本 92 88 84 76 340 2 優 1008 中村 84 89 76 84 333 3 良 ーー あと、Sheet4で結果の表示列の選択(操作者が決定できるようにする)があるが、略。 ピヴォットテーブルのようにシート上でD&Dを自由にやるスキルがないので上記どまりかな。

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

ActiveSheet.Shapes(Application.Caller) でオートシェイプを指定できるのは、そのオートシェイプに上記のマクロを登録していて、尚且つ、そのオートシェイプをクリックする事などによってマクロを起動させた場合に限ります。 >エラーになってしまいます。 という事は、「そのマクロを登録済みのオートシェイプをクリックする」という以外の方法で、そのマクロを起動させたからだと思われます。  ですから、条件範囲を指定する方法として、もしオートシェイプをクリックするという方法を使うのであれば、それらのオートシェイプの全てに、そのマクロを登録しておかれると良いと思います。  それに対し、もしそれ以外の方法でマクロを起動させるのであれば、 >条件範囲をオートシェイプのある列を条件にしようと思い、 という箇所に記述されている「オートシェイプ」とは、一体何のオートシェイプの事を指しているのかという事に関して、質問者様の御質問文中には何の説明もないため、このままでは回答のしようが御座いません。  ですから、どのオートシェイプの事なのかという事に関して御説明願います。

  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.1

まず、この式でちゃんと「条件範囲」を指示しているかどうかが問題です。 CriteriaRangeは、抽出条件の見出しと「100%整合した」見出しじゃ ないと動作しませんよ。全角半角はおろか、空白の有無が違うだけでも 動作しなくなります。 もう一つ、CopyToRangeは、コピーした結果その範囲を超えちゃうと エラーします。なので、"B4:O4"としておくのが普通です。

関連するQ&A

  • エクセル2007 VBAについて教えてください。

    顧客情報と販売履歴をソフトからCSVで書き出してシート1とシート2へ貼り付けしてそのデータをシート3へ抽出しているのですが、もっと良い方法があれば教えてください。 顧客情報と販売履歴がソフト上の関係で別々に書き出しされる為、シート1へ顧客情報のみを貼り付けしております。シート2に販売履歴を貼り付けしております。 そのデータを別シート A納品番号 B代引金額 C略称 D客先名 E郵便番号 F住所1 G住所2 H.TEL K納品番号(A列と同じコードです)L伝票No M管理番号 N客先情報 O商品コードP商品名Q数量 R納入単価 S納入金額 T客先コード変換 U商品名半角 へ転記するようにしております。 ここで抽出ボタン(マクロ起動)すると161行目から抽出するようにしております。 Private Sub CommandButton3_Click() Range("K161").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A161:A162"), CopyToRange:=Range("K161"), Unique:=False ActiveWindow.SmallScroll Down:=9 Range("K167").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A167:A168"), CopyToRange:=Range("K167"), Unique:=False ActiveWindow.SmallScroll Down:=9 Range("K173").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A173:A174"), CopyToRange:=Range("K173"), Unique:=False ActiveWindow.SmallScroll Down:=6 Range("K179").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A179:A180"), CopyToRange:=Range("K179"), Unique:=False ActiveWindow.SmallScroll Down:=9 Range("K185").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A185:A186"), CopyToRange:=Range("K185"), Unique:=False Range("K191").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A191:A192"), CopyToRange:=Range("K191"), Unique:=False ActiveWindow.SmallScroll Down:=6 Range("K197").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A197:A198"), CopyToRange:=Range("K197"), Unique:=False ActiveWindow.SmallScroll Down:=6 Range("K203").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A203:A204"), CopyToRange:=Range("K203"), Unique:=False Range("K210").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A210:A211"), CopyToRange:=Range("K210"), Unique:=False ActiveWindow.SmallScroll Down:=9 Range("K216").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A216:A217"), CopyToRange:=Range("K216"), Unique:=False Range("K222").Select Range("K1:U149").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "A222:A223"), CopyToRange:=Range("K222"), Unique:=False そしてこのデータを転送用と言うシート A3納品番号 B3商品名1 C3商品名2 D3商品名3 E3氏名 F3郵便番号 G3住所1 H3住所2 I3住所3 J3名前2 K3電話番号 R3代引き金額 へ書き出ししているのですが、もう少し処理が早く出来る提案はありますでしょうか? 問題なく動いてはいるのですが、少し処理に時間がかかってしまう為、簡単な方法があるかご質問させて頂きました。 皆様の知恵をお貸しください。

  • エクセル2003 条件抽出したデータを切り取り別シートへ貼り付け

    シート1にあるデータから3個のキーワードで抽出したデータを切り取り、シート2に貼り付ける方法を教えてください。  今までは抽出する条件のキーワードが2個以下だったので、オートフィルタのオプションで抽出したデータをコピーしてシート2に貼り付け、シート1で可視セルを選択して削除という方法をとっていました。  今回、条件にするキーワードが3個になったので、フィルタオプションの設定で、シート2のA1からA4にキーワードを入れて、検索条件範囲を指定してデータを抽出したので、今までの方法が使えなくなってしまいました。 参考までに、↓こんな感じです。 Sheets("Sheet2").Select Range("A1") = "条件" Range("A2") = "キーワード1" Range("A3") = "キーワード2" Range("A4") = "キーワード3" Sheets("Sheet1").Cells.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _ Range("A1:A4"), CopyToRange:=Range("A6"), Unique:=False

  • エクセル フィルタオプションについて

    教えて下さい。 sheet1~sheet3まであります。 【sheet1】と【sheet2】をフィルタオプション で検索条件範囲が【記号】部分で、 【sheet3】の結果になりますが、 VBAで、どのようにすれば良いのか わかりません。 Sheets("Sheet1").Range("A1:C3").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("A3:C150"), Unique:=False Sheets("Sheet2").Range("A1:C6").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("A3:C150"), Unique:=False End Sub このプログラムで実行するとSheet2の抽出しか できません。 何が足りないのでしょうか? 宜しくお願いします。 【sheet1】 A B C 品名 金額 記号 1 いちご 100 06-02 2 りんご 200 06-01 3 みかん 300 06-02 【sheet2】 A B C 品名 金額 記号 1 いちご 500 06-01 2 りんご 1000 06-01 3 みかん 1500 06-02 【sheet3】 A B C 1 記号 2 06-02 3 品名 金額 記号 4 いちご 100 06-02 5 みかん 300 06-02 6 みかん 1500 06-02

  • VBAのAdvancedFilterについて with構文で囲まないとオブジェクト定義エラーになる理由

    エクセルでVBAの下記コードで実行すると、実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーとなりますが、 Worksheets("作業用").Activate Worksheets("職員").Range(Cells(6, 1), Cells(Wrow, 12)).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("a6:c8"), CopyToRange:=Range("d6:z2000"), Unique:=False それを下記のようにwith end with構文で囲むとエラーとなりません。 形式的には同じコードに見えるのですが、実質的に何が違うためオブジェクト定義エラーにならないのでしょうか。 AdvancedFilterに限らず、しばしば同様の原因によるエラーに悩まされていますので、ご教示いただければ幸いです。 Worksheets("作業用").Activate With Worksheets("職員") .Range(.Cells(6, 1), .Cells(Wrow, 12)).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("a6:c8"), CopyToRange:=Range("d6:O2000"), Unique:=False End With

  • inputboxではセル番地が指定できず困っています。

    EXCEL2000のVBAで、フィルターオプション機能を自動化したいのですが、 抽出先が変動するので、inputboxでセル番地を選択しようとすると、セルを選択することができず、自分で「A1」などと入力すると、きちんとA1に抽出結果が出てくるのですが、自分でセル番地をinputboxに入力するのではなく、マウスでセル番地を指定したいのですが、どのような方法をすればよかったでしょうか? よろしくお願いします。ちなみ作ったVBAは以下のとおりです。(複数の表から同じ条件で抽出し、inputboxで指定したセル番地に抽出結果を出し、その右側に続けて抽出結果を貼り付けていくという感じで作っています) Sub 抽出() Dim Shouhin1 As String Dim Shouhin2 As String Dim Shouhin3 As String Shouhin1 = InputBox("抽出先を指定してください") Shouhin2 = "d" & Mid(Shouhin1, 2, 5)’二つ目の表の抽出先を指定 Shouhin3 = "g" & Mid(Shouhin1, 2, 5)’3つ目の表の抽出先を指定 Sheets("抽出先").Select Sheets("データ").Range("A5:c44").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("データ").Range("B1:B2"), CopyToRange:=Range(Shouhin1), _ Unique:=False Sheets("データ").Select Sheets("抽出先").Select Sheets("データ").Range("d5:f44").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("データ").Range("B1:B2"), CopyToRange:=Range(Shouhin2), _ Unique:=False Sheets("データ").Select Sheets("抽出先").Select Sheets("データ").Range("g5:i44").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("データ").Range("B1:B2"), CopyToRange:=Range(Shouhin3), _ Unique:=False End Sub

  • Excel2002のマクロについて教えてください

    フィルターオプションの自動化を試みたのですが・・・・ sheet「商品一覧」、sheet「抽出結果」 上記2つのSheetがあったとします。 抽出したい表は「商品一覧」、抽出結果を出したい表は「抽出結果」です。(マクロを実行するコマンドボタンは「商品一覧」に作成します) フィルターオプションは、結果を出したいシートから、操作を行えば、別シートにも、結果を出すことができるので、マクロの自動登録を使って、以下のようなマクロが作成できました。 ---------------------------------- Sheets("抽出結果").Select Sheets("商品一覧").Range("B5:G24").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("B3:B4"), CopyToRange:=Range("B7:G7"), Unique:=False ------------------------------------ もちろん、きちんと動作はするのですが、「商品一覧」の範囲が(B5:G24)が変動する場合があるので、以下のように変更をしました。 ------------------------------------ Dim Gyou As Integer Gyou = Worksheets("商品一覧").UsedRange.Rows.Count + Worksheets("商品一覧").UsedRange.Row - 1 Sheets("抽出結果").Select Sheets("商品一覧").Range(Cells(5, 2), Cells(Gyou, 7)).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("B3:B4"), CopyToRange:=Range("B7:G7"), Unique:=False ----------------------------- しかし、上記の方法では、エラーが出てしまいます。 最初は、CurrentRegion を使用しようと思ったのですが、うまくいきませんでした。 マクロを勉強したばかりで、たぶんとんでもないものを作っているのだと思いますが、ご指摘いただければうれしいです。 よろしくお願いします。

  • マクロで実行時1004エラーがでます・・

    Application.CommandBars("Picture").Visible = False Range("D3").Select Selection.AutoFilter Range("D6").Select Range("B4:L360").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("D2:E3"), CopyToRange:=Range("B5:L50"), Unique:= _ False Range("N20").Select End Sub どこが悪いのでしょうか? まったく未経験者なので、わかりません。。よろしくお願いします。

  • EXCELマクロ セルに入力したシート名から参照

    よろしくお願いします。 複数のシートがあり、それぞれ 1109,1110,1111,1112,1201,1202,1203,1204,1205 と名前がついています。 それぞれのシートには月毎のデータが入っています。 Sub Macro1() Columns("F:J").Select Selection.ClearContents Sheets("1205").Columns("A:E").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("C4:E5"), CopyToRange:=Range("F2:J2"), Unique:=False End Sub ↑のマクロをSheet3で作りましたが、4行目の「Sheets("1205")」の1205の部分を可変で作れればと 思っています。Sheet3のC3セル内に入力したシート名(1109や1203等)でフィルタ出来ると助かります。 どうぞよろしくお願いします。

  • フィルタ オプションの設定(データ抽出) マクロ

    マクロを使って、「sheet1」のデターを「sheet2」へ抽出するのですが、Webで最適なものがあったので、その指示通りにやりました。その例題は再現できました。しかし、それを自分に合うように設定し直すとどうしてもできません。そこで気づいたのは、「No. 月日 項目名 収入 支出 摘要 購入店名」の各セルが何らかの関係があるのではと思ったのです。この項目を変えたて自分独自のものにしたいのですが、変えたり消してしまうと抽出できません。どこをどのようにしたらよいのか教えて頂けませんか。 Sub Macro2() Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets("Sheet1").Range("B65536").End(xlUp).Row myRow2 = Sheets("Sheet2").Range("B65536").End(xlUp).Row If myRow2 >= 5 Then Sheets("Sheet2").Range("B5:H" & myRow2).ClearContents End If Sheets("Sheet1").Range("B2:H" & myRow1).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("B2:B3"), CopyToRange:=Range("B5"), Unique:=False End Sub

  • excel2007VBA 二つの動作の繰り返し処理

    excel2007でマクロを勉強し始めたばかりです。VBAの繰り返し処理をしたいのですが、以下のようなマクロの請求書個別発行を一括発行にしたいと考えています。繰り返し開始から、終了までを、数値がなくなるまで繰り返したい場合、どのようになるでしょうか。よろしくお願いします。 Sub 請求書個別発行() ' ' 請求書個別発行 Macro ' ' Range("A3:R24").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "売上一覧表!Criteria"), CopyToRange:=Range("W6:AN50"), Unique:=False    Sheets("得意先").Select Range("C3:O90").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "得意先!Criteria"), CopyToRange:=Range("R6:AD325"), Unique:=False 繰り返し開始 Sheets("売上一覧表").Select Range("T4").Select   (T4からT5,T6,T7、、、と降順に値がなくなるまで選択される。) Selection.Copy        (T4=Y4)  Range("Y4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("A3:R24").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "売上一覧表!Criteria"), CopyToRange:=Range("W6:AN50"), Unique:=False Sheets("請求書").Select Range("B16").Select  (B16から、B17、B18,,,と降順に値がなくなるまで選択される。)   Selection.Copy       (B16=I6) Range("I6").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("請求書").Select Application.Dialogs(xlDialogPrint).Show 繰り返し終了 End Sub 以下は自分なりに考えたVBAですが、エラーになります。 Sub 請求書集計発行() ' ' 請求書発行 Macro ' ' Range("A3:R24").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "売上一覧表!Criteria"), CopyToRange:=Range("W6:AN50"), Unique:=False Sheets("得意先").Select Range("C3:O90").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "得意先!Criteria"), CopyToRange:=Range("R6:AD325"), Unique:=False Dim wst1 As Worksheet Dim wst2 As Worksheet Set wst1 = ThisWorkbook.Worksheets("売上一覧表") Set wst2 = ThisWorkbook.Worksheets("請求書") Dim i As Long Dim j As Long For i = 4 To 100 For j = 16 To 100 If wst1.Range("T" & i) <> "" And Not IsNull(wst1.Range("T" & i)) Then If wst2.Range("B" & j) <> "" And Not IsNull(wst2.Range("B" & j)) Then myrow = wst1.Cells(Rows.Count, 1).End(xlUp).Row + 1 myrow = wst2.Cells(Rows.Count, 1).End(xlUp).Row + 1 wst1.Range("T" & myrow) = wst1.Range("Y4") Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("A3:R24").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "売上一覧表!Criteria"), CopyToRange:=Range("W6:AN50"), Unique:=False Sheets("請求書").Select wst2.Range("B" & myrow) = wst2.Range("I6") Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("請求書").Select Application.Dialogs(xlDialogPrint).Show End If Next i Next j End Sub