- ベストアンサー
VBAループで2行目を削除して空白になったら終了がうまくいかない
- VBAのループで2行目を削除し、その後の行が上に詰められるようにする方法について質問です。
- ループが3行目以下の行を削除し、2行目が空白になったら終了するようにしたいです。
- 回答にはExcel 2010を使用する前提で、複数のシートで作業できるようにする方法をご教示ください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
行の削除は下から行うと楽ですよ Sub Test() Dim j As Long, LastRow As Long Sheets("◆抽出先 (提灯)").Select LastRow = Cells(Rows.Count, "A").End(xlUp).Row For j = LastRow To 2 Step -1 If Cells(j, 1).Value = "" Then Rows(j).Delete Shift:=xlUp Next End Sub >※複数シートでの作業が出来る記述でおねがいします。 Sub Test2() Dim j As Long, LastRow As Long Dim sh As Variant For Each sh In Sheets(Array("◆抽出先 (提灯)", "Sheet1", "Sheet2")) LastRow = sh.Cells(Rows.Count, "A").End(xlUp).Row For j = LastRow To 2 Step -1 If sh.Cells(j, 1).Value = "" Then sh.Rows(j).Delete Shift:=xlUp Next Next End Sub
その他の回答 (5)
- bunjii
- ベストアンサー率43% (3589/8249)
▼▼▼▼▼▼ Dim j As Long ' 不要 j = 2 ' 不要 Do While Cells(j, 1) <> "" ' Do While Cells(2,1) <> "" に変更 Sheets("◆抽出先 (提灯)").Select Rows("2:2").Select Selection.Delete Shift:=xlUp j = j + 1 ' 不要 Loop ▲▲▲▲▲▲ 提示のコードでは半数が削除漏れになります。 原因は空欄をチェックしているセルがA2、A3、A4、・・・・と下方に移動し、実際に削除される行とかけ離れるためです。
- imogasi
- ベストアンサー率27% (4737/17070)
>※2行目に何もなくなったらループ終了 意味がよくわかりません。 2行目(固定して、そのシートで1回作業)なら、行を固定して行削除してそのシートの作業は終了し、次のシートに移っていけばよいのでは? その場合簡単なコードは Sub test01() For Each sh In Worksheets sh.Rows(2).EntireRow.Delete Next End Sub 行を上に詰めている。 詰めないならDeleteでなくデータを空白セルにするコードにする。 Range("A2").EntireRow.Clear のような。 Sub test02() For Each sh In Worksheets sh.Range("A2").EntireRow.Clear Next End Sub ーー >※2行目に何もなくなったらループ終了 は次のシートの第2行に移るということか? はっきり書くこと。 ー 一般に、繰り返し作業で行を変数で指定して削除する場合は、データ最下行から 削除作業を繰り返すのが鉄則かと。 J=j+1で次次の行までなぜ繰り返すのか
- kkkkkm
- ベストアンサー率66% (1742/2617)
j = j + 1 の後ろに Debug.Print j として実行後にイミディエイトウィンドウを見るとjの値が出てるのでそれで原因がわかると思います。 シートのSelectはループの前でいいと思いますよ。 Dim j As Long Sheets("◆抽出先 (提灯)").Select Do While Cells(2, 1) <> "" Rows("2:2").Delete Shift:=xlUp Loop あと一括で削除したほうが早い場合があります。 Sub Example() Dim j As Long j = 2 Sheets("◆抽出先 (提灯)").Select Do While Cells(j, 1) <> "" j = j + 1 Loop If j > 2 Then Rows("2:" & j - 1).Delete Shift:=xlUp End If End Sub A列のデータが入っている最終行まで削除するのでしたら(途中で空白があっても最終データの行まで) Sub Example2() Sheets("◆抽出先 (提灯)").Select If Cells(Rows.Count, "A").End(xlUp).Row <> 1 Then Rows("2:" & Cells(Rows.Count, "A").End(xlUp).Row).Delete Shift:=xlUp End If End Sub
- AsarKingChang
- ベストアンサー率46% (3467/7474)
j = 2 消すのが固定の「2行目」なので、実質これは固定値ですよ。 j = j + 1 これの実行後「3行目、4行目」とどんどん、次の行を選択してますから。 なので、固定したいものを動かしたことが、問題だったのかも
- HohoPapa
- ベストアンサー率65% (455/693)
j = j + 1 ↑の行が余分と思います。
お礼
違う方法で解決したのですが、下からの削除は 考えもしなかったです。 次回に使えそうです。 ありがとうございます。 他の回答していただいた方もありがとうございました!!