アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBA DO LOOP

Do loopをつかって行を空欄まで見に行き、ある条件の時は行を削除します。ただdo loopでさくじょすると行が動くので(四行目を削除すると五行目が四行目になり、四行目が条件対象であっても四行目はループしているため、プログラムが見に行かない。)うまくいきません。何か他の方法でうまくいきませんか?

質問者からの補足コメント

  • したから見に行くのはdo loopでできるのでしょうか?
    基本空欄を見にいきますが、どういうりくつになりますか?

    詳しく回答していただいた方ありがとうございます。やってみます!

      補足日時:2017/03/16 18:01

A 回答 (8件)

No.2さんと同じ考えかたです。


A列をA1から見ていって、1の行を削除します。

Sub Sample()
  Dim row As Long
  
  row = 1
  Do While Cells(row, 1).Value <> ""
    If Cells(row, 1).Value = 1 Then
      Cells(row, 1).EntireRow.Delete
      row = row - 1
    End If
    row = row + 1
  Loop
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます!
うまくいきました!

お礼日時:2017/03/17 12:44

>したから見に行くのはdo loopでできるのでしょうか?


Do Loopで
今開始行は何行目からか判らないので仮にnとすると
最終行を空欄で判断していると思いますが
それを最初に判断することが必要となりますよね。

これが仮にA列だとすると
Range("A10000").End(xlup).Row
で最終行が得られます。1万行超えてるデータはダメですよ。
普通はそんなに沢山入力しないと思って、手抜きですが。

ここから初めて行を今は一つずつ増やしていると
思いますが一つづつ減らす処理にします。
数字がnになって削除の処理が終わっているタイミングが
Loopを抜けるタイミングです。

Do またはLoopの行に記述するなら n-1に
なったらってことになりますね、多分。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2017/03/17 12:44

こんばんは!



他の方々がおっしゃっているように、行の削除(挿入)は最終行から上に遡る方法が無難です。
その方法はすでに回答が出ていますので、一気に削除する方法です。
質問文ではどこの列が基準か判らないので、A列が空白の行を削除するコードにしてみました。
「ある条件」とは何かが判らないのでとりあえずA列の空白セルとしています。

Sub Sample1()
Dim i As Long, myRng As Range
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(i, "A") = "" Then
If myRng Is Nothing Then
Set myRng = Cells(i, "A")
Else
Set myRng = Union(myRng, Cells(i, "A"))
End If
End If
Next i
If Not myRng Is Nothing Then
myRng.EntireRow.Delete
End If
End Sub

こんな感じでも大丈夫だと思います。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます!こちらも動きました!

お礼日時:2017/03/17 12:44

どうしてもDoを使いたいなら



Dim CNT As Long
Dim END1 As Long
Dim Sh As Worksheet
Set Sh = ActiveSheet
END1 = Sh.Range("A65536").End(xlUp).Row

Do While CNT =< END1
If Sh.Range("A" & CNT).Value = 1 Then
Sh.Range(CNT & ":" & CNT).Delete
END1 = END1 - 1
CNT = CNT - 1
End If
Next CNT
Application.StatusBar = False
End Sub



なお、END1 = Sh.Range("A65536").End(xlUp).Rowは
65536行目から上に辿って、最初に見付かった空欄で無い行番号をEND1に格納する処理。
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2017/03/17 12:44

最初の空欄までに数を見つけてDoループの終端数とする。


例えば、END1 = Sh.Range("A65536").End(xlUp).Row
でEND1が終端。

途中で削除した時、Doループの終端数とループ変数を-1する。

これで上手く行く。

下は例
Dim CNT As Long
Dim END1 As Long
Dim Sh As Worksheet

Set Sh = ActiveSheet
END1 = Sh.Range("A65536").End(xlUp).Row

For CNT = 2 To END1
If Sh.Range("A" & CNT).Value = 1 Then
Sh.Range(CNT & ":" & CNT).Delete
END1 = END1 - 1
CNT = CNT - 1
End If
Next CNT
Application.StatusBar = False
End Sub
    • good
    • 0

こんにちは



削除を伴う処理の場合、ご質問のような問題が起きます。
削除したときは、その行数だけ対象行を戻すような処理をいれても良いのですが、ややこしいですね。

それなので、小さい行番号から大きい行番号へと処理をせずに、大きい行番号から小さい行番号へと降順に処理ををするのがコツと言えばコツです。
この方法ですと、ご質問のようなことはおきませんので、そのまま順に続けて処理を行えばよくなります。
(For ~ Next などで処理する場合も同様です)
    • good
    • 0

一行ずつ 確認のため行を下げてるなら、その行のカウンターと言うか、変数が有るはず(ROW()の代わり)、作業した時だけ、その作業行

を -1 すれば良いだけじゃないのかな?
    • good
    • 0

逆転の発想


そういう場合は、下から操作していくとうまくいきますよ。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!