エクセルVBAでのデータ抽出についての質問です

このQ&Aのポイント
  • エクセルVBAを使用して、シート1から指定した列のデータのみを抽出したい場合、マクロを使用することが可能です。
  • 通常、データベースでクエリを使用してデータを抽出しますが、マクロを使用することでデータベースにアクセスせずに抽出することができます。
  • マクロを使用することで簡単にデータ抽出ができるため、エクセルVBAを活用することをおすすめします。
回答を見る
  • ベストアンサー

エクセルVBAでのデータ抽出についての質問です。

エクセルVBAでのデータ抽出についての質問です。 下記のような2つのシートがあります。 (シート1) AA BB CC DD EE FF GG HH ←タイトル(複数固定) ああ いい うう ええ おお かか きき けけ ←値 ささ しし すす せせ そそ たた なな はは ←値 まま みみ むむ めめ もも らら りり るる ←値 (シート2) AA FF HH ・・・ ←タイトル(数は変更あり) シート1にタイトルの付いたデータが100列ほどありまして、 シート2に抽出したい列だけのタイトルを並べたとします。 このシート2のタイトルに入れたデータのみをシート1から列ごと 抽出してきたい場合、マクロで可能でしょうか。 本来はアクセスなどを使ってデータベースでクエリ抽出してくるものだと思いますが、 マクロでなんとかしたいと思っております。

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

  • ベストアンサー
回答No.5

debunyanko-28です。 自由に変更してもらって構いませんよ。 ちなみに私なら以下のようにします。 Sub test4()   Dim Ws1 As Worksheet   Dim Ws2 As Worksheet   Dim myRange1 As Range   Dim myRange2 As Range   Dim c As Range   Dim i As Variant   Set Ws1 = Worksheets("item_list.tsv")   Set Ws2 = Worksheets("商品")   Set myRange1 = Ws1.Range("A1", Ws1.Cells(1, Columns.Count).End(xlToLeft))   Set myRange2 = Ws2.Range("A1", Ws2.Cells(1, Columns.Count).End(xlToLeft))   For Each c In myRange2     i = Application.Match(c.Value, myRange1, 0)     If Not IsError(i) Then       Ws1.Range(Ws1.Cells(1, i), Ws1.Cells(Rows.Count, i).End(xlUp)).Copy _         Destination:=c     End If   Next c   Set Ws1 = Nothing   Set Ws2 = Nothing   Set myRange1 = Nothing   Set myRange2 = Nothing End Sub

makilon03
質問者

お礼

なるほど。1行目からにすればタイトルなので重複しないですね。 ありがとうございました。

その他の回答 (4)

回答No.4

ごめんなさい。 前回は間違ってます。 訂正版です。 Sub test2()   Dim Ws1 As Worksheet   Dim Ws2 As Worksheet   Dim myRange1 As Range   Dim myRange2 As Range   Dim c As Range   Dim i As Variant      Set Ws1 = Worksheets("Sheet1")   Set Ws2 = Worksheets("Sheet2")   Set myRange1 = Ws1.Range("A1", Ws1.Cells(1, Columns.Count).End(xlToLeft))   Set myRange2 = Ws2.Range("A1", Ws2.Cells(1, Columns.Count).End(xlToLeft))      For Each c In myRange2     i = Application.Match(c.Value, myRange1, 0)     If Not IsError(i) Then       Ws1.Range(Ws1.Cells(2, i), Ws1.Cells(Rows.Count, i).End(xlUp)).Copy _         Destination:=c.Offset(1)     End If   Next c   Set Ws1 = Nothing   Set Ws2 = Nothing   Set myRange1 = Nothing   Set myRange2 = Nothing End Sub

makilon03
質問者

お礼

ありがとうございます。 1点だけ、説明に書いてませんでしたが、シート1にデータがないパターンがあり、 その場合タイトル列まで、コピーされてしまうので下記のように追加させて頂きました。 Sub test3() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c As Range Dim i As Variant Dim r As Long Set Ws1 = Worksheets("item_list.tsv") Set Ws2 = Worksheets("商品") Set myRange1 = Ws1.Range("A1", Ws1.Cells(1, Columns.Count).End(xlToLeft)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(1, Columns.Count).End(xlToLeft)) For Each c In myRange2 i = Application.Match(c.Value, myRange1, 0) If Not IsError(i) Then r = Ws1.Cells(Rows.Count, i).End(xlUp).row If r = 1 Then r = 2 Ws1.Range(Ws1.Cells(2, i), Ws1.Cells(r, i)).Copy _ Destination:=c.Offset(1) End If Next c Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

回答No.3

一つの例ですが・・・ タイトルの行は一列目の前提です。 Sub test()   Dim Ws1 As Worksheet   Dim Ws2 As Worksheet   Dim myRange1 As Range   Dim myRange2 As Range   Dim c As Range   Dim i As Long      Set Ws1 = Worksheets("Sheet1")   Set Ws2 = Worksheets("Sheet2")     Set myRange1 = Ws1.Range("A1", Ws1.Cells(1, Columns.Count).End(xlToLeft))   Set myRange2 = Ws2.Range("A1", Ws2.Cells(1, Columns.Count).End(xlToLeft))      For Each c In myRange2     If IsError(myAns) = False Then       i = Application.Match(c.Value, myRange1, 0)       With Ws1         .Range(.Cells(2, i), .Cells(Rows.Count, i).End(xlUp)).Copy _           Destination:=c.Offset(1)       End With     End If   Next c   Set Ws1 = Nothing   Set Ws2 = Nothing   Set myRange1 = Nothing   Set myRange2 = Nothing End Sub

makilon03
質問者

お礼

テストさせて頂いたところうまく動作しました! あとはWsのシート名を変更するなどしてアレンジさせていただきます! 本当にありがとうございました!! それにしても無駄がなくて綺麗なソースですね。動作も早いです。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

たとえばシート2のA2に =HLOOKUP(A1,Sheet1!A1:H4,2,FALSE) とかでいけると思いますが。マクロがいいのでしょうか。

makilon03
質問者

補足

回答ありがとうございます。 HLOOKUPも考えたのですが数が多いのと 同じ動作を毎回繰り返す必要があるので、 マクロがいいのであります。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.1

こんばんは makilon03さんの腕次第ですが、可能です。 手作業でやるとしたら、 1.結果出力用にシート3を用意する 2.シート2のリストを上から一つずつチェックして、シート1に同名のタイトルがあればシート3にコピー 3.以下、シート2のリストが終わるまで繰り返し。 です。 →この手順をExcel VBAで組むことが出来ます。 >本来はアクセスなどを使ってデータベースでクエリ抽出してくるものだと思いますが、 元データがデーターベース向きではなさそうなので、アクセス使うと余計に難しくなりそうです。Excel VBAの方が柔軟な対応が出来ます。 Find End(xlup) For がキーワードです。

関連するQ&A

  • 条件に合ったデータを抜き出す

      A   B   C   D 1 あ   AA   VV   FF 2 い   CC   FF   HH 3 あ   SS   FF   DD 4 う   SS   EE   AA 以上のようなデータが有るときに、別シートに A列のデータを条件に以下のように抜き出したいのです。 別シートの各セルに式が入っていて、上記データを 変更しても別シートの抽出結果が自動で変わるようにしたいです。 ”あ”の抽出   あ   AA   VV   FF   あ   SS   FF   DD ”い”の抽出   い   CC   FF   HH ”う”の抽出   う   SS   EE   AA

  • Excelでのデータ抽出

    Excelで外部結合風のデータ抽出を教えてください。 シートAとシートBに表形式のデータがあり、 シートAのA列の値とシートBのA列の値が一致するシートBの 行を抽出するのが目的です。 具体的には次のような感じです。 シートA         シートB ----------------  ---------------- A列 | B列 | C列     A列 | B列 | C列 ----------------  ---------------- 2  | 2B  | 2C      1  | 1BB | 1CC ----------------  ---------------- 4  | 4B  | 4C      2  | 2BB | 2CC ----------------  ---------------- 6  | 6B  | 6C      3  | 3BB | 3CC ----------------  ---------------- ↓ シートB ---------------- A列 | B列 | C列 ---------------- 2  | 2BB | 2CC ---------------- 以下以外の方法がありましたら教えてください。 1)アクセスに両シートのデータを取り込み、2つのテーブルを外部結合で連結させる。 2)マクロで二重ループをつくり、A列が一致した行を取り出す。 よろしくお願いします。

  • excel データ抽出方法

    こんいちは 列1と列2を比べて条件が一致したデータを抽出したいのですが,方法がわかりません。どなたかご存知のかた教えていただけないでしょうか? 列1  列2 aa   vv bb   dd cc   ff dd   aa ee   bb この場合aa,bb が一致する。

  • エクセルで、データのある行だけを抽出したい。

    エクセルのSheet1にデータが入っており、セルが空白でない行のデータのみを、Sheet2に抽出したいと思っています。 Sheet2にあらかじめ関数を入れておく方法にしたいため、関数について教えてください。 タイムテーブルで予定を管理するような表で、A~Hまでにデータが入っています。 予定を入れる際にはE列には必ず入力をするため、E列が空白でない行のみを抽出したいです。 A|B|C|D|E|F|G|H 月|日|時間|… 11|22|10:00|… 11|22|10:30|… 時間枠は10:00~17:00の30分刻みで、1日15行使用するので、1年で5475行まで使用します。 1行目はタイトル行なので、データは2行目から入力しています。 フィルタオプションで抽出する方法や、それをマクロで登録しておく方法は分かったのですが、あとから予定を追加することがあるため、マクロを実行する度にデータが置き換わると困ってしまいます。 また、抽出したSheet2のI列以降には備考などを入力したいため、やはり後から列がずれると困るため、A~H列に関数を入れておく方法で実行したいと思います。 よろしくお願いいたします。

  • エクセル データ抽出について

    (データ)    A B C 1  I あ 20 2  II い 30  3  III う 10 4  IV あ 10 5  V い 20  6  VI う 30 したい事(1) A列のうちいずれかの項目を入力すると、B列の該当値を抽出 したい事(2) (1)のB列該当値が検索一行目で抽出されたら、その値からC列の値を抽出したい 困っていること・・・B列に全く同じ名前の項目があるため、抽出すると 先に来る値が飛んできてしまう 例:IVを入れると「あ」が自動で抽出され、その「あ」でさらに「10」を抽出したいのに、先にあるC1の「20」が飛んできてしまう。 それぞれ、(1)(2)にどのような関数を入れると、抽出したい値が出てくるでしょうか?

  • VBAのデータ抽出について

     列  A   B   C 行1 番号  色   形  2  1   白   丸  3  2   赤   三角  4  1   赤   丸  5  3   黄   四角 (1)Excel Sheet1にコマンドボタン1があり、それをクリックするとUserForm1が表示されます。 (2)UserForm1には「番号」「色」「形」の各コンボボックス1,2,3が配置されています。 (3)各コンボボックス1,2,3に表示されるのは、Sheet1の各列のデータです。 (4)コンボボックス1,2,3のうち1つ選択→その条件に合うデータを抽出。  コンボボックス1,2,3のうち2つ選択→その2つの条件に合うデータを抽出。  コンボボックス1,2,3のうち3つ選択→その3つの条件にあるデータを抽出。 (5)Sheet1のコマンドボタン2をクリックすると、Sheet1は元のデータ一覧に戻る。 というようなプログラムを組みたいと思っています。 (4)のデータ抽出、(5)の戻し方がよくわかりません。 どなたかご教授下さい。

  • エクセル 抽出マクロについて

    はじめまして。マクロ初心者です。 エクセルで抽出結果を別シートにコピーしたいのですが、 抽出条件が2列にわたっています。 A     B      C      D 日付   タイトル   分類(あ)  分類(い) 11/22   テレビ    3      2 12/15   ラジオ    1      4 11/18   雑誌     2      5 …というような感じです。 例えば分類が「2」のものを抽出したい時に、 ●シート1のあるセルに「2」と入力してマクロを実行。  ↓ ●シート2に以下のように結果をコピーして表示。 A       B 日付     タイトル 11/22     テレビ 11/18     雑誌 という具合にしたいのです。(C列、D列は表示しない) データはシート3に入力されていて、今後どんどん増えていく予定です。 エクセルは2007です。 本やホームページを参考に試行錯誤したのですが、うまくいきません…。 どなたかご回答よろしくお願いいたします。  

  • エクセルでデータ抽出するには?

    まったくのエクセル初心者です。 エクセルで、シート1のデータの特定科目を抽出してシート2にコピーしたいのです。 シート1のデータは 5/1 消耗品    2500 5/3 水道光熱費  8000 5/5 消耗品     700 5/7 消耗品    1200 この中から消耗品と記入されている行をシート2に抽出したいのです。 マクロは全然わかりません。。簡単にできる方法は無いでしょうか?よろしくお願いします。

  • Excel データの抽出について

    年始のお忙しいところ失礼いたします。 Excelにおけるデータ抽出についてお尋ねいたします。 抽出元データは左から1番目のシートのA列から順に、日付、部門名、商品名、数量0、記号、数量1、記号、数量2、記号、数量3、記号、残り数量となっています。 残り数量の列には、『=数量0-数量1-数量2-数量3』 という数式が記述してあります。 今回は、左から3番目のシートに、商品名、数量0、残り数量の3列の条件式を入力する場所と条件式に合致するデータを表示する場所を作成して、条件式に合致するデータを抽出することを検討しています。 条件式 商品名列:商品名の中から1つの商品を抽出 数量0:数量0=40、数量0<=10など数量0の値が入力した任意の数量と=またはは、以下(<=)を抽出 残り数量:残り数量<>0、残り数量<=20など残り数量の値が0以外か、入力した任意の数量以下を抽出 条件式を書き換える(抽出条件を変更する)ことが多いため、書き換える(条件を変更する)たびに、表示されるデータが更新されるようにしたいです

  • VBAを使った、Excelでのシート間データ抽出

    はじめまして。みなさまどうか教えてください。 Sheet1にはA列に250行程、コードが存在します。 Sheet2にはA列(コード)からI列まで、そして1000行程データが存在します。 Sheet1にあるコードは重複はなく、Sheet2のコード内に必ず同じコードがあります。 Sheet2にも重複コードはありません。 そこでSheet1のコードを使い、Sheet2を検索し、同一コードのデータ(A列からI列の行すべて)を全て(250件分)、Sheet1のコード記載順(A1、A2、A3・・・・)で、Sheet3に抽出したいのです。 どうか、よろしくお願いします。