[[20120725171350]] 『VBA オートフィルタで空白セルを選択し、抽出』(イルカ) ページの最後に飛ぶ

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

 

『VBA オートフィルタで空白セルを選択し、抽出した行を空白にしたい』(イルカ)

2行目に見出しがあり、フィルタをかけています。

B行のオートフィルタで空白セルを選択し、その選択されたB行をデリートで
空白にしたいのです。
毎回空白行が変更するので、マクロで記憶させたいのですが、どうコードを書いたら
いいでしょうか?

ただ見た目が空白でも0の場合があり、300行まで表があるのですが、
Ctrl+Shift+↓ では、300行まで選択されないので
End(xlDown)やEnd(xlUp)は使えないです。

何かいい方法があれば教えてくださいm(__)m


 もし、すでにA列から始まる領域に対してオートフィルターの設定がされていて、
 その中のB列の空白セルの行を削除するということが要件なら、 以下のようにフィルタリング(抽出)しないで処理可能。

 ちょっと、あらっぽい(?)コードだけど。

 Sub Sample()
    On Error Resume Next
    ActiveSheet.AutoFilter.Range.Columns("B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    On Error GoTo 0
 End Sub

 (ぶらっと)

 あぁ

 >ただ見た目が空白でも0の場合があり

 つまり、値は0だけど、表示書式で空白にしているということ?
 なるほど。じゃぁ、その状態の対応版は、後ほどアップするね。
 (アップ済みのものは、ほんとの空白のみの対応版)

 (ぶらっと)

 見た目空白も対応するバージョン

 Sub Sample2()
    Dim myBody As Range

    With ActiveSheet.AutoFilter.Range
        Set myBody = .Columns("B").Offset(1).Resize(.Rows.Count - 1)
        .AutoFilter Field:=2, Criteria1:="="
        On Error Resume Next
        Set myBody = myBody.SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
        If Not myBody Is Nothing Then myBody.EntireRow.Delete
        If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
    End With

 End Sub

 (ぶらっと)

ぷらっと様 ご回答ありがとうございますm(__)m

Sample2()のコードで、空白セルも0表示も対応出来ました。

ただ変な仕様で申し訳ないのですが、行全体が削除になるのではなく、
各行は変更せず空白&0のみデリートで空白にしたいのですが、可能でしょうか?

手作業ですと、フィルタで空白セルのみ抽出し空白も0も範囲指定して
デリートを押せばいいのですが、毎回データーが変更するのでマクロで実行したいと
思っているのですが、初心者で・・・

可能であれば、よろしくお願いしますm(__)m
(イルカ)


 じゃぁ、

 If Not myBody Is Nothing Then myBody.EntireRow.Delete

 これを

 If Not myBody Is Nothing Then myBody.EntireRow.Clearcontents

 これでどうだろうか

 あるいは、他の列はさわらず、B列で空白に見えているセルだけを空白にする?
 もしそうなら、それはそれで対応するので、必要なら教えてね。

 (ぶらっと)

ぶらっと様 早速のご回答ありがとうございますm(__)m

If Not myBody Is Nothing Then myBody.EntireRow.Clearcontents
に変更したら、行は変わらず空白に出来ますね(^.^)

そうなんです・・・
B列で空白に見えているセルだけを空白にしたいです。

よろしくお願いしますm(__)m

(イルカ)


 それでは以下で。

 If Not myBody Is Nothing Then myBody.EntireRow.Clearcontents

 これを

 If Not myBody Is Nothing Then myBody.Clearcontents

 (ぶらっと)

 一応、↑でOKだと思うけど、要件に対するこちらの理解が紆余曲折して、途中からフィルタリングロジックをいれて
 それに基づいて対応してきたけど、以下のようなフィルタリングなしの処理でもできるね。
 データ量が多い場合どちらが早いかは確認していないけど。

 Sub Sample3()
    Dim v As Variant
    Dim i As Long
    v = Range("B1", Range("B" & Rows.Count).End(xlUp)).Value
    For i = 1 To UBound(v, 1)
        If Len(v(i, 1)) = 0 Then v(i, 1) = ""
    Next
    Range("B1").Resize(UBound(v, 1)).Value = v
 End Sub

 (ぶらっと)

コメント返信:

[ 一覧(最新更新順) ]


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