[[20160328125646]] 『空白行のみ上に詰めて表示したい』(マクロ初心者) ページの最後に飛ぶ

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

 

『空白行のみ上に詰めて表示したい』(マクロ初心者)

過去の掲示板を見ていても同様の質問が発見できませんでしたので、質問させていただきます。
趣旨としては、AからH列のうち、すべてのセルが空白の場合のみ上に詰めて、データを表示し、対象のデータを他のシートにコピーしたいと考えております。
ただし、I列以降もデータが入力されているため、行の削除をしてI列以降のデータが削除されることは避けたいです。
複数シートからデータを参照している関係上、できればVBAで実行することを検討しております。

VBAは勉強しはじめて間もないため、詳しくご教示いただければ幸いです。

(空白行削除前)
|A |B |C |D |E |F |G |H |
|あ|あ| |あ|あ|あ|あ|あ|
|い| |い|い|い|い|い| |
| | | | | | | | |(←空白行)
| | |え| | |え| |え|


(空白行削除後)
|A |B |C |D |E |F |G |H |
|あ|あ| |あ|あ|あ|あ|あ|
|い| |い| |い|い|い|い|
| | |え| | |え| |え|

< 使用 Excel2010:、使用 OS:windows7 >


詳しく書くような箇所は無いと思いますので、ご自分でステップ実行し、ネット検索し、調べてみてください。

 Sub test()
    Dim i As Long
    Dim j As Long

    For i = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1
        For j = 1 To 8
            If Cells(i, j).Value <> "" Then
                Exit For
            End If
        Next j
        If 8 < j Then
            Range(Cells(i, 1), Cells(i, 8)).Delete Shift:=xlUp
        End If
    Next i
 End Sub
(???) 2016/03/28(月) 13:21

早速ありがとうございます。
希望通りに実行することができました。

別の列にも適用しなければならないので、
教えて頂いたコードを読み解いていきたいと思います。

大変助かりました!
ありがとうございます!
(マクロ初心者) 2016/03/28(月) 13:28


 失礼します。

 >>希望通りに実行することができました。 

 そうですか?
 たとえばアップされたサンプルデータの場合、コードを実行しても何も変わらないと思いますが?

(β) 2016/03/28(月) 14:39


私も、とりあえずA列で末尾判定していますが、あれ、これで動いたの?、って思いました。
必ずデータのある列に変えてね、と返す予定が…。
(???) 2016/03/28(月) 14:48

 もし、空白セルが、「空白に見える "" 」が入ったセルなら、 ??? さんのコードで、全く問題はないですね。
 そうではなく、本当の空白セルであれば、たとえば以下でしょうか。

 Sub Sample()
    Dim r As Range
    Dim d As Range

    With Range("A1", ActiveSheet.UsedRange).Columns("A:H")
        Set d = .Offset(.Rows.Count).Cells(1)
        For Each r In .Rows
            If WorksheetFunction.CountBlank(r) = r.Cells.Count Then Set d = Union(d, r.EntireRow)
        Next
    End With

    d.EntireRow.Delete

 End Sub

(β) 2016/03/28(月) 14:51


継続してコメントをいただけているとは露知らず、失礼いたしました。

実は、この空白行の前に一段階踏んでおりまして、

1.複数シートからA:Hの値のみ作業シートにコピー
2.作業シート上で空白の行を削除(この方法が分からず、質問させていただきました)
3.削除した後のA:Hのデータを集計シートに貼り付け

そのため、空白のセルは何も入力されていないセルとなります。

私も、とりあえずA列で末尾判定しています ??? さんのかいていただいたコードから推測し、自分のデータを確認したところ、H列については必ず記入がありましたため、変更して実行いたしました。
情報の精査ができていないなかでの質問となり、すみませんでした。

βさんのコードでは、I列以降に記入されているデータも削除されてしまいました。
I列以降も削除されないように変更したいと思ったのですが、まだまだ読み解けず。。
お教えいただきましてありがとうございます!
引き続き勉強をしていきたいと思います。

(マクロ初心者) 2016/03/28(月) 15:15


 >>I列以降も削除されないように変更したいと思ったのですが

 以下で。

 Sub Sample()
    Dim r As Range
    Dim d As Range

    With Range("A1", ActiveSheet.UsedRange).Columns("A:H")
        Set d = .Offset(.Rows.Count).Rows(1)
        For Each r In .Rows
            If WorksheetFunction.CountBlank(r) = r.Cells.Count Then Set d = Union(d, r)
        Next
    End With

    d.Delete xlUp

 End Sub

(β) 2016/03/28(月) 15:34


βさん

変更いただいたコードで実施したところ、無事希望通りに実行でしました!
ありがとうございます。

勉強不足で申し訳ないのですが、このコードの空白行の判定はどの列になるのでしょうか?
I列以降にも同様にデータをコピーして繰り返すため、後学のためにお教えいただければ嬉しいです。
(マクロ初心者) 2016/03/28(月) 15:44


 If WorksheetFunction.CountBlank(r) = r.Cells.Count Then Set d = Union(d, r)

 ここです。

 シート関数の COUNTBLANK を使っています。関数で対象にしている領域 r は
 全体の領域 Range("A1", ActiveSheet.UsedRange).Columns("A:H") から1行ずつ取り出した部分、
 つまり各行のA〜H列になります。
 で、その結果(空白セル数)が rの中のセル数(つまり 8 ) と同じなら A〜H が空白だということになりますね。

(β) 2016/03/28(月) 16:01


詳しい解説ありがとうございます。
恥ずかしながら、COUNTBLANK関数、初めて使い方を知りました。
他のデータもこれから集約していくので、反映させたいと思います。

まだまだ勉強不足で教えて頂いたコードの全部を解読できていないのですが、
調べつつ、勉強をして今後に生かしていきます!

勉強をしてβさんや???さんのようにvbaを使いこなせよう頑張ります。
ありがとうございました。
(マクロ初心者) 2016/03/28(月) 16:16


コメント返信:

[ 一覧(最新更新順) ]


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