- ベストアンサー
【Excel VBA】条件を満たすデータを順に抽出
Excel2003を使用しています。 CSVでExcelに取り込んだデータの中から、条件を満たすものを順に抽出して一覧表を作成するマクロを作りたいのですが。。。 ・Sheet2のB列に“コード”と入力されている行のC列のデータ → Sheet1のC列2行目以下 ・Sheet2のC列に“合計”と入力されている行のD列のデータ → Sheet1のD列2行目以下 に順に表示させたいのですが、うまくいきません。 以前、いただいた回答で参考になりそうなものを見てみたのですが、手順というか何かヒントのようなものをいただけたら、自分でどうにかできそうなので、質問させていただきました。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 ご質問が、分かりにくいのです。 >・Sheet2のB列に“コード”と入力されている行のC列のデータ → Sheet1のC列2行目以下 >・Sheet2のC列に“合計”と入力されている行のD列のデータ → Sheet1のD列2行目以下 これが、横並びするものか、それとも、別々のものかということです。横並びするにしても、必ず、コードと合計が一対にならないこともあるとか、話が複雑なこともあります。 そういう場合、次の「コード」という文字が現れるのを、トリガーにして、前のデータの書き出しするとか、それぞれ現れたら、別々にSheet1 のC列・D列に順送りしてよいのか、そういうところが見えてきません。 また、CSVというのにも関わらず、同じデータフィールドに、数値と文字列の混在があるように思います。そういうのを単純に考えてよいのか、いろんなことを考えてしまいます。 通常は、別々に考えるなら、ローテクですが、以下のようにすれば、良いわけですが……。 Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim i As Long Dim j As Long Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") j = 2 k = 2 '初期値 With Sh2 For i = 1 To .Range("B65536").End(xlUp).Row If .Cells(i, 2).Value Like "*コード*" Then Sh1.Cells(j, 3).Value = .Cells(i, 3).Value j = j + 1 End If If .Cells(i, 3).Value Like "*合計*" Then Sh1.Cells(k, 4).Value = .Cells(i, 4).Value k = k + 1 End If Next i End With
その他の回答 (1)
- pbforce
- ベストアンサー率22% (379/1719)
Sheets("Sheet2").Cells(i,2)が"コード"ならSheets("Sheet1").Cells(j,3)=Sheets("Sheet2").Cells(i,3)
お礼
回答ありがとうございます。 質問文に詳しく記載しておけばよかったのですが、条件の部分(回答をいただいた部分)は分かりますので、同様に書いています。 ループさせて、Sheet1の2行目以下に順に、該当のデータを表示させるところがうまくいっていない(?)ようでして、ループのさせ方を教えていただけないでしょうか? 再度の質問で恐れ入りますが、よろしくお願いします。
お礼
Wendy02 さん、こんにちは。 回答ありがとうございます。 まず、説明不足で申し訳ありません。 「CSVでExcelに取り込んだデータ」というのは、会社で使用しているシステムからCSV出力 → Excelに取り込んだデータでして、抽出するデータ部分については、数値と文字列の混在はない状態です。 このデータの状態をみて、“コード”と“合計”は入力されている列は違うものの、交互に現れるので、この規則性を利用して、それぞれSheet1 のC列・D列に順送りすれば、一覧表が作成できると考えたわけです。 おかげさまで、無事データを順に表示させることができました。 ループが複数であったり、条件があったりすると、まだうまくコードを書くことができません(>_<) 参考書を読んだり、以前ここで教えていただいたコードを参考にしたり、試行錯誤していますが、まだまだです(^^ゞ ありがとうございました!