質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

809閲覧

条件に一致した行を別のシートにまとめたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2023/04/19 07:43

前提・実現したいこと

VBA初心者です。
複数のシートの中から、条件に一致する(例えば、日付が2023/1/1以降のデータ)行を別のシートにまとめたいです。
色々なサイトを調べてコードを作成したのですが、どうしても上手くいかないため、質問をさせていただきました。

発生している問題

下記コードだと、F列(各シート開始日が入ってる列)の中に条件と一致するものがあれば、そのシートの全ての行が「まとめ」シートにコピーされてしまいます。

"If ws.Range("F" & lRow) >= Start_Day Then"
の入れる場所の問題かと、移動してみましたが、それでも結果は変わらず。

AutoFilterでも試して見たのですが、フィルターが上手くかかっていないシートがあったりと苦戦しております。

併せて、下記コードで動作が遅いことがあるので、軽くする方法があればそちらも教えていただきたいです。

よろしくお願いいたします。

該当のソースコード

Sub まとめテスト Dim data() As Variant Dim i As Long, j As Long, dRow As Long, lRow As Long Dim ws As Worksheet, ws01 As Worksheet Set ws01 = ThisWorkbook.Worksheets("まとめ") dRow = 2 Start_Day = ws01.Cells(1, 17) '開始日をまとめシート内のセルで都度指定 For Each ws In ThisWorkbook.Worksheets If InStr("/まとめ/sheet1/sheet2/sheet3/sheet4/sheet5/", "/" & ws.Name & "/") = 0 Then lRow = ws.Cells(ws.Rows.Count, "F").End(xlUp).Row If ws.Range("F" & lRow) >= Start_Day Then data = ws.Range("A2:M" & lRow).Value ws01.Range("A" & dRow).Resize(UBound(data, 1), UBound(data, 2)).Value = data dRow = dRow + lRow - 1 End If End If Next ws End Sud

補足情報

・まとめたいシートが増えたり減ったりするので、If InStr〜Thenで絞っています。
・A列は抽出したい行以上にデータが入っていることがあるので、F列で最終行を取得しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2023/04/19 13:08

最後の行のF列の値がStart_day以上なら、全行分をコピーしています。 1行ずつ、F列の値がStart_day以上かを判定し、Start_day以上なら、その行をコピーするようにしないとだめかと思いますが。
退会済みユーザー

退会済みユーザー

2023/04/20 02:23

コメントありがとうございます。 やはり、If ws.Range("F" & lRow) >= Start_Day Then の部分が問題なんですね。 修正をしてみます!
guest

回答1

0

ベストアンサー

無駄な部分があるかもしれませんが、下記コードで解決しました。

Sub まとめテスト Dim sourceWsN As Variant Dim sourceWs As Worksheet Dim targetWs As Worksheet Dim lRow As Long Dim i As Long Dim searchValue As String Dim sourceRange As Range Dim targetRange As Range sourceWsN = Array("sheet1","sheet2","sheet3") '前回の省きたいシート名と被ってしまいますが、今回は抽出対象のシート名として入れてます Set targetWs = ThisWorkbook.Worksheets("まとめ") For Each sheetName In sourceWsN Set sourceWs = ThisWorkbook.Sheets(sheetsName) lRow = sourceWs.Cells(sourceWs.Rows.count, 6).End(xlUp).Row Start_Day = targetWs.Cells(1, 17) Set sourceRange = sourceWs.Range("A2:M" & lRow) Set targetRange = targetWs.Cells(targetWs.Rows.Count, 1).End(xlUp).Offset(1) For i = 2 To lRow If sourceWs.Cells(i, "F").Value >= Start_Day Then sourceRange.Rows(i).Copy targetRange.PasteSpecial xPasteValue Set targetRange = targetRange.Offset(1) End If Next i Next sheetName End Sub

投稿2023/04/21 00:25

編集2023/04/21 00:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問