エクセル2013です。
以下の行削除マクロを作りました。
取得した
最終行が20行目として
最終列がZ列として
セル Z20 の値が
1以上なら問題なく動作するのですが
セル Z20 の値が 0 だとループして終了しません。
どこを修正しても、思うように動作しません。
どこを修正すれば、いいのでしょうか?
よろしくお願いします。
Sub 行削除()
Dim 最終行
Dim 最終列
Dim 対象行
最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得
最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得
Application.ScreenUpdating = False '画面切替停止
For 対象行 = 10 To 最終行
If Cells(対象行, 最終列) = 0 Then
Rows(対象行).Delete
最終行 = 最終行 - 1 '削除により最終行が1行減ったので最終行の値を1行減らす
対象行 = 対象行 - 1 '削除により対象行が1行繰り上がったので対象行の値を1行減らす
Else
End If
Next 対象行
Application.ScreenUpdating = True '画面切替停止解除
End Sub
No.1ベストアンサー
- 回答日時:
Z20??
とりあえず、上手くいかない場合F8で1行ずつ、数値の流れを見ていってください。
対象行が最終行より大きい場合とか (対象行=10 最終行=8)
特に考えなくていいんでしょうか?
対象行を増やして、最終行までいけば終了とForループを組んでいるのに
Forループのなかで、最終行と対象行をマイナスしてます。
ループするのは当たり前な気がします。
やりたいことはいまいち分かりませんが、
このプログラムの場合、最終行から削除していったほうが良いと思います。
(そうすれば、最終行-1、対象行-1をする必要は無くなる為)
この回答への補足
>とりあえず、上手くいかない場合F8で1行ずつ、
>数値の流れを見ていってください。
はい。それでやって、つまづきました。
実験したデータは
A列からZ列、8行目から20行目まで
すべてのセルに値が有ります。
8行目が各列の先頭データなので、8行目の最終列を取得
でそれがZ列。
A列の最終行は20行目。
セルZ8からZ20までを上から順に見ていき
値が0だったらその行は行削除です。
マクロを走らせる前のZ列の最終行であるセルZ20の
値が1とか2とかなら、終了したのに
セルZ20の値が0の場合ははまり込んでしまい
F8で調べて1行づつ調べていったら、
Z列で値が有る最後の行20行目(F8でたどり着いた時は、
すでに数行削除されて14行目になっている)
の値が0だから行削除されます。
すると、最終行と対象行の値が思っている物と違い
ループするのがわかりました。
いくら考えても成り立たないので質問しました。
申し訳ありません。
No.3
- 回答日時:
最終行を取得した後、一旦For Nextループが始まると、いくら最終行を変更しても、ループの終着点は変わりません。
対象行は変更可能です。No.2
- 回答日時:
こんばんは!
No.1さんが仰っているように行(列)削除・挿入の場合は
最終行・最終列から逆に操作するほうが一般的です。
お示しのコードに手を加えるとすると
Sub 行削除()
Dim 最終行 As Long
Dim 最終列 As Long
Dim 対象行 As Long
最終列 = Cells(8, Columns.Count).End(xlToLeft).Column
最終行 = Cells(Rows.Count, "A").End(xlUp).Row
For 対象行 = 最終行 To 10 Step -1
If Cells(対象行, 最終列) = 0 Then
Rows(対象行).Delete
End If
Next 対象行
End Sub
こんな感じでしょうか。
※ 余計なお世話かもしれませんが、データ量が極端に多い場合はループさせるとかなりの時間を要しますので
一気に削除する方法の一例です。
尚、8行目は項目行で空白セルがなく最終列まで項目が入っているとします。
(9行目も何らかのデータが入っているとする)
Sub Sample1()
Dim lastRow As Long, lastCol As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
lastCol = Cells(8, Columns.Count).End(xlToLeft).Column
Range("A8").AutoFilter field:=lastCol, Criteria1:=0
On Error Resume Next '←念のため
Rows(10 & ":" & lastRow).SpecialCells(xlCellTypeVisible).Delete
AutoFilterMode = False
End Sub
これでも同様の結果になると思います。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Visual Basic(VBA) VBA 行削除した連番 4 2023/06/27 16:00
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBA】条件に一致しない行を削...
-
エクセルのデータがない行には...
-
エクセルで空白行を削除する ...
-
マクロで最終行を取得してコピ...
-
EXCEL VBAでA列にある空白行よ...
-
【VBA】条件に一致しない行を削...
-
数値に見えるものはすべて数値...
-
マクロにて指定の文字間の文字...
-
Excel97 指定した行だけマク...
-
excel2021で実行できないマクロ...
-
Excelで、マウスで範囲を選択し...
-
Excel VBAでオートフィルタで抽...
-
VB.net
-
エクセルで階層図を作る方法
-
VBAで特定の行と一つ上の行を削...
-
VBAによりマッチング操作
-
VBAで入力の結果を他のセルに反...
-
【至急】Excel 同一人物の情報...
-
エクセルのVBAで指定した行数の...
-
Excel VBA オートフィルタの結...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで空白行を削除する ...
-
エクセルのデータがない行には...
-
【VBA】条件に一致しない行を削...
-
数値に見えるものはすべて数値...
-
Excel VBAでオートフィルタで抽...
-
【VBA】条件に一致しない行を削...
-
マクロで最終行を取得してコピ...
-
Excel97 指定した行だけマク...
-
Excel VBA オートフィルタの結...
-
【至急】Excel 同一人物の情報...
-
エクセルのVBAで指定した行数の...
-
VBAで入力の結果を他のセルに反...
-
エクセルで階層図を作る方法
-
VBAで特定の行と一つ上の行を削...
-
エクセルVBAでデータの蓄積方法?
-
VB.net
-
Excel マクロ 検索結果を別シ...
-
VBAでの重複データに色付け
-
EXCEL VBAでA列にある空白行よ...
-
Access2003レポート:最終ペー...
おすすめ情報