[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『空白行のみ上に詰めて表示したい』(マクロ初心者)
過去の掲示板を見ていても同様の質問が発見できませんでしたので、質問させていただきます。
趣旨としては、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
もし、空白セルが、「空白に見える "" 」が入ったセルなら、 ??? さんのコードで、全く問題はないですね。 そうではなく、本当の空白セルであれば、たとえば以下でしょうか。
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
まだまだ勉強不足で教えて頂いたコードの全部を解読できていないのですが、
調べつつ、勉強をして今後に生かしていきます!
勉強をしてβさんや???さんのようにvbaを使いこなせよう頑張ります。
ありがとうございました。
(マクロ初心者) 2016/03/28(月) 16:16
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.