人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Excelで指定した範囲の数字を含む行全てを削除したいです
以前、似たような質問をしたのですが。
今回は、例えば「G列に2?4999の数字があれば、その行全てを削除する」のように。
1つのキーワードではなく、指定した数字の範囲で行を削除できたらと考えております。
そのような効率的な処理がマクロや関数で可能でしたらお教えいただけますと幸いです。
よろしくお願い致します。

●質問者: moon-fondu
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

質問者から

ちなみに以前の質問は http://q.hatena.ne.jp/1424769500 です。


1 ● smithy250
●10ポイント

一日に何度もその処理を行うっていうならマクロのほうがいいと思うけどさ、
それって並び替えして行の削除するだけじゃん。
手間を惜しみすぎて一周回っちゃってるよ。MOSレベルは一通り勉強したほうがいいですよ


moon-fonduさんのコメント
そうですね、オートフィルって方法がありました!(^^;)

2 ● Z1000S
●1200ポイント ベストアンサー

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)

moon-fonduさんのコメント
遅くなりましてすみません、ありがとうございます! 一瞬で消えて、うまくいきました(^^;

3 ● Asayuri
●333ポイント

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列目を削除します

ご希望のデータが完成します。


moon-fonduさんのコメント
遅くなりましてすみません。 できました!ありがとうございます(^^;
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ