[[20180418213334]] 『指定した範囲内で全てのセルが空白だった場合に行』(sato) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『指定した範囲内で全てのセルが空白だった場合に行を削除する』(sato)

1週目という名のシートのE4からP11の範囲内で全てのセルが空白の行を検索し、それに該当する行を削除する。
というようなVBAを作ることは出来ますでしょうか?

図で表すと・・・

 ABCDEFGHIJKLMNOP
1   結合して文字入力
2縦縦縦
3ににに
4結結結 〇〇〇〇〇〇
5合合合
6ししし
7ててて       〇〇〇〇〇〇
8文文文
9字字字
10入入入
11力力力

このようになっている場合に、5・6・8〜11行目を削除したいです。
こういうことは出来るのでしょうか?

また、同じシートのE12からP19の範囲でも同じことをするようにしたい場合はどの様に書けばいいのでしょうか?

マクロ程度のことしか理解しておらず、ネットで検索してもどうしても解決出来ないので質問させて頂きました。
初心者丸出しの質問で申し訳ありませんが、助けて下さい。
質問に不足があったら、なにが不足しているのかをご教授して頂けたら幸いです。よろしくお願いいたします。

< 使用 Excel:Excel2016、使用 OS:unknown >


 >5・6・8〜11行目を削除したいです。

 2・3も空白に見えるんですけど、それは削除しないのですか?

 縦に結合しているのは、C列までですか?

 横の結合は、Dからですか? Dからどの列までですか?

 横の結合は、1行ずつですね?(2行まとめての結合は無い)

 >E4からP11の範囲内で全てのセルが空白の行を検索し、それに該当する行を削除する。

 済みません。上の記述からすると、横の結合てのは無いのですか?
 すると、「結合して文字入力」はどんな意味があるんですか?

(半平太) 2018/04/18(水) 22:30


 >2・3も空白に見えるんですけど、それは削除しないのですか?

 済みません。これを漠然と眺めていました m(__)m その質問は撤回します。
        ↓
 >「E4からP11の範囲内で全てのセルが空白の行を検索し、」

(半平太) 2018/04/18(水) 22:44


半平太様
コメントありがとうございます。
ご返答させていただきます。

>2・3も空白に見えるんですけど、それは削除しないのですか?
2行目には時間を表すために数字が入っています。
(正確な数字は上手く表現できないので、下の図ではダミーの数字を入れました。)
3行目は作業中に数字(または文字)を手入力する必要のある行です。
なので2・3行目は削除しません。

再度書き込みありがとうございます。念のためにご返答しておきます。

>縦に結合しているのは、C列までですか?
縦に結合しているのは、C列までです。
詳しく書くと・・・

 ABCDEFGHIJKLMNOP
1<結 合 し て 文 字 入力>
2    123456789123
3^^
4縦縦^ 〇〇〇〇〇〇
5  結
6にに合
7  し       〇〇〇〇〇〇
8  て
9結結文
10  字
11  v
12合合^〇〇〇〇
13  結
14  合
15ししし
16  て      〇〇〇〇〇〇
17  文
18てて字
19  v
20文文^〇〇〇〇
21  結
22字字合
23  し
24入入て
25  文    〇〇〇〇〇〇
26力力字
27vvv

のようになっています。
<>内が結合しているセルの範囲を表しています。

>済みません。上の記述からすると、横の結合てのは無いのですか?
1行目が横に結合されています。

>すると、「結合して文字入力」はどんな意味があるんですか?
横の結合には表のタイトルのようなものが入力されています。
縦の結合には日付や曜日、場所が入力されています。

返答がちゃんとできていなかったら申し訳ありません。
(sato) 2018/04/18(水) 23:04


半平太様
追記のご質問に返答していませんでした。申し訳ありません。

>横の結合は、Dからですか? Dからどの列までですか?
上記の新しい図でわかりますでしょうか?

>横の結合は、1行ずつですね?(2行まとめての結合は無い)
横の結合は1行ずつしかありません。

よろしくお願いいたします。
(sato) 2018/04/18(水) 23:07


 やってみたら、結合は関係ないみたいです。下のでテストしてみてください。

 Sub Del()
     Dim rngToProc As Range
     Dim rngToDelete As Range
     Dim RW As Long

         For RW = 4 To 11 ’19行までやりたいなら、11を19に変える

             With Sheets("1週目").Range("E:P").Rows(RW)
                 If Application.CountA(.Cells) = 0 Then
                     If rngToDelete Is Nothing Then
                         Set rngToDelete = .Cells(1, 1)
                     Else
                         Set rngToDelete = Union(rngToDelete, .Cells(1, 1))
                     End If
                 End If
             End With
         Next RW

     If Not rngToDelete Is Nothing Then
         rngToDelete.EntireRow.Delete
     End If
 End Sub

(半平太) 2018/04/18(水) 23:12


出来ました!
つたない質問に丁寧に答えていただき、本当にありがとうございます。
もしお時間があったら、もう少し教えて頂きたいのですが・・・

「E4からP11の範囲の文字以外の数式を選択し、該当のセルの数式と値をクリア(マクロ記憶をしてみたら下記のように記憶されていました)」してから先ほどの作業をする場合にはどのようにVBAを追記すればいいのでしょうか?

Sub Macro2()
'
' Macro2 Macro
'

'

    Range("E4:P11").Select
    Selection.SpecialCells(xlCellTypeFormulas, 21).Select
    Selection.ClearContents
End Sub

また、「同じシートのE30からP53の範囲でも数式と値をクリアしてから、上記の作業」をしたい場合、同じVBAに纏めることはできますでしょうか?
先ほどの図が30行目から繰り返されるのですが、28行目と29行目が空白行でも削除したくない為、作業を分ける必要があると勝手に判断しましたが、どうなのでしょうか?

色々と追加でお伺いして申し訳ありません。
お時間があれば返答して頂ければ幸いです。
(sato) 2018/04/18(水) 23:35


 Sub Del()
     Dim rngToProc As Range
     Dim rngToDelete As Range
     Dim RW As Long

     'ここに入れる
     'まずは "1週目"のシート名を限定した方がいいです。
     '慣れたら、Selectしない方法も出来るようにしてください。
     '(マクロの記録は手操作がベースなので、Selectのオンパレードになるのはやむを得ない面があります)
     '数式が全然ないと、エラーになりますので、将来的にはその対策も工夫していただく必要があります。

     Sheets("1週目").Select
     Sheets("1週目").Range("E4:P11").Select
     Selection.SpecialCells(xlCellTypeFormulas, 21).Select
     Selection.ClearContents

     For RW = 4 To 53

         '>28行目と29行目が空白行でも削除したくない為、
         'たった2行分のことなら
         If RW = 28 Then   '28になったら強制的にRWを30へすっ飛ばす
             RW = 30
         End If

         With Sheets("1週目").Range("E:P").Rows(RW)
             If Application.CountA(.Cells) = 0 Then
                 If rngToDelete Is Nothing Then
                     Set rngToDelete = .Cells(1, 1)
                 Else
                     Set rngToDelete = Union(rngToDelete, .Cells(1, 1))
                 End If
             End If
         End With
     Next RW

     If Not rngToDelete Is Nothing Then
         rngToDelete.EntireRow.Delete
     End If
 End Sub

(半平太) 2018/04/18(水) 23:53


何度も丁寧に、本当にありがとうございます。
お陰でやりたいことがしっかり出来ました。
また、VBAの仕組みも少し理解できました。
夜分遅くに本当にありがとうございます。

この先はもしお暇でしたらの返答で結構です。
何度も追加質問して申し訳ありません。

もし繰り返しが1回ではなく2回になった場合、28・29行目だけではなく、54・55行目も同じように飛ばしたい場合は

         If RW = 28 Then   '28になったら強制的にRWを30へすっ飛ばす
             RW = 30

の部分を追加する形で変更すれば対応できるのでしょうか?
もしお時間ありましたらお教え下さい。
(sato) 2018/04/19(木) 00:19


 >もし繰り返しが1回ではなく2回になった場合、28・29行目だけではなく、54・55行目も同じように飛ばしたい場合は 
 >         If RW = 28 Then   '28になったら強制的にRWを30へすっ飛ばす
 >             RW = 30
 >の部分を追加する形で変更すれば対応できるのでしょうか?  

 2つのケースだけなら↓

          If RW = 28 or RW = 54 Then   '28又は54なら強制的に、RW+2 として、2行すっ飛ばす
              RW = RW + 2

 もっと沢山のケースがあるなら、その規則性を喝破して、臨機応変に処理してください。

(半平太) 2018/04/19(木) 09:36


もしかして、EからPの列で数式が数値を返しているセルをクリアして、
各行で見て、全て空白ならその行を削除したいってことでしょうか?

Sub test()

    Dim rngArea As Range
    Dim a As Range
    Dim r As Range
    Dim rngTarget As Range

    Set rngArea = Worksheets("1週目").Columns("E:P").SpecialCells(xlCellTypeFormulas)

    For Each a In rngArea.Areas
        On Error Resume Next
        r.SpecialCells(xlCellTypeFormulas, xlErrors + xlLogical + xlNumber).ClearContents
        On Error GoTo 0

        For Each r In a.Rows
            If WorksheetFunction.CountA(r) = 0 Then
                If rngTarget Is Nothing Then
                    Set rngTarget = r
                Else
                    Set rngTarget = Union(rngTarget, r)
                End If
            End If
        Next
        If Not rngTarget Is Nothing Then rngTarget.Delete Shift:=xlShiftUp
    Next
End Sub
(まっつわん) 2018/04/19(木) 11:18

半平太様
追加の質問もご返答ありがとうございました。
そのように繰り返す事が分かれば、繰り返しが増えても対応出来ます。
本当にありがとうございました!

まっつわん様
ご返答ありがとうございます。
半平太様のご返答で解決はしましたが、こちらの方法も勉強の為に試してみます。
ありがとうございます!!
(sato) 2018/04/19(木) 13:00


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.