>Excel複数列の複数の条件を満たしたデータを抽出
>2列(N列,O列)に1~3の数字が入ってる行を、
>指定したsheetへ抽出させるVBAのマクロを
仕様が不鮮明のため、こちらで判断したうえで想定して作りました。
(1)Alt+F11でVBEを開き、挿入から標準モジュールを挿入。
(2)最下のVBAコードを貼り付けてコード内の「設定」の5項目を設定。
(3)右上の「×」でVBEを閉じる。
(4)抽出元のシートを表示している状態でAlt+F8より「sample」を実行。
想定した箇所は以下の3点です。異なっていれば補足願います。
(1)抽出条件が不明確です
「複数の条件を満たした」「N列、O列に1~3の数字」とありますが、
『N列及びO列の値が両方とも1~3の数字の場合』は抽出対象と思われますが、
以下の2通りの場合は抽出対象でしょうか?
・N列に1~3の数字があり、O列が空欄または条件外の値の場合
・O列に1~3の数字があり、N列が空欄または条件外の値の場合
→N、O両方、NまたはOのどちらかに1~3の数字がある行を対象とします。
(2)抽出データについて(画像が不鮮明なため)
1行目は項目行でしょうか?また、間は空白セルがあるようですが、
データの入っている最終行番号を取得するため、空白セルのない列はありますか?
→抽出対象のデータ範囲は2行目~A列の最終データが入っている行とします。
(3)抽出範囲及び抽出先が不明確です
新規のシートに行を複写するのであれば、行ごとコピーしますが
特定のシートへ抽出という事は特定の様式(フォーマット)に
値を貼り付けるということであれば、処理内容が異なります。
→抽出範囲は「条件に一致する各行のA~O列」を特定シート「Sheet2」のセル「A1」を基準として値で貼り付けます。
■VBAコード
Sub Sample()
'//////////設定//////////
'抽出先のシート名を指定
Const ts As String = "Sheet2"
'抽出先の起点となるセルアドレスを指定
Const tr As String = "A1"
'データ範囲の開始行番号を指定
Const sr As Long = 2
'データ範囲の最終行番号を判定する列記号
'(全ての行に値が入っている列記号を指定してください)
Const tc As String = "A"
'コピーする内容を指定
' 全て:xlPasteAll
' 数式:xlPasteFormulas
' 輪郭以外の全て:xlPasteAllExceptBorders
' 値:xlPasteValues
Const po As Integer = xlPasteValues
'//////////以下は変更不要//////////
Dim i As Long, j As Integer, cnt As Long
Application.ScreenUpdating = False
For i = sr To Cells(Rows.Count, tc).End(xlUp).Row
If (1 <= sCd(Cells(i, "N").Text) And sCd(Cells(i, "N").Text) <= 3) _
Or (1 <= sCd(Cells(i, "O").Text) And sCd(Cells(i, "O").Text) <= 3) Then
Cells(i, "A").Resize(1, 15).Copy
Worksheets(ts).Range(tr).Offset(cnt, 0).PasteSpecial _
Paste:=po
cnt = cnt + 1
End If
Next i
Application.CutCopyMode = False
Application.ScreenUpdating = True
MsgBox "終了"
End Sub
Function sCd(s As String) As Double
If IsNumeric(s) = True Then sCd = CDbl(s) Else sCd = 0
End Function
お礼
eden3616さん、Excel上でのやり方についても教えて頂きありがとうございました。なーるほどですね。こちらも感謝、感謝です。本当に助かりました。