• ベストアンサー

【エクセルVBA】2つの条件からデータを抽出して、表を作る方法

エクセル2003VBAでの質問というか、回答を知りたいのです・・・ 例えばエクセルで下記のようなデータがあり  A列      B列    C列 1 JJJAAA      あ    1000 2 KKKBBB     い    2000 3 KKKCCC     う    1000 4 LLLBBB     あ    1000 5 LLLDDD     い    1000 6 MMMEEE     う    2000 7 MMMAAA     あ    2000 8 NNNEEE     あ    3000 下記のような、 A列      B列 C列 D列 1         あ  い  う  2 JJJAAA 3 KKKBBB 4 KKKCCC 5 LLLBBB 6 LLLDDD 7 MMMEEE 8 MMMAAA 8 NNNEEE 表枠が出来上がった中に数字を入れていく(データの入らないマスは空白)、 ようなものを作りたいのですが、全く出来ませんでした。 どなたか教えていただけないでしょうか? 回答を見て勉強させてください。 よろしくお願いします。

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

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

>なんとかVBAでご回答いただけないでしょうか。 VBAなら以下のようになります。 条件は、  ・元データのシート名がSheet1  ・出力先のシートが同じブックのSheet2  ・出力先のシートには、「見出し」として1行目とA列の値が入力済み とします。 Sub test()  Dim i As Long  Dim Gyo, Retsu As Range  ThisWorkbook.Activate  Worksheets("Sheet2").Select  With Worksheets("Sheet1")   For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row    Set Gyo = [A:A].Find(.Cells(i, "A"), lookat:=xlWhole)    Set Retsu = [1:1].Find(.Cells(i, "B"), lookat:=xlWhole)    If Not (Gyo Is Nothing Or Retsu Is Nothing) Then Cells(Gyo.Row, Retsu.Column) = .Cells(i, "C")   Next i  End With End Sub

aisenyou
質問者

お礼

さっそく試してみて出来ました。 No.3のかたが言っていたようにFindを使うんですね。 教えていただいたコードをただ貼り付けて使うんではなく、 これから理解していこうと思います。 わがままな質問にお付き合いくださいまして ありがとうございました。

その他の回答 (4)

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

補足です。 imogasiさんがおっしゃる >これらは2つのシートが関係しているので、これをどう区別して扱うか知ってないとならない。 は、  Worksheets("Sheet2").Select  With Worksheets("Sheet1")  … End With で解決しています。 シートを特に指定しない場合には、Sheet2が採用されます。 シートを指定した場合にはそのシートがシートが採用されますが、Worksheets("Sheet1")も頻繁に出てきますので、表記を簡単にするために With Worksheets("Sheet1") を使って、頭に“.”がついていたら、「Worksheets("Sheet1")」が省略されたものとする、という指示を出しています。 また、 >最終行まで繰り返すということで、入れ子になったfor~next 最終行の取得は「決まり文句」です。 かつては [A65536].End(xlUp).Row を使いました(バージョン2003以前に対応です)。 バージョン2007で使用できる行数が増えましたので、2007とそれ以前の、両方のバージョンに対応できるよう Cells(Rows.Count, "A").End(xlUp).Row としました。 もっとも、どちらも、「扱える最後の行までデータを入力しない」ということを前提としています。 >処理がまだ頭の中ですんなり思い描けないでいます。 これは、アドバイスできません。 慣れるしかありません。 p(^^)q

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

VBAのコードを回答者に書かせる要望だが、規約違反。自分で勉強し、もう少し論点を絞って質問のこと。 エクセル関数でも出来る課題であって、VBAで出来ないなら関数で我慢するのが普通だと思う。 ーー まず行としてA列に原データに出てくるJJJAAA 等の、重複無く、漏れの無い一覧データは出来ているのか。 同じくB列の、あいう・・も重複無く、漏れの無い一覧データは出来ているのか。 これらも、データーフィルターフィルタオプションー「重複するレコードは無視する」で作れる。 これもVBAでやらないと気がすまないのか。 原データB列の場合も、重複無く、漏れの無い一覧データは「重複するレコードは無視する」で作って、形式を選択して貼り付けで「行列を入れ替える」で第1行目に横方向に並べられる。 これがイヤならVBAでどうすればよいか考えるのが第1の課題だ。 また処理が進むと同時に重複の無いリストを作って行くロジックも考えられる。 またA+B列でデータはユニークなのかどうか質問に書いてないのは こういう処理の経験の無さをうかがわせる。ユニークでなければ 同じのが現れると足し算するのか。 ーー 上記が出来てしまえば、A列のコード(JJJAAAなど)を、Sheet2のA列データのどこ(何行目)になるかFindメソッドで見つけ、また原データのB列の「あ、い、う」はSheet2の第1行のどこ(何列目)に有るかをFindメソッドで探す。 Sheet2のi行、j列に有ることがわかれば、Cells(i,j)=「原データC列」と書けば仕舞い。 少し正確には Worksheets("Sheet2").cells(i,j)=)=「原データC列」 これを最終行まで各行繰り返す。 これらは2つのシートが関係しているので、これをどう区別して扱うか知ってないとならない。 ーー 本課題はVBAの中級の課題だと思う。上記で何のことを言っているかピンとこないなら、この課題は質問者にはやるには早すぎると言うことと思う。

aisenyou
質問者

お礼

回答ありがとうございます。 >データーフィルターフィルタオプションー「重複するレコードは無視する」で作れる。 フィルタオプションで重複のないデータを抽出することは マクロの記録を参考にできました。 >A+B列でデータはユニークなのかどうか 説明不足ですみませんでした。 原データ側に漏れはなく、A列+B列はユニークなデータです。 Findを使用する方法があるのですね、調べてみます。 最終行まで繰り返すということで、入れ子になったfor~next の処理がまだ頭の中ですんなり思い描けないでいます。。。

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

こんばんは VBAでも、関数でもないのですが「ピボットテーブル」はいかがでしょうか この機能を使うには、まず、タイトル行を挿入しておいてください。 データのある範囲を元に、ピボットテーブルを作ったら、 「行のフィールド」にA列 「列のフォールド」にB列 「データアイテム」にC列 をそれぞれドラッグ&ドロップします。 総計が不要ならばオプションで 「列の総計」「行の総計」のチェックを外してください。

aisenyou
質問者

お礼

回答ありがとうございます。 出来ました。ピポットテーブルも表を作るのに便利ですね。 ただ今回はVBAでの方法を募集しています。 VBAの勉強がしたいものでして・・・ なんとかVBAでご回答いただけないでしょうか。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! VBAではないので、希望に添えない場合は、無視してください。 関数を使った方法で ↓の画像のように、Sheet1のデータをSheet2に表示させるようにしています。 作業列を使っていますので、目障りであれば作業列を非表示にしてみてください。 まず、Sheet1の作業列のD2セルに =A2&B2 としてオートフィルで下へコピー 次にSheet2のB2セルに =IF(ISERROR(INDEX(Sheet1!$C$2:$C$9,MATCH($A2&B$1,Sheet1!$D$2:$D$9,0))),"",INDEX(Sheet1!$C$2:$C$9,MATCH($A2&B$1,Sheet1!$D$2:$D$9,0))) という数式を入れて、列方向と行方向にオートフィルでコピーすると ↓の画像のような表になります。 以上、参考になれば幸いですが、 他に良い方法があれば軽く読み流してくださいね。m(__)m

aisenyou
質問者

お礼

すいません、関数なら私もなんとか出来るんですよ^^; 今回はマクロで表を作成したいものでして・・・ でも、わざわざありがとうございました。

関連するQ&A

  • excelで条件に一致するデータ全てを抽出する方法

    現在、エクセル2003を使用しています。 A列・B列・C列にデータが入力されています。 ただし、空白セル(空白行)もあります。 A列に“@Name”とデータ入力がある場合 同じ行のC列の値を抽出したいと思います。 A列に@Nameは複数ありますが、C列の値は それぞれ違いますので、データの集計先はF列に 全て抽出をしたい。 なにか良い方法(VBAや関数)がありましたら 教えてください。

  • Excel VBAでデータを自動処理したい

    Excelで大量のデータ処理をしなくてはならないのですが、以下の処理をExcel VBAで自動処理できないでしょうか? どなたかお知恵をお貸しください。 (1)A、B、C列からなるリストがあります。A,B列にはそれぞれオートフィルタが設定してあり、C列は空白です。A列、B列にそれぞれ条件を設定し、抽出したデータのC列(空白)に特定のデータを入力します。A列、B列2つの条件の組み合わせが100通りくらいあり、現在手動でオートフィルタを設定し、C列にデータを入力しております。例えばA,B列の条件の組み合わせと、それに対応するC列に入力するデータを表にしたテーブルを別に作り、A,B列の条件を自動に設定して、抽出し、C列にデータを自動に入力することを、テーブルの一番上の行から最後の行まで繰り返す、というようなことをVBAでExcelにしてもらいたいのです。自分でちゃんと勉強し、調べて、それでも分からなかったらお聞きするというのが筋だと思うのですが、今この仕事に追われて、時間がありません。(ほとんど毎日午前様です。)この仕事が片付いたら、じっくりVBAを勉強したいと思っております。どうぞよろしくお願いいたします。

  • エクセル データ抽出と合計の方法がありますか。

    エクセル データ抽出と合計の方法がありますか。 下記のようなデータがあるとします。 A列  B列 10  111 20  222 30  111 40  111 50  333 結果を D列  E列 111  80 222  20 333  50 としたいです。 つまりB列から存在する数字列を抽出し、それに該当するA列の合計を出したい。 D列へB列に存在する数字列を手入力し、 E列へ =SUMIF(B:B,D1,A:A) と入れておいて表示されるところまでしたのですが、 「D列へB列に存在する数字列を手入力」を手入力ではなく関数で抽出してくることは可能でしょうか。 何卒ご教示いただけますようお願いします!!!

  • Excel データの抽出について教えて下さい。

    初めて質問させて頂きます。 Excelでデータの抽出と言ったらいいでしょうか・・・ 「一定の条件に当てはまった場合に、別のセルに数字を入力する」 というような処理をしたいのですが、データ量が多くて、 どのようにやったら効率がいいのか、頭を悩ませています。 例えば・・・       A列  B列 1行目  111   A 2行目  112   B 3行目  115   C 4行目  115   C 5行目  118   D といったようなデータが1500件ほどあります。 このデータを使って、A列の中で番号が2つ(又は3つ等)あるものに、      A列   B列  C列 1行目  111   A 2行目  112   B 3行目  115   C    1 4行目  115   C    1 5行目  118   D といった感じで決まった数字を表示する方法がないでしょうか? こんな説明でご理解頂けるかどうか、心配なんですが・・・。 いい方法をご存知の方がいらっしゃいましたら、力を貸して下さい。

  • excel vba データリストからの抽出

    excel vbaで、以下のような事をしたいと思っています。 【sheet1】データ   A  B C D E  1 あ い う え お 2 か き く け こ 3 あ き く せ そ 4 さ  し す せ そ 5 あ し す け こ 【sheet2】検索 A1を検索条件セルにする ※検索キーはsheet1のA列に登場するテキストのみです。   A  B  C  D  E 1 あ い う え お 2   き く せ そ 3    し す け こ 4 5 ※A2、A3に"あ"と表示されてしまってもよいのですが、  出来れば表示なしが望ましいです。 sheet2のA1は、sheet3に、sheet1のA列に登場したテキストをデータとしてリストしておき、 「データの入力規則」でリストから選択できるようにしようと考えています。 説明が下手でうまく伝わらないかも知れませんが、うまいやり方があれば どうかご教示下さい。 宜しくお願い致します。

  • エクセル最小値から4つ抽出する方法を教えてください

    エクセルで指定する範囲内で、最小値から順番に4つだけ抽出する方法を教えてください。 このようなデータがあります。(実際はすべて8桁で、日付を文字列に変換したものです)   A  B  C  D  1 10    30  2 10    10 20 3 50    50 60 4    70 50 60 ・ ・ ・ A1~D1とA2~D2を1つの範囲(絶対)とし、最大で8個の数値となります。 次の範囲はA3~D3とA4~D4の8個となり、8個ずつが繰り返されます。 この8個のデータの中から重複なしで小さい順に、 A1、B1、A3、B4に反映させたいです。 こういう結果にしたい↓   A  B  C  D  1 10 20     2 30     3 50 60    4 70     ・ ・ ・ 範囲内の最大値は30と70であるため、B4は空白としたいです。 仮にそれぞれの範囲内に40と80があれば、その数値をB4に反映させたいです。 8個のデータは重複するものもあれば、しないものもあり、 空白のものもあれば、空白がないものもあります。 データ数が多いのでフィルタオプションの設定から行わないやり方で 何かあれば教えていただきたいです。 VBA、マクロができないので、関数でできればすごく助かります。 色んなサイトを検索しましたが、該当するものがなくて困っています。 よろしくおねがいします。

  • 一覧表よりデータ条件抽出

    教えてください。 下記データ表があります。    A     B      C 1  12/1  AAA  94.1% 2  12/2  BBB  95.6% 3  12/2  BBB  (空白) 4  12/3  CCC  97.3% 5  12/4  DDD  98.4% 6  12/5  EEE  97.3% ・したいこと条件説明 12/2~12/4のデータのみを抽出 %の(空白)セル(行)は抽出しない 日付(A列)は表示しない ・表示結果    A    B 1  BBB  95.6% 2  CCC  97.3% 3  DDD  98.4% としたいのですが・・・ いろいろ試してみましたが、うまくいきません。 よろしく、ご教授のほどお願いします。

  • エクセルのVBAでソートをしたい

    エクセルの A列に1,1,3,2,4・・・・・というデータがあって、 B列にB,A,C,D,E・・・・・というデータがった場合、 上から順番に1A,1B,2D,3C,4Eという順番に並べ替えしたいです。 エクセル単独でやる場合は、データの並べ替えでA列を第一優先、B列を第二優先で並べ替えをすればよいのですが、 VBAに埋め込んで、ボタンを押せば並べ替えできるようにできますでしょうか?

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

    エクセル2007を使ったVBAについて2つ質問です。 1つ目の質問は、5列目の右端の数字を2列目の右端に持ってくるため、 Range("B2").End(xlToRight).Next.Select ActiveCell.FormulaR1C1 = Range("A5").End(xlToRight) というVBAを組んだのですが、2列目に空白が入っている場合うまく動かないため動くように したいのですが、どのように組めばいいのかわかりません。 例    A     B     C     D     E     F     G     H     I     J     K 1  2 【数値1】  □    □     □     1     2     3     4     5  3 4 5 【数値2】   6     7     8     9     10 6 ※□は空白 上記の例の場合、5行目の右端である10を2行目の空白を除いた右端である5の隣に持っていきたいです。 2つ目の質問ですが上記例の2列目の両端(1と5)を選択してDeleteする方法がわかりません。 2つの質問についてわかる方おりましたら教えていただけると助かります。 よろしくお願いしします。

  • エクセル2003のVBAを教えて

    エクセル2003のVBAを教えてください。 次の対象データで、(1)(2)(3)の作業が出来るエクセルVBAを教えて下さい。 (1)(2)(3)個々のVBAでお願いします。 ●対象データ:種類(A列)、文字(B列)、    データの行数:不特定なので、データのある最終行までとします。 ●教えていただきたい項目  (1):種類だけを(C列)に取り出す。  (2):種類の先頭に空白の行を3行入れて、追加の2行目の種類(A列)に文字(B列)を入れる。  (3):種類が5行以上あるときは、5行ごとに空白行を追加する。 ●対象データ 種類(A列)   文字(B列) AA       あああ BB       いいい BB       いい BB       いいい CC       うう CC       うう DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ ●(1)のVBAの結果(このようになるVBAを教えてください。) (C列) AA BB CC DD ●(2)、(3)のVBAの結果(このようになるVBAを教えてください。) 種類(A列)    文字(B列) あああ AA        あああ いいい BB        いいい BB        いいい BB        いいい うう CC        うう CC        うう ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ

専門家に質問してみよう