- 締切済み
エクセル VBA
最近マクロの勉強を始めたばかりの初心者で、どうしても Loop 処理の構文が理解出来ません。 S列 T列 U列 0 0 0 10 5 8 0 4 0 ・ ・ ・ ・ ・ ・ 上記のようにS列(3行目)からU列(最終行変動)に0~20000位の値が入っていて、データの並び替えでS列(昇順)で並べ替えをした後、S列の値が0の場合のみS~T列をDelete Shift:=xlUP したいです。 もしくはS列が0の場合のみT列まで選択 Range("S3:U...") とし、S列が0の行をまとめて Delete Shift:=xlUp したいです。 並べ替えまでマクロすぐ出来たのですが、Loop For Next など構文が理解できません。 どなたかお知恵をお貸し下さい。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- myRange
- ベストアンサー率71% (339/472)
質問者のレベルでは、先ず、一行ずつ0のセルを探していく方法から試してみるのがいいでしょう。 この方法だとソートしてあってもなくても動作させることができますので。 '------------------------------------------------- Sub test() Dim R As Long For R = Cells(Rows.Count, "S").End(xlUp).Row To 3 Step -1 If Cells(R, "S").Value = 0 Then ● Range("S" & R & ":U" & R).Delete xlShiftUp End If Next R End Sub '-------------------------------------------------- なお、上記●のコードは次のように書くこともできます。 Range(Cells(R, "S"), Cells(R, "U")).Delete xlShiftUp Cells(R, "S").Resize(1, 3).Delete xlShiftUp また、0の行全体を削除する場合は次のようにします。 Rows(R).Delete xlShiftUp Cells(R, "S").EntireRow.Delete xlshiftup Range("S" & R).EntireRow.Delete xlShiftUp 以上です。
- imogasi
- ベストアンサー率27% (4737/17069)
色々長々と書いたり、 >Loop For Next など構文が理解できません と大きく質問内容を広げているが、書く必要が無い部分が多いのでは。 S列で(空白行が無いとして)、0の行は、上のほうの最初の方に固まるのではないのですか。 そうであれば、ソート後で、0が途切れる行をどういうコードで見つけるか、という質問ではないですか。 ーー (1)上から0かどうか聞いて(IF文で)行って、最初に0以外になった行の手前が、0の最終行です。 下行から0かどうか聞いていく手もあるが、0の数が少ないと少し無駄になる。 (2)下行から0かどうかを見つけられるとよいのだが VBAにはReverseFind関数的なものが無いので使えない。 コード上で繰り返しをしない方法は、難しいのかもしれない。 よいアイデアが浮かばない。 それでキワモノですが下記を挙げて置きます。 Sub test01() d = Range("A35656").End(xlUp).Row Range("C13").FormulaArray = "=MAX(IF(A1:A" & d & "=0,ROW(A1:A" & d & "),0))" X = Range("C13") Rows("1:" & X).Delete Range("C13")="" End Sub を実行すると出来るが。 C13は仮に使うセルで、邪魔にならないセルを何処か指定する例。 エクセル関数では、シートに =MAX((A1:A100=0)*(A1:A100<>"")*ROW(A1:A100)) と入れてSHIFT、CTRLとENTERキーを同時押しすることに当たる。配列数式。100は100行目までの意味で、実データ行数より余分目に指定して可。 0がセル位置的に一塊になっていて、0の最下行を求める式。
- okormazd
- ベストアンサー率50% (1224/2412)
S列が何行0かは、while 分で調べて、0の行をまとめて削除している。 勉強してください。 Sub test2() r = 1 c = 3 z1 = Range("s3").Value If z1 <> 0 Then Exit Sub z2 = Range("s3").Offset(r, 0).Value While z1 = z2 r = r + 1 z2 = Range("s3").Offset(r, 0).Value Wend Range("S3").Offset.Resize(r, c).Delete Shift:=xlUp End Sub
お礼
即答ありがとうございます。 もっと勉強します。
お礼
回答頂きありがとうございました。 まだVBAの勉強始めたばかりで、上記の質問だとLoopやFor Nextを使わないと処理出来ないと思ってました><