• 締切済み

エクセル 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 など構文が理解できません。 どなたかお知恵をお貸し下さい。

みんなの回答

  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

質問者のレベルでは、先ず、一行ずつ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)
回答No.2

色々長々と書いたり、 >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の最下行を求める式。

penacW
質問者

お礼

回答頂きありがとうございました。 まだVBAの勉強始めたばかりで、上記の質問だとLoopやFor Nextを使わないと処理出来ないと思ってました><

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

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

penacW
質問者

お礼

即答ありがとうございます。 もっと勉強します。

関連するQ&A

専門家に質問してみよう