Home > Excel VBA Macro フロー制御 > FAQ

セルの値が長さゼロの文字列ならばその行を削除するには?

Question 61.2 Previous Next
ちょっと難しい問題で行き詰まっています。
シート内には、240行ほどの入力欄があり、そのセルの中には、他のシートに入力されている情報をリンクして表示できるようにしています。
それと全く同じシートが6枚あります。もちろん同じリンクです。 私が実現したい機能は、大きく分けて次の通りです。

1. シートに空欄(リンクしたデータが反映されていない)がある行は、ボタン一つで削除する。
2. 6枚のシートの最初のシートに2枚目、3枚目、4枚目、5枚目、6枚目に入力のある行(リンクしたデータが反映されている)は全て削除する。
そして、2枚目のシートには、1. と同じく、空欄の行を削除するボタン と3枚目、4枚目、5枚目、6枚目に入力のある行は全て削除するボタン。同じように、3枚目、4枚目、5枚目に同じように 2つのボタンを付ける事です。

・削除する列は、例えば、C列の5から Cの245までの間で、データが反映されていない行は削除。
・そして、他のシートのC列の5からCの245までの間で、データが反映されている行は削除。

ということで、各シート毎に各作業を行うボタンを 2つ付けて実行したいのです。 空欄行の削除ボタンと空欄行でない行の削除ボタンをつけたいと思います。 お願いしたいのは、1. 2.を実現するマクロを教えていただけないでしょうか?
かなり面倒だと思うのですが、ご教授下さい。お願い致しいます。
Answer   Copyright (C) 2003.6.24 永井善王
隋分、込み入ってますね。
「他」のシートは、240行ほど入力欄のある6枚のシートとは、別に存在するということでしょうか?

 「他」のシートの例       240行ほど入力欄のあるシートの例・・全く同じシートが6枚ある
「他」シート 「Sheet1」シート

また 「他のシートに入力されている情報をリンク」ということは、数式がセットしてあるということでしょうか?

例えば左図の「他」シートでは、
C5セルに数式 =IF(他!="○","有","") が入力してあり、C6:C240セルも同様ですが、これに似たことでしょうか。
そして、左図の「Sheet1」では、C7と C9セルが空欄ですから、「削除」ボタンをクリックすると 7行目と 9行目を削除すればよいのでしょうか?
質問の 1. がこれでよいならば、C5:C244セル範囲の中で空欄(長さゼロの文字列:"")を探して、その行を削除するマクロを作成することになります。

1. 5行目から240行目までを 1行ずつ繰り返し処理するマクロ
いろいろな方法がありますが、[Macro]の[フロー制御]のページに掲載の 「
行方向にForNextする」 が分かりやすく手軽かと思います。

2. そのセルが "" かどうかを調べる
同じ理由で、同じページの 「
If...Then...Else」 がいいでしょう。

3. 行を削除する
[Macro]の[セル制御]のページの 「
行を挿入_削除する」 を参考にします。

これらを組み合わせて、下記のようなマクロを作成します。
'------------------------------------------------------------------------------
Sub セルの値が長さゼロの文字列ならばその行を削除する()
    Worksheets("Sheet1").Activate
    For 行 = 244 To 5 Step -1
        If Cells(行, 3) = "" Then
            Rows(行).Delete Shift:=xlUp
        End If
    Next
End Sub
'------------------------------------------------------------------------------
質問 2. の回答をしたいのですが、6枚のシートは「全く同じ」ということですね。私に先入観があるせいか、あなたがどうしたいのか、よく分かりません。 しかし、なんとなく、削除するべき行の判別の仕方が上記のマクロと違うだけのような気がします。であるならば、上記のマクロの If文を変えるだけかなと思います。じっくり研修なさってくださいませんか。

 

Excel VBA Macro

Excel DownLoad