• 締切済み

VBA 複数条件の抽出

お世話になります。 sheet1~sheet100までのシートがあるとして、 可能とバスケ、普通とバスケがあったら、並んで バスケ バスケ 可能   普通 という文字を取り出したいです。 文言はいろいろな種類があり、野球、水泳などがあるとします。 それをVBAで行うにはどうすればいいでしょうか。 例)Sheet1 A B 可能   バスケ 可能  野球 不可能 野球 普通  水泳 普通  バスケ 可能  卓球 不可能 こういう表を作りたいです↓ 集計シート A B C D E F G~     卓球  卓球 バスケ バスケ テニス 野球 水泳     可能 不可能  可能  普通  可能 不可能 可能 sheet1   1 5 6 3 2~ sheet2 2 3 1 1 4 sheet3 4 3 3 3 1 sheet4 1 1 1 1 9 sheet5  2 3 1 1 4 よろしくお願いいたします。

みんなの回答

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.3

以下のフローで考えてみました. (1) Sheet1~Sheet100から B列,A列の形式で組合せをコレクションに抽出 (2) 作業シートにコレクションを出力 (3) A列昇順・B列昇順で並べ替える (4) COUNTIFS関数で集計を作成 (5) 作業シートの行列を入れ替えたデータを結果シートに貼り付ける Sub Macro1() Dim sh As Worksheet Dim shTemp As Worksheet Dim shResult As Worksheet Dim col As Collection Dim str As String Dim rng As Range Dim i As Variant Dim j As Variant Dim arry As Variant Dim shMax As Long shMax = 100 Set shTemp = Worksheets("作業") Set shResult = Worksheets("集計") ' 組合せをコレクションに抽出する Set col = New Collection For i = 1 To shMax Set sh = Worksheets("Sheet" & i) For Each rng In sh.Range("A:A") If rng.Value = "" Then Exit For str = rng.Offset(0, 1).Value & "," & rng.Value ' On Error Resume Next col.Add str, str On Error GoTo 0 Next Next ' tempシートの準備 shTemp.Activate shTemp.Cells.Clear ' コレクションから作業シートに出力する For i = 1 To col.Count arry = Split(col(i), ",") shTemp.Cells(i, 1) = arry(0) shTemp.Cells(i, 2) = arry(1) Next ' データを昇順に並べ替える With shTemp.Sort.SortFields .Clear .Add Key:=Range("A:A") .Add Key:=Range("B:B") End With With shTemp.Sort .SetRange Range("A:B") .Header = xlGuess .Apply End With ' シート行を挿入 shTemp.Range("1:1").Insert For i = 1 To shMax shTemp.Cells(1, i + 2).Value = "Sheet" & i Next ' COUNTIF関数を設定 shTemp.Range("C2") = "=COUNTIFS(INDIRECT(C$1 & ""!B:B""),$A2,INDIRECT(C$1 & ""!A:A""),$B2)" shTemp.Range("C2").Copy Range(shTemp.Range("C2"), shTemp.Cells(shTemp.UsedRange.Rows.Count, shTemp.UsedRange.Columns.Count)).PasteSpecial xlPasteFormulas ' 作業シートの行列を入れ替えて結果シートに貼り付ける shResult.Cells.Clear shTemp.UsedRange.Copy shResult.Range("A1").PasteSpecial xlPasteValues, Transpose:=True ' 最終処理 Application.CutCopyMode = False shTemp.Range("A1").Select shResult.Activate shResult.Range("A1").Select End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.2

ゴリゴリとコードを書いて、地道に数えるしかないだろうと思います。 ・作業シートに、100枚あるらしいシートから   シート名、A列語句、B列語句を集める ・A列語句、B列語句順に並べ ・2つの語句ごとの出力先列番号を4列目に採番 ・シーツ名順に並べ ・各レコードが何枚目のシートのデータかを5列目に採番 ・作業シートを先頭から読み取り、 ・集計シートに求める集計結果を出力する といった手順で(ちょっと手抜きですが)コードを書いてみました。 Sub sample()  Dim wsWork As Worksheet  Dim wsSyuk As Worksheet  Dim wshCnt As Long  Dim RowCnt As Long  Dim PutCnt As Long  Dim RetuNum As Long  Dim SheetNum As Long    Set wsWork = ThisWorkbook.Sheets("作業")  Set wsSyuk = ThisWorkbook.Sheets("集計")    wsWork.Cells.Clear  wsSyuk.Cells.Clear  PutCnt = 0    For wshCnt = 1 To ThisWorkbook.Sheets.Count   With ThisWorkbook    If ((.Sheets(wshCnt).Name <> "集計") And (.Sheets(wshCnt).Name <> "作業")) Then     RowCnt = 1     Do      If .Sheets(wshCnt).Cells(RowCnt, 1).Value = "" Then Exit Do      PutCnt = PutCnt + 1      wsWork.Cells(PutCnt, 1).Value = .Sheets(wshCnt).Name      wsWork.Cells(PutCnt, 2).Value = .Sheets(wshCnt).Cells(RowCnt, 2).Value      wsWork.Cells(PutCnt, 3).Value = .Sheets(wshCnt).Cells(RowCnt, 1).Value      RowCnt = RowCnt + 1     Loop    End If   End With  Next wshCnt    With wsWork   .Select   .Cells.Select   .Sort.SortFields.Clear   .Sort.SortFields.Add2 Key:=Range("B:B"), _     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal   .Sort.SortFields.Add2 Key:=Range("C:C"), _     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal   With .Sort    .SetRange Range("A:C")    .Header = xlGuess    .MatchCase = False    .Orientation = xlTopToBottom    .SortMethod = xlPinYin    .Apply   End With     RowCnt = 2   RetuNum = 1   .Cells(1, 4).Value = RetuNum   Do    If .Cells(RowCnt, 1).Value = "" Then Exit Do    If ((.Cells(RowCnt, 2).Value <> .Cells(RowCnt - 1, 2).Value) Or _      (.Cells(RowCnt, 3).Value <> .Cells(RowCnt - 1, 3).Value)) Then     RetuNum = RetuNum + 1    End If    .Cells(RowCnt, 4).Value = RetuNum    RowCnt = RowCnt + 1   Loop     .Cells.Select   .Sort.SortFields.Clear   .Sort.SortFields.Add2 Key:=Range("A:A"), _     SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal   With .Sort    .SetRange Range("A:D")    .Header = xlGuess    .MatchCase = False    .Orientation = xlTopToBottom    .SortMethod = xlPinYin    .Apply   End With     RowCnt = 2   SheetNum = 1   .Cells(1, 5).Value = SheetNum   Do    If .Cells(RowCnt, 1).Value = "" Then Exit Do    If .Cells(RowCnt, 1).Value <> .Cells(RowCnt - 1, 1).Value Then     SheetNum = SheetNum + 1    End If    .Cells(RowCnt, 5).Value = SheetNum    RowCnt = RowCnt + 1   Loop    End With    RowCnt = 1  Do   If wsWork.Cells(RowCnt, 1).Value = "" Then Exit Do   wsSyuk.Cells(wsWork.Cells(RowCnt, 5).Value + 2, 1).Value = _    wsWork.Cells(RowCnt, 1).Value   wsSyuk.Cells(1, wsWork.Cells(RowCnt, 4).Value + 1).Value = _    wsWork.Cells(RowCnt, 2).Value   wsSyuk.Cells(2, wsWork.Cells(RowCnt, 4).Value + 1).Value = _    wsWork.Cells(RowCnt, 3).Value       wsSyuk.Cells(wsWork.Cells(RowCnt, 5).Value + 2, wsWork.Cells(RowCnt, 4).Value + 1).Value = _   wsSyuk.Cells(wsWork.Cells(RowCnt, 5).Value + 2, wsWork.Cells(RowCnt, 4).Value + 1).Value + 1       RowCnt = RowCnt + 1  Loop End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

大きく分けると下記の3つの処理ブロックになろう。 (1)件数カウントの最終作業は、 For Each Sh In Worksheets If Sh.Name <> "集計シート Then 分類カウント処理==>集計シートにカウント計数を書き込み Next で繰り返し処理を行えば、済む。例え100にワークシートがあろうとも。 (2)B列に出てくる、語句と    A列に出てくる、語句の 1つずつの組み合わせを漏らさず、重複せず、組み合わせを100シートについて、 リストする。これがむつかしい(泥臭い作業になりそう) 各行について、A列語句+B列語句を、中間作業列(例C列)で作らせてもらえれば エクセルのフィルタの「重複するレコードは無視する」が、使える。ので楽 だが、どうかな。 この組み合わせを、集計シートの「第2行と第3行」の各列にセットする。 (3)各シートで、集計シートの第2行と第3行の語句の2つを、条件として、 エクセル関数(VBA)のCountifs関数を使って数えればよい。 それを集計シートのSheet(n)の該当行かつ、該当列にセットする。 ==== (1)(3)は多くの人が思いつくだろう。 しかし(2)はA,B列2列の組み合わせ語句で、出現しているものを 掴むのは、やや面倒。ぴったりの機能がエクセルにはないと思う。 1列データなら、前述エクセルのフィルタの「重複するレコードは無視する」が、使える、 と思う(VBAで行う)。 == ピボットテーブルなど思いは及ぶが、自信なし。 ACCESSならSQLが使えるので、やや処理がスッキリするかもしれないと夢想。 ====、 質問の書き方(模擬実例の挙げ方)が、正確さに欠けるように思うし、丸投げで、質問者は自分でどこまで」考えたか見えず、データ例も作るのは大変で、シート数も2-3ではないので、コードを作成して、挙げる気がしないよ。 いつもは、第I回答がすぐ出るのに、まだなのは、その辺もあるのでは。-

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBA 複数の条件を含む対象を抜き出す。

    エクセルVBAについて質問です。 エクセルのバージョンは2003と2007を主に使用しています。 下記の様なデータがあるときに、部活が「野球」でかつクラブは「囲碁」に入っている生徒の学籍番号を別のシート(Sheet2)のB3から下に順にリスト化するマクロがどうしても出来なくて困っています。 find next等を使うのでは無いかと色々してみましたが上手く出来ない現状です。 <sheet1>    A      B      C       D    E 1 学籍番号 学年    名前     部活   クラブ 2 2222222   1    山田 太郎   野球   囲碁 3 9854923    2   吉田 次郎   剣道   絵画   4 1111111    3   佐藤 三郎   野球   囲碁 5 8888883    1   米山 権蔵   卓球   囲碁

  • 複数条件抽出をVBAで

    excelの複数条件抽出をVBAでやりたいので教えてください。 エクセル2003で複数条件抽出をしたいと思っています。 dateのシートに、A列:日付、B列:名前、C列:金額があります。 それを1というシートに、日付と名前の2つの条件が合致している金額を抜き出したいと思っています。 抜き出すのは0601&AさんをA5セル~A20       0601&BさんのはB5~B20へ ということは可能でしょうか? もしよろしければ教えていただければ助かります。 'date'シート 日付   名前  金額 0601 Aさん  100円 0601  Aさん  120円 0601  Bさん  150円 シート'1' 0601&Aさん   0601&Bさん 100円           150円 120円 どの人がやってもボタン1つで実行できるようにしたいために、 VBA出できればと思っております。

  • 複数項目からのデータ抽出

     エクセルで部活動名簿を作っています。 この学校では、一人の生徒が複数の部活に所属しています。 シート1に下記のような名簿を作成しておいて   A   B   C  D    E   F   G ______________________________ 1 学年  氏名 性別 部活  部活  部活  部活 2  1  スズキ 男 バスケ       水泳 3  1 ヤマシタ 女       テニス 水泳 4  2  サトウ 女 バスケ            バレー 5  2  イトウ 男        テニス 6  3  タナカ 男 バスケ  テニス       バレー シート2に、たとえば「2 男 バレー」(2は、2年生ということ) と入力して、ボタンをクリックするとシート1の名簿から抽出されてシート2に表示されるようにしたいのです。 最初は複数抽出ではなく、バレー部ならバレー部、バスケ部ならバスケと抽出すればよかったので、マクロの記録を使って フィルタオプションの設定で指定した範囲を選択 シート1でリスト範囲を指定し 検索条件範囲は、シート2に部活 バレー部と入力しそこのセルを指定 抽出範囲でシート2の表示したいセルを選択しました。 マクロの記録を終了してから、ビジュアルベーシックエディタで 少しいじって、その後フォームでボタンを作成し そこにマクロを読み込ませて、そのボタンをクリックすると シート2に表示されるようにしました。  これで出来上がりと思ったら、依頼主からバレー部の中でも 学年でわけ、さらに性別で分けるようにしたいという要望があり いろいろと試してみたのですがうまく行かず・・・ お手上げ状態です。 ちなみに、私はエクセルは詳しくないです。 前回の抽出も、ネットや図書館で借りてきた本で調べ調べやっと出来たものです。  どうか、お力をお貸しください!よろしくお願いいたします。

  • 条件1つで複数の値を抽出することはできませんか。

    エクセルのことなのですが、条件1つで複数の値を抽出してきたいと思っています。 しかし、様々な本やインターネットのサイトを参照したのですがうまくできません。 内容なのですが、「シート1」というシートがありこのシートを「シート2」のように番号で分けて、横に並べるようなシートを作りたいと思っています。 シート1 番号 品目 100 A 100 B 101 C 101 D 101 E 101 F 101 G 101 H 101 I 102 J 103 K 103 L シート2 番号 品目 100 A B 101 C D E F G H I 102 J 103 K L すみませんが教えていただけないでしょうか。 よろしくお願いします。

  • エクセルVBA/抽出・貼付け

    下記を行いたいのですが、どのようなコードになるのでしょうか? シート001(入力用) (1)A1~A50、B1~B50、C1~C50、D1~D50  に数値、E1~E50に文字列 (2)F1~F50、G1~G50、H1~H50、I1~I50  に数値、J1~J50に文字列 ※空白行混在 シート002(計算用) シート001に作ったコマンドボタン:クリックにより、 シート002を表示させ、A1~E100に、 シート(1)のA1~E50とF1~J50の空白行以外を連続して 反映させたい。並べ替え用など別シートを用いずに、 VBAコード内で処理したい。

  • Excel VBAについて

    VBA初心者です。 社内の様式に合うようなVBAを組みたいのですが。。。 1,様式は表になっており1つのグループに5つの選択肢があり横に5グループ,縦に12グループあります。(例えば1行目にA1.A2.A3.A4.A5|B1.B2.B3.・・・・E3.E4.E5 2行目にF1.F2.F3.F4.F5|G1.G2・・・・12行目にBM1.BM2のような表) 2,シートは2枚あり1枚目のシートで選んだ1グループ1項目に1つだけ○がつく(ダブルクリックで選択し,違う項目を選択すれば前に選んだ項目の○は消える。) 3,1枚目に丸がついた項目が2枚目の任意のセルに表示される(例えば1枚目のシートのAグループのA3を選択すれば2枚目のシートの任意のセルにA3と表示され,取り消し変更された場合は変更後の選択肢のみ表示される) 4,また,選択する項目は変更されないように保護をかけたい。

  • VBAで2つの条件に合致するものを、表から抽出する方法を教えてください

       A     B   C    D    E ・・・ 1        0  10%  20%  30% 2  0     0   1   1.2  1.6 3 100以上  2  2.3  2.5  2.6 4 200以上  3  3.1  3.4  3.8 5 300以上  3  3.2  3.5  3.7 6 400以上  4  4.3  4.5  4.8 上記のような表がシート1にあります。 A列は売上、1行には前年比があり それぞれの条件に合致する係数を取得したいのですが シート2のA1セルに「売上」、A2セルに「前年比」を入力することで B1セルに係数が反映するようにはできるでしょうか? 例えば、A1「250」A2「13」と入力すると B1「3.1」と反映させたいのですが… 他の作業もあり、できればVBAで作成したいと思っています。 よろしくお願いいたします。

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

    エクセル2003 シート1     A       B      C 1  3月1日 A 100     *A列はカレンダーコントロールより選択としています 2  4月1日 B 100 3  3月1日 C 200     *B列はコンボボックスより選択としています 4  3月1日 D 200 5  4月1日 E 300     *C列は直接入力としています 6  4月1日 F 300 7  3月1日 G 100 8  4月1日 H 200 9  3月1日 I 200 10  4月1日 J 100 上記シート1の表のC列を下記シート2のC列に条件集計する シート2    A       B       C 1  3月1日   A~E     500    *選択した日付ごと及びA・B・C・D・Eの集計  2  3月1日   F~J     300    *選択した日付ごと及びF・G・H・I・Jの集計     3  4月1日   A~E     400    *選択した日付ごと及びA・B・C・D・Eの集計    4  4月1日   F~J     600    *選択した日付ごと及びF・G・H・I・Jの集計  すいませんが上記コードを教えてください 困ってます よろしくお願いします      

  • 複数列の条件抽出したCOUNT

    excelの質問をお願いします。 ___A B 1 ○ × 2 × ○ 3 ○ ○ A=○かつB=○の個数を集計したいのですが可能でしょうか? 集計表を作成しなければならないので、フィルタ等は使用できません。 イメージとしてはCOUNTIF(A1:A3,"○") AND COUNTIF(B1:B3,"○")という感じなんですが・・。 そもそも、こういう表を作ること自体、センス無しなんでしょうか? よろしくお願いします。

  • VBA 複数条件でデータを抽出する場合

    sheet1に下記のような(例)データベースがありA~BS列までデータが入力されています。 A  B C  D  E   F  G  H I J  BS 1 ○○様 ○○  2名  車   可 埼玉 *** *** *** 2015/7/1 2 ○○様 ××  3名  車  不可 東京 2015/8/1 3 ○○様 ■■  2名  電車 不可 愛知 2015/8/12 4 ○○様 □□  4名  バス  可  新潟 2015/7/13 5 ○○様 ○×  3名  バス  可  宮城 2015/6/1 6 ○○様 ■□  4名  車  不可 東京 2015/8/21 7 ○○様 □○  2名  バス  可  山梨 2015/8/7 「sheet1」のデータでBS列の期間(YYYY/MM/DD~YYYY/MM/DD)とG列の地域名(例:東京)を抽出条件とし、 抽出された結果のsheet1のA列~G列、BS列のみ(H列~BT列は不要)をSheet2のA11以下へ表示するマクロを組みたいと考えています。 A  B  C  D  E   F  G   BS 2 ○○様 ××  3名  車  不可 東京 2015/8/1 6 ○○様 ■□  4名  車  不可 東京 2015/8/21 複数条件下の抽出の場合、どのようなVBAのコードを使用すれば良いでしょうか。 宜しくお願いします。

このQ&Aのポイント
  • NS600/Jを使用して何もかも動作が遅いというお悩みがあります。
  • 購入当時から使用していないため、PCの動作が緩慢だと感じています。
  • ネット環境や他の機器の影響ではないため、PC自体の問題である可能性があります。
回答を見る

専門家に質問してみよう