[[20191203161546]] 『データの無い行削除について』(だるいぬ) ページの最後に飛ぶ

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

 

『データの無い行削除について』(だるいぬ)

印刷範囲設定時、空白ページが複数できてしまうので、これを回避する為にデータの最終行を取得後、空白セルを行選択で削除を行いたいです。

End(xlDown)、End(xlUp)を用いたデータの最終行取得についてはわかったのですが、参照後、行選択にする方法がわかりません。

どの様な方法がありますか?

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


 名前の定義で可変にできますけど、それじゃだめですか?
http://www.siminpc-kitakyushu.com/index.php?QBlog-20170427-1

 いずれにしろ、どういうデータがあるかわからないので何とも言えないですねぇ。
(稲葉) 2019/12/03(火) 16:43

 |A|B|C|D|E|
1|a| | |d| |
2|a| | |d| |
3|a| | |d| |
4|a| | |d| |
5| | | | | |
6| | | | | |

このような場合に5行目以降を行選択して削除したいというイメージです。

(だるいぬ) 2019/12/03(火) 18:12


 こんな感じ?
 Range("A" & Rows.Count, Cells.Find("*", , , , , xlPrevious).Offset(1)).EntireRow.Delete
(稲葉) 2019/12/03(火) 18:51

>稲葉さん
ありがとうございます

実行してみたところ、エラーはでないのですがデータベースにも変化が無いようです。

このコードはA列の空白行をFindにて検索後、行削除という認識であっていますか?
Offsetを組み込むのはなぜですか?

データベースについて補足で、参照はA列で行います。
A列には上部にデータがまとまっているので、手動で作業する場合、5行を行選択後、Ctrl+↓ 削除でも問題無いです。

ただマクロ化する場合の方法がわかりません

 |A|B|C|D|E|
1|a| | |d| |
2|a| | |d| |
3|a| | |d| |
4|a| | |d| |
5| |b| | | |行削除
6| | |c| | |行削除
7| | | | |e|行削除
8| | | | | |行削除
9| | | | | |行削除
 | | | | | |...〜1048576行まで削除(Excel最終行まで削除)
(だるいぬ) 2019/12/04(水) 09:46

 横から失礼します。こういうことでしょうか?

 Sub Macro1()

     Application.ScreenUpdating = False
     Rows(Range("A1").End(xlDown).Row + 1 & ":1048576").Delete
     Application.ScreenUpdating = True

 End Sub
(bi) 2019/12/04(水) 09:55

こういうことかな?

 Sub Deletesample()
    Dim rng As Range
    Set rng = Cells(Rows.Count, 1)
    Range(rng, rng.End(xlUp).Offset(1)).EntireRow.Delete
 End Sub

(海苔) 2019/12/04(水) 10:20


>biさん
>海苔さん

どちらも動作しました!ありがとうございます

わからないオブジェクトやプロパティについては自分で調べてみようと思います

またわからないことがあれば質問させて下さい!m(_ _)m
(だるいぬ) 2019/12/04(水) 11:24


横からですけど、基本的には稲葉さんのアイデアをベースに改造していけばいいんじゃないですかね
 (1) 【逆順】に検索して、検索範囲(A列)の「""」ではない"セル"の【1行下】の"セル"を取得する ← 削除する範囲の始点
 (2) そのシートの最後のセル ← 削除する範囲の終点
 (3) 始点〜終点のセル範囲を削除する

    Sub さんぷる()
        Dim 発見セル As Range

        Set 発見セル = Range("A:A").Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious)

        If Not 発見セル Is Nothing Then
            Range(発見セル.Offset(1), Cells.SpecialCells(xlCellTypeLastCell)).Delete
        End If
    End Sub

ちなみに、A列が空白であれば削除したい(歯抜けがある場合、その行削除)ということなら、1行目は対応出来ないですけど、オートフィルタを使っても対処できそうです

    Sub さんぷる2()

        With ActiveSheet
            .AutoFilterMode = False
            .Range("A:E").AutoFilter Field:=1, Criteria1:="="
            .AutoFilter.Range.Offset(1).EntireRow.Delete
            .AutoFilterMode = False
        End With

    End Sub

また、海苔さんの方法だと、数式で゙゙にしている場合、rng.End(xlUp)で反応しちゃうので、データの内容によっては注意が必要かも。

(もこな2 ) 2019/12/04(水) 12:46


>もこな2さん

丁寧にご説明頂きありがとうございます

納品書や請求書のように、上部の固定位置に雛形データが含まれていて、下部のデータベースのみ処理を行う場合は、オートフィルタを用いて対応するのがベストでしょうか?

納品書↓
https://hinagata-journal.com/business/delivery-slip-016
(だるいぬ) 2019/12/05(木) 11:49


可視行のみ選択できるSpecialCellsプロパティというものを調べました

1点疑問なのですが、データの有無問わず指定位置から最終行(1048576)を範囲選択する場合の指定方法がわからないです。

16行目にオートフィルを設定する場合、17行目〜最終行の範囲内で可視行のみ選択し削除を行う。

という考え方はあっていますか?

(だるいぬ) 2019/12/05(木) 13:03


リンクはみてません。
>オートフィルタを用いて対応するのがベストでしょうか?
ベストかは分かりませんが、やっていることが分かっていて、そのアプローチが使えるなら選択肢の一つではあるとおもいます。

>16行目にオートフィルを設定する場合、17行目〜最終行の範囲内で可視行のみ選択し削除を行う。
という考え方はあっていますか?
お使いのバージョンであれば、可視行を指定しなくとも、抽出されている行だけが対象になるような…

>最終行(1048576)
海苔さんが、Cells(Rows.Count, 1) と示していますよ。
ただ、

 Range("A16",Cells(Rows.Count, "E")).AutoFilter

とした場合、最大行までオートフィルタが設定されちゃいませんか?
(スマホなので実験できず)

(もこな2 ) 2019/12/06(金) 09:06


 >可視行のみ選択できるSpecialCellsプロパティというものを調べました
 >1点疑問なのですが、データの有無問わず指定位置から最終行(1048576)を範囲選択する場合の
 >指定方法がわからないです。
 >16行目にオートフィルを設定する場合、17行目〜最終行の範囲内で可視行のみ選択し削除を行う。
 >という考え方はあっていますか?

最初に、「オートフィル」と「オートフィルター」は違う機能ですので、
今一度ご確認を。

で本題。

検索したいのが「本当の空白セル(見た目が空白に見えるセルとは違う)」ならば、
オートフィルターを持ち出す必要はないでしょう。

「SpecialCellsプロパティ」(=条件を選択してジャンプの機能)までたどり着いたなら、
その機能で「空白セル」を検索することが可能です。

やりたいことが、

「アクティブなシートの、
それのA16セルから、それの使っているセル範囲の最後のセルまでの範囲の内、
1列目が空白のセルの行全体を削除」

と書きたいなら、
VBA語では、

    With ActiveSheet
        .Range(.Range("A16"), .UsedRange.Cells(.UsedRange.Cells.Count)).Columns(1) _
            .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End With

このようになります。

VBA語の「.(ピリオド)」が、日本語の「の」にだいたい当るので、
見比べてください。
(まっつわん) 2019/12/06(金) 16:31


書きためている間に順番が前後しちゃったけど、(もこな2 ) 2019/12/06(金) 09:06の続き。

ちなみに、オートフィルタを提案しておいてなんですが、とにかく17行目以下でA列の値がブランクに見えるセルを行ごと削除したいとかであれば、1セルずつ値が「""」であるかを見て、一旦該当するセルを覚えておき、最終的に覚えたセルがあれば、"含まれる行"を削除すれば事足ります。
(本当のブランクか、数式で「""」にしているのかは区別しません)

    Sub 別案()
        Dim MyRNG As Range
        Dim 最終行 As Long, i As Long

        '▼データのある最後のセルの行番号を取得
        最終行 = Cells.SpecialCells(xlCellTypeLastCell).Row

        If 最終行 > 16 Then
            For i = 17 To 最終行
                If Cells(i, "A").Value = "" Then

                    '▼A列が「""」だったら覚える(MyRNGに加える)
                    If MyRNG Is Nothing Then
                        Set MyRNG = Cells(i, "A")
                    Else
                        Set MyRNG = Union(MyRNG, Cells(i, "A"))
                    End If
                End If
            Next i

            '▼覚えたセルがあれば(MyRNGがNothingでなければ)そのセルが含まれる行を削除する
            If Not MyRNG Is Nothing Then
                MyRNG.EntireRow.Delete
            End If
        End If

    End Sub

 ※↑のコードは1048576行目まで見ても問題は生じませんが、使ってない部分を延々とチェックするのも
     無駄だとおもうので何らかの方法で最後のセルを調べて指定した方がよいとおもいます。

更に言うと、印刷をするときに邪魔なだけなら、一時的に非表示にするだけでも対応できたりしそうな気がします。

    Sub 別案2()
        Dim MyRNG As Range
        Dim 最終行 As Long, i As Long

        '▼データのある最後のセルの行番号を取得
        最終行 = Cells.SpecialCells(xlCellTypeLastCell).Row

        If 最終行 > 16 Then
            For i = 17 To 最終行
                If Cells(i, "A").Value = "" Then

                    '▼A列が「""」だったら覚える(MyRNGに加える)
                    If MyRNG Is Nothing Then
                        Set MyRNG = Cells(i, "A")
                    Else
                        Set MyRNG = Union(MyRNG, Cells(i, "A"))
                    End If
                End If
            Next i

            '▼覚えたセルがあれば(MyRNGがNothingでなければ)そのセルが含まれる行を一時的に非表示にする
            If Not MyRNG Is Nothing Then
                MyRNG.EntireRow.Hidden = True
                ActiveSheet.PrintPreview
                Cells.EntireRow.Hidden = False               
            End If
        End If

    End Sub

ただ、A列に数式で「""」にしているセルがないと言うことであれば、ループがない分まっつわんさんの方法の方がスマートですし(私はSpecialCellsを思いつけなかったのでループにしちゃいました)、提示のように歯抜けも無いなら、海苔さんの方法がベターのように思えてきたので、オートフィルタを使う方法は、歯抜けがあって、数式で""にしているセルがある場合に使えるかな〜くらいに考えたほうがよいかもです。

(もこな2) 2019/12/06(金) 20:24


コメント返信:

[ 一覧(最新更新順) ]


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