[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『エクセル 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
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.