以前、似たような質問をしたのですが。
今回は、例えば「G列に2~4999の数字があれば、その行全てを削除する」のように。
1つのキーワードではなく、指定した数字の範囲で行を削除できたらと考えております。
そのような効率的な処理がマクロや関数で可能でしたらお教えいただけますと幸いです。
よろしくお願い致します。
G列のデータが数値という前提で。
Public Sub deleteRows() Const LOWER_LIMIT As Long = 2 Const UPPER_LIMIT As Long = 4999 Const TARGET_SHEET_NAME As String = "Sheet1" Const TARGET_COL As String = "G" Const HEADER_ROWS As Long = 0 Dim ws As Worksheet Dim r As Range Dim lHeaderRow As Long Dim lTargetCol As Long Dim lBeginRow As Long Dim lEndRow As Long Set ws = ThisWorkbook.Worksheets(TARGET_SHEET_NAME) With ws If .AutoFilterMode = True Then 'オートフィルタ適用中なら解除 .AutoFilter.Range.AutoFilter End If lTargetCol = .Columns(TARGET_COL).Column If HEADER_ROWS = 0 Then 'ヘッダー行が無ければ、オートフィルタ用に1行挿入 lHeaderRow = 1 .Rows(lHeaderRow).Insert .Cells(lHeaderRow, lTargetCol).Value = "DummyHeader" Else lHeaderRow = HEADER_ROWS End If lBeginRow = lHeaderRow + 1 lEndRow = .Cells(ws.Rows.Count, lTargetCol).End(xlUp).Row Set r = .Range(.Cells(lHeaderRow, lTargetCol), .Cells(lEndRow, lTargetCol)) End With 'オートフィルタ適用 r.AutoFilter Field:=1, Criteria1:=">=" & CStr(LOWER_LIMIT), Operator:=xlAnd, Criteria2:="<=" & CStr(UPPER_LIMIT) '対象行があれば行削除 If r.SpecialCells(xlCellTypeVisible).Count > 1 Then Application.DisplayAlerts = False 'ヘッダ行を除外して、表示されている行を削除 ws.Range(ws.Cells(lBeginRow, lTargetCol), ws.Cells(lEndRow, lTargetCol)).SpecialCells(xlCellTypeVisible).Delete Application.DisplayAlerts = True End If 'オートフィルタ解除 r.AutoFilter Set r = Nothing If HEADER_ROWS = 0 Then 'オートフィルタ用ダミーヘッダー削除 ws.Rows(1).Delete End If Set ws = Nothing End Sub
削除対象範囲が変わるなら、こういうのもありかと・・・
Public Sub deleteRows(ByVal lLowerLimit As Long, ByVal lUpperLimit As Long)
とか
Public Sub deleteRows(ByVal sTargetCol As String, ByVal lLowerLimit As Long, ByVal lUpperLimit As Long)
一日に何度もその処理を行うっていうならマクロのほうがいいと思うけどさ、
それって並び替えして行の削除するだけじゃん。
手間を惜しみすぎて一周回っちゃってるよ。MOSレベルは一通り勉強したほうがいいですよ
そうですね、オートフィルって方法がありました!(^^;)
G列のデータが数値という前提で。
Public Sub deleteRows() Const LOWER_LIMIT As Long = 2 Const UPPER_LIMIT As Long = 4999 Const TARGET_SHEET_NAME As String = "Sheet1" Const TARGET_COL As String = "G" Const HEADER_ROWS As Long = 0 Dim ws As Worksheet Dim r As Range Dim lHeaderRow As Long Dim lTargetCol As Long Dim lBeginRow As Long Dim lEndRow As Long Set ws = ThisWorkbook.Worksheets(TARGET_SHEET_NAME) With ws If .AutoFilterMode = True Then 'オートフィルタ適用中なら解除 .AutoFilter.Range.AutoFilter End If lTargetCol = .Columns(TARGET_COL).Column If HEADER_ROWS = 0 Then 'ヘッダー行が無ければ、オートフィルタ用に1行挿入 lHeaderRow = 1 .Rows(lHeaderRow).Insert .Cells(lHeaderRow, lTargetCol).Value = "DummyHeader" Else lHeaderRow = HEADER_ROWS End If lBeginRow = lHeaderRow + 1 lEndRow = .Cells(ws.Rows.Count, lTargetCol).End(xlUp).Row Set r = .Range(.Cells(lHeaderRow, lTargetCol), .Cells(lEndRow, lTargetCol)) End With 'オートフィルタ適用 r.AutoFilter Field:=1, Criteria1:=">=" & CStr(LOWER_LIMIT), Operator:=xlAnd, Criteria2:="<=" & CStr(UPPER_LIMIT) '対象行があれば行削除 If r.SpecialCells(xlCellTypeVisible).Count > 1 Then Application.DisplayAlerts = False 'ヘッダ行を除外して、表示されている行を削除 ws.Range(ws.Cells(lBeginRow, lTargetCol), ws.Cells(lEndRow, lTargetCol)).SpecialCells(xlCellTypeVisible).Delete Application.DisplayAlerts = True End If 'オートフィルタ解除 r.AutoFilter Set r = Nothing If HEADER_ROWS = 0 Then 'オートフィルタ用ダミーヘッダー削除 ws.Rows(1).Delete End If Set ws = Nothing End Sub
削除対象範囲が変わるなら、こういうのもありかと・・・
Public Sub deleteRows(ByVal lLowerLimit As Long, ByVal lUpperLimit As Long)
とか
Public Sub deleteRows(ByVal sTargetCol As String, ByVal lLowerLimit As Long, ByVal lUpperLimit As Long)
遅くなりましてすみません、ありがとうございます!
一瞬で消えて、うまくいきました(^^;
1.最終列の右に2列分挿入して、その1行目に次の関数式を入れます
挿入した1列目には =IF(AND(G1>=2,G1<=4999),"",1)
挿入した2列目には =ROW(G1)
2.挿入した1列目と2列目の1行目を コピーして
挿入した1列目と2列目の2行目以降に 貼付けしてから
挿入した1列目と2列目を コピーして 同じ位置に 値貼付けします
3.挿入した1列目を昇順で並び替えします
4.挿入した1列目が空白になっている行について
挿入した1列目と2列目を残して 範囲指定して すべて削除します
5.挿入した2列目を昇順で並び替えをします
6.挿入した1列目と2列目を削除します
ご希望のデータが完成します。
遅くなりましてすみません。
できました!ありがとうございます(^^;
遅くなりましてすみません、ありがとうございます!
2018/06/16 22:52:50一瞬で消えて、うまくいきました(^^;