- ベストアンサー
MicrosoftエクセルでマクロVBAを使って特定の行を抽出する方法
- MicrosoftエクセルでマクロVBAを使って特定の行を抽出する方法をご紹介します。プログラムがわからなくても大丈夫です。
- sheet1、sheet2、sheet3の各シートから特定の条件に該当する行を抽出する方法を説明します。抽出された行はsheet4に貼り付けられます。
- プログラムを実行するためには、モジュールmoduleにコードを貼り付けるだけで終わります。簡単に特定の行を抽出することができます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No1の追加です。 モジュールのコードを記載する画面の一番上に Option Base 1 を追加してください。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
これこそ丸投げの質問で、まる写しを希望しているが、もう少し本なり、WEBの例題を調べて、勉強して、行き詰まった点に絞って質問すべきだ。 適した一部の人を除いて、例えスクリプトでもプログラムの独学は時間がかかり難しいと思う。そっくりのコードを書いてくれでは、進歩しないと思う。 ーー それに添付画像がぼやけて読みにくい。回答者は、テストデータで自分のコードをテストして、確認すると思うが、そのテストデータ作りを回答者にやれというのは手数がかかる。 下記のような質問の書き方を参考にしてみて。 ーー 例示するのは、シート数は複数の場合2,3シートで済むし、行数も4-5行程度あれば済むことが多い。 ーー テストデータ(セルにコピー貼り付けして、データー区切り位置でセルにバラける) Sheet1 A-D列 1a x1 x1 ○ 2a x2 x2 3a x3 x3 4a x4 x4 5a x5 x5 ○ 6a x6 x6 7a x7 x7 8a x8 x8 Sheet2 A-D列 1b xb1 xb1 ○ 2b xb2 xb2 3b xb3 xb3 4b xb4 xb4 ○ 5b xb5 xb5 6b xb6 xb6 7b xb7 xb7 ○ 8b xb8 xb8 Sheet3 A-D列 ○ 1c XC1 XC1 2c XC2 XC2 3c XC3 XC3 ○ 4c XC4 XC4 5c XC5 XC5 6c XC6 XC6 7c XC7 XC7 ○ 8c XC8 XC8 標準モジュールに Sub test01() Set sh4 = Worksheets("Sheet4") '集約シート j = 2 ’Sheet4での行番号ポインタ,初期設定 For Each sh In Worksheets If sh.Name <> sh4.Name Then '処理対象にしない ’MsgBox sh.Name For i = 3 To 23 If sh.Cells(i, "A") = "○" Then ’ MsgBox i ' sh4.Range(Cells(j, "A"), Cells(j, "C")) = sh.Range(sh.Cells(i, "B"), sh.Cells(i, "D")) '個別セル代入法 'sh4.Cells(j, "A") = sh.Cells(i, "B") 'sh4.Cells(j, "A") = sh.Cells(i, "C") 'sh4.Cells(j, "A") = sh.Cells(i, "D") ' コピー貼り付け法 'sh.Range(sh.Cells(i, "B"), sh.Cells(i, "D")).Copy sh4.Cells(j, "A") ' 一旦配列に代入法 c = sh.Range(sh.Cells(i, "B"), sh.Cells(i, "D")) sh4.Range(Cells(j, "A"), Cells(j, "C")) = c j = j + 1 End If Next i End If Next End Sub ーー 結果 Shee4 2a x2 x2 6a x6 x6 2b xb2 xb2 5b xb5 xb5 8b xb8 xb8 1c XC1 XC1 4c XC4 XC4 8c XC8 XC8 すでに配列に入れる方法が回答があるようだが FOR EACH法もあり便利な点もある。 何が便利か勉強のこと。 ーー 該当データをSheet4に移すとき (1)Copy・貼り付け法 (2)項目(=列)の各セルを列挙法 (3)ヴァリアント配列法 などがある。この考えは今後、役に立つと思う。 ーーー 手を抜いているが、上記コードで不適当な点がある。何か考えてみて。
- Prome_Lin
- ベストアンサー率42% (201/470)
Option Explicit Sub Test() Dim s, t As Sheets Dim i, j, k, l As Integer l = 0 For i = 1 To 3 Set s = ThisWorkbook.Worksheets(i) For j = 3 To 23 If s.Cells(j, 1).Value = "○" Then l = l + 1 For k = 4 To 6 ThisWorkbook.Worksheets(4).Cells(l, k).Value = s.Cells(j, k).Value Next k End If Next j Set s = Nothing Next i End Sub 3つのシートを調べるので「For i = 1 to 3」としています。 調べるシートを「Set」しています(このとき、シートの名前は何でも構いません。左端から、順番に1、2、3となります)。 それぞれのシートの3行目から23行目まで調べます。 「A」列に「○」があれば、「D」列から「F」列を4番目のシートにコピーします。 以上です。
- kkkkkm
- ベストアンサー率66% (1719/2589)
こちらを貼り付けて実行 シート名Sheet1などは実際のシート名に変更してください。 Sub Example() Dim sh(4) As Worksheet Dim i As Long, j As Long, k As Long Set sh(1) = Worksheets("Sheet1") Set sh(2) = Worksheets("Sheet2") Set sh(3) = Worksheets("Sheet3") Set sh(4) = Worksheets("Sheet4") k = sh(4).Cells(Rows.Count, "A").End(xlUp).Row + 1 If k < 3 Then k = 3 End If For i = 1 To 3 For j = 3 To 23 If sh(i).Cells(j, "A") = "◯" Then ' sh(i).Cells(j, "A").Resize(1, 6).Copy sh(4).Cells(k, "A").Resize(1, 6) ' 書式の設定も移したい場合には↑左端の'を消し↓の左端に'を入れる sh(4).Cells(k, "A").Resize(1, 6).Value = sh(i).Cells(j, "A").Resize(1, 6).Value ' データだけで移す↑ k = k + 1 End If Next j Next i For i = 1 To 4 Set sh(i) = Nothing Next i End Sub
お礼
ありがとうございます。出来ました。