こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2009-09-20 11:05:22

QNo.5304620

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

以上です。
 

投稿日時 - 2009-09-20 13:07:06

ANo.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の最下行を求める式。

投稿日時 - 2009-09-20 12:31:19

お礼

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

投稿日時 - 2009-09-20 16:34:11

ANo.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

投稿日時 - 2009-09-20 11:50:42

お礼

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

投稿日時 - 2009-09-20 12:18:52

あなたにオススメの質問