[[20140821123315]] 『エクセル VBA 条件に合致した行を削除する』(みや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エクセル VBA 条件に合致した行を削除する』(みや)

マクロを下記の様に作ったのですが、うまく動作しません。

中途半端に行が消えてしまいます。
どこがおかしいのでしょうか?

(条件)
使用している列はA〜AF・行は1〜任意行で1行目は見出しが入っています。
V列にスペース(半角3つ分)が存在するセルがあるのでREPLACEしています。
V列の値が30〜59までのデータのみ残すので、60以上と30未満のデータを削除するマクロを組んだつもりです。

よろしくお願いします。

Sub 行削除()

    Application.ScreenUpdating = False
    Sheets("30-59").Select
    j = Range("A1").End(xlDown).Row

    Range(Cells(2, 22), Cells(j, 22)).Select
    For Each d In Selection
        d.Value = Replace(d.Value, "   ", "")
    Next

    For i = 2 To j
    If 60 <= Cells(i, 22).Value < 30 Then
    Cells(i, 22).EntireRow.Delete
    End If
    Next i
End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 ご参考に。
[[20140821103747]] 『行の削除について(VBA)』(church)

 > 行・列の削除は後ろから。
(Mook) 2014/08/21(木) 13:00

使用している列はA〜AF・行は1〜任意行で1行目は見出しが入っています。
とあります。
なのでおそらく、シートごとに行が違うのだろうと思います。
 Sheets("30-59").Select
    j = Range("A1").End(xlDown).Row
とやっても j に入るのは今のシートの値が入るのでSheet31が20行でSheet59が40だと20行分しかやってくれません。
シートの名前がSheets30 Sheets31 Sheets59 と変わらないと前提して最初にシートのループを入れます。

 Sub 行削除()

 Dim i As Integer, j As Integer, d As Variant, k As Integer

For k = 31 To 59

    Application.ScreenUpdating = False
    Sheets(k).Select
    j = Range("A1").End(xlDown).Row

    Range(Cells(2, 22), Cells(j, 22)).Select
    For Each d In Selection
        d.Value = Replace(d.Value, "   ", "")
    Next

    For i = 2 To j
    If 60 <= Cells(i, 22).Value < 30 Then
    Cells(i, 22).EntireRow.Delete
    End If
    Next i
    Next k
End Sub

何か間違えていたらお願いします。
(デイト) 2014/08/21(木) 13:28

Mookさん

ありがとうございます。
後ろからですね、思い通り動作しました。

デイトさん

ありがとうございます。
まぎらわしいシート名ですみません。
Sheets("30-59")は1つのシート名ですので、Mookさんに教えて頂いた内容で、うまく動作しました。
お手数お掛けしました。
(みや)


 こんにちは。佳です。

 If 60 <= Cells(i, 22).Value < 30 Then
 こういう書き方は、エクセルVBAではNoGoodです。
 必ずしもエラーにならないけれど、期待通りの動きをしません。

 以下、検証用コードです。
 Cells(i, 22).Valueの代わりに 変数xを使っています。
 xの値にかかわらず「該当」が表示されるのが確認できます。

Sub test()

    Dim x As Long

    x = 0
    If 60 <= x < 30 Then MsgBox "該当"

    x = 40
    If 60 <= x < 30 Then MsgBox "該当"

    x = 100
    If 60 <= x < 30 Then MsgBox "該当"

 End Sub

 Goodな書き方は、調べればわかると思うので省略します。

 動作を確認するときは、条件に合うデータでうまくいくことだけでなく
 条件に合わないデータで、ちゃんとうまくいかないことも確認されたがいいです。

( 佳 ) 2014/08/21(木) 18:30


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.