• ベストアンサー

エクセルVBA 御教示下さい。

一括で、不要な行の行全体を削除したいと考えています。 そのため、削除したい行には列Zに関数で2以上の数字を表示さています。 この列Zに数字の2以上が入っている行は全て削除するマクロをご教示ください。 なお、データは行A3からZ列までの1200行ほどあります。 どなたか、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.3

#2さん、どうやら、Z列がキーのようです。 更にいうと、データは3行目以降の様子です。 Sub 行の削除() Dim gyou As Long For gyou = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row To 3 Step -1 If Range("Z" & gyou).Value >= 2 Then Range("Z" & gyou).EntireRow.Delete End If Next gyou End Sub ところで、1200行あるとそれなりに時間がかかりそうですね。 (と言っても数秒でしょうけど。体感で5~7秒くらいかな。) なので、私からの提案はオートフィルタを使って。 2行目が「項目行」で、3行目以降にデータがあるとして Sub Sample() Dim myRng As Range, myRow As Long     If ActiveSheet.AutoFilterMode = True Then Range("A3").AutoFilter     Set myRng = Range("A3").CurrentRegion     myRow = myRng.Rows.Count + 1     myRng.AutoFilter Field:=26, Criteria1:=">=2"         On Error Resume Next         Rows("3:" & myRow).SpecialCells(xlCellTypeVisible).Delete         On Error GoTo 0     myRng.AutoFilter End Sub こんな感じで。 (エラー処理が手抜きですけど(笑)。) 手動でフィルタをかけて、それを削除、としても一瞬ですから、 マクロを使わなくても結果(所要時間)はそんなに変わらないですけどね。

hijtxa
質問者

お礼

ご教示ありがとうございます。 また、返信が遅れました、申し訳ありませんでした。 処理時間も短くできましたので、ベストにさせていただきました。 ありがとうございます。 また、よろしくお願いいたします。

その他の回答 (5)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.6

VBAはわからん!な場合のために、手動で一気にやる方法も。 ・・・と言っても、フィルタをかけるだけですが。 やはり前提として「2行目には“項目名行”がある」としています。 (無い場合は、3行目にダミーで“項目名行”を作ってやるとやりやすいです。) そんなこんなで、A3セルにフォーカスを置き(選択した状態で) (2007以降の場合) リボンのデータタブ⇒フィルタ を選択。 各項目名のセルに▼がつくので、Z列の▼をクリックしてプルダウン。 数値フィルタ⇒指定の値以上 を選択し、ダイアログ内で「2以上」と設定し、OK。 (2003以前の場合) データメニュー⇒フィルタ⇒オートフィルタ を選択 各項目名のセルに▼がつくので、Z列の▼をクリックしてプルダウン。 「オプション」を選択し、「2以上」と設定してOK。 (ここから共通) フィルタがかかったら「項目名行の1行下に表示されている行」を選択。 Ctrl+Shift+(キーボードの)↓キーで、表示されている行を全選択。 反転している中で右クリック⇒削除 で行削除。 (または「Ctrl+テンキーボードの-(マイナスボタン)」でも行削除できます。) 上記と同様のやりかたでフィルタを解除。 以上で、「Z列が2以上」の行だけを削除することが出来ます。 #3での回答は、コレをマクロに書いてみただけです。 参考までに。 以下、私信で申し訳ありませんが・・ #5さん。 いえ、私も「2行目に“項目名行”が無い」可能性は視野外でした。 そうすると、「3行目にダミー行を入れ、最後に消す」手法が有効ですね。 「なるほど」な感覚です。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.4です。 投稿後に気づきました。 No.3さんの後者のやり方とほぼ同じやり方になっていました。 なおかつエラー処理をしていませんので、Z列に「2以上」のデータがない場合は マクロが止まってしまいます。 どこか最初の方に >On Error Resume Next の1行を追加してもらえれば問題ないと思いますが・・・ それらを考慮すると No.3さんの方が良いですね! どうも失礼しました。m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! 1200行だというコトですので、ループさせてもさほど時間はかからないと思いますが、 一気に削除する方法です。 Sub 行削除() Dim endRow As Long Rows(3).Insert Range("Z3") = "ダミー" endRow = ActiveSheet.UsedRange.Rows.Count Range("Z3").AutoFilter field:=1, Criteria1:=">=2" Rows(3 & ":" & endRow).SpecialCells(xlCellTypeVisible).Delete shift:=xlUp Rows(3).Delete ActiveSheet.AutoFilterMode = False End Sub こんな感じではどうでしょうか?m(_ _)m

hijtxa
質問者

お礼

tom04 様 いつもご教示ありがとうございます。 またお礼が遅くなり申し訳ありませんでした。 同じような回答でしたので、前者をベストにさせていただきました。 また、よろしくお願いいたします。 ありがとうございました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

#1さん、連続してるとまずいから、下からね。 Sub 行の削除() Dim gyou As Long For gyou = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 If Range("a" & gyou).Value >= 2 Then Range("a" & gyou).EntireRow.Delete End If Next gyou End Sub

hijtxa
質問者

お礼

早速のご教示ありがとうございます。 返信が遅れました、申し訳ありませんでした。 やはり処理時間が少しかかりますので、他をベストにさせていただきました。 また、よろしくお願いいたします。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

例えば次のようなマクロにします。 Sub 行の削除() Dim gyou As Long For gyou = 1 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row If Range("Z" & gyou).Value >= 2 Then Range("Z" & gyou).EntireRow.Delete End If Next gyou End Sub

hijtxa
質問者

お礼

早速のご教示ありがとうございます。 返信が遅れました、申し訳ありませんでした。 処理時間が少しかかりますので、他をベストにさせていただきました。 また、よろしくお願いいたします。