- ベストアンサー
マクロについて質問です
- マクロを使って、指定した値を検索し、その値に関連するデータを抽出する方法を知りたいです。
- 質問文章のマクロを改良して、指定した値が出現した行のデータだけでなく、該当行の左側の列のデータも抽出できるようにしたいです。
- 現在のマクロでは、指定した値が出現した行のデータのみを抽出していますが、指定した値の出現した行の上下のデータも抽出できるように改良したいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2の補足 >A列の連番がない状態で同じようにできるのでしょうか。 いままではA列は最終行を取得するためだけに使っていましたので、 A列データがあってもなかっても対応するために、C列で最終行を取得してみました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, c As Range, lastRow As Long, wS As Worksheet Set wS = Worksheets("Sheet1") With Target If .Address = "$A$2" Then lastRow = Cells(Rows.Count, "A").End(xlUp).Row If lastRow > 4 Then Range(Cells(5, "A"), Cells(lastRow, "E")).ClearContents '←列番号を修正 End If Set c = wS.Range("B:B").Find(what:=.Value, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then For i = 1 To wS.Cells(Rows.Count, "C").End(xlUp).Row Step 3 '★←C列で最終行取得 If wS.Cells(i, "B") = .Value Then wS.Cells(i, "C").Resize(3, 3).Copy Cells(Rows.Count, "A").End(xlUp).Offset(1) '←Resizeで列も追加 End If Next i Else MsgBox "該当データなし" .Select .Value = "" End If End If End With End Sub ※ これでどうでしょうか?m(_ _)m
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
No.1です。 >項目の入った列がcからeだとしたらどこを変更するとよいですか とは、↓の画像のように元データのC~E列を表示すれば良いのでしょうか? その場合は↓のコードにしてみてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, c As Range, lastRow As Long, wS As Worksheet Set wS = Worksheets("Sheet1") With Target If .Address = "$A$2" Then lastRow = Cells(Rows.Count, "A").End(xlUp).Row If lastRow > 4 Then Range(Cells(5, "A"), Cells(lastRow, "E")).ClearContents '←列番号を修正 End If Set c = wS.Range("B:B").Find(what:=.Value, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then For i = 1 To wS.Cells(Rows.Count, "A").End(xlUp).Row Step 3 If wS.Cells(i, "B") = .Value Then wS.Cells(i, "C").Resize(3, 3).Copy Cells(Rows.Count, "A").End(xlUp).Offset(1) '←Resizeで列も追加 End If Next i Else MsgBox "該当データなし" .Select .Value = "" End If End If End With End Sub ※ 表のレイアウトが判ればもっと具体的なアドバイスができると思います。m(_ _)m
補足
何度も何度も回答いただきありがとうございます。最後の補足なのですが、A列の連番がない状態で同じようにできるのでしょうか。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! ↓の画像のように左側がSheet1・右側がSheet2とします。 Sheet1は3行毎にデータがあるとします。 尚、Sheet2のA4セルには「ストッパー」代わりに項目名なり何らかのデータを入れておいてください。 Sheet2のシートモジュールです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, c As Range, lastRow As Long, wS As Worksheet Set wS = Worksheets("Sheet1") With Target If .Address = "$A$2" Then lastRow = Cells(Rows.Count, "A").End(xlUp).Row If lastRow > 4 Then Range(Cells(5, "A"), Cells(lastRow, "A")).ClearContents End If Set c = wS.Range("B:B").Find(what:=.Value, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then For i = 1 To wS.Cells(Rows.Count, "A").End(xlUp).Row Step 3 If wS.Cells(i, "B") = .Value Then wS.Cells(i, "C").Resize(3).Copy Cells(Rows.Count, "A").End(xlUp).Offset(1) End If Next i Else MsgBox "該当データなし" .Select .Value = "" End If End If End With End Sub こんな感じではどうでしょうか?m(_ _)m
補足
回答ありがとうございます。項目の入った列がcからeだとしたらどこを変更するとよいですか。
お礼
助かりました! ありがとうございます。