プロが教える店舗&オフィスのセキュリティ対策術

始めまして。
マクロ初心者です。
オートフィルで抽出後に抽出したものだけを削除するマクロを作成してますが、うまくいきません。

A列に「○」が入っているものだけを抽出
↑このマクロまではできていますが、
その後の削除が上手くいきません。

教えて下さい。

A 回答 (5件)

オートフィルタですよね?



オートフィルタで抽出したデータをクリア(ClearContents)してから
オートフィルタを解除し、空白行ができるのでSpecialCells メソッドのType :xlCellTypeBlanks(空の文字列)で選択した範囲(行)を
消すというのではどうでしょう。
    • good
    • 1
この回答へのお礼

迅速なご回答ありがとうございます。
オートフィルタです。
大変申し訳ございません。
マクロ初心者なので、n-junさんの回答がわかりません…

フィルタを1度解除ですか?

メゾットとは…?

お礼日時:2008/01/23 21:16

新規Bookを準備して、標準モジュールに下記コードをコピペして


実行してみて下さい。

Sub try()
 'ダミーデータのセット
Range("A1").Value = "名前"
Range("A2:A6").Value = Application.Transpose(Array("A", "B", "A", "C", "A"))
Range("B2:B6").Value = "=Row()-1"
Range("B2:B6").Value = Range("B2:B6").Value
MsgBox "データセット完了"

Dim r As Range

'オートフィルタ 抽出条件"A"
Range("A1").AutoFilter Field:=1, Criteria1:="A"
MsgBox "条件Aで抽出しました"


'rに項目行(A1)は消さないので、A2~A列最終行の”見えているセル”の値をセットし
'その値をクリア
Set r = Range(Range("A2"), Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
r.ClearContents
MsgBox "可視セルをクリアしました"

'オートフィルタを解除
Range("A1").AutoFilter
MsgBox "オートフィルタを解除しました"

'rにセットした範囲で空白セルのある行(A列がクリアされた範囲)を削除し、上に詰める
r.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
MsgBox "条件Aのあった行を削除し、上に詰めました"

End Sub

>メゾットとは…?
参考書か何かを見ながら、コードを作っているのではないのでしょうか?
それであれば、大抵記載されていると思いますよ。
取り敢えずは上のコードで動きを確かめてみて下さい。
    • good
    • 1

ANo.2です。



>Range("A1").AutoFilter Field:=1, Criteria1:="A"
Excelのバージョンによっては

Range("A1").AutoFilter Field:=1, Criteria1:="=A"
こっちの方がいいかな?(Aの前に"="をつける)
    • good
    • 0

マクロはコンピュータ内部では「VBA」と言うコードで登録されています。


VBAを多少いじれるようになるとムダのないお好み通りのマクロを作れるようになりますが、stay_stayさんはマクロ初心者とのことですのでとりあえず下記の方法ではいかがでしょう?

1.マクロの記録を開始
2.オートフィルタの設定(データ→フィルタ→オートフィルタ)
3.あらかじめデータが入力されている範囲を範囲選択しておく
(この時のポイントはデータの1番左上に当たるセルをアクティブにしておき、[ctlr] + [shift] + [→] でデータ範囲の右端まで範囲選択させ、同様に[ctlr] + [shift] + [↓] でデータ範囲の下端まで範囲選択させる。この方法でマクロを作るとデータが10行しかないときでも20行あるときでも常にデータ全体を範囲選択してくれる。)
4.オートフィルタでA列に○が入っている行を抽出
5.表示されている行だけが選ばれている状態にする(編集→ジャンプ→セル選択→可視セル)
6.行の削除
7.オートフィルタで全てのセルを表示させる
8.マクロ記録終了
    • good
    • 5

こんばんは。



解答はすでに出ていますから、参考程度に書いてみました。

私には、SpecialCells の使い方は、少し難しいような気がしました。

.SpecialCells(xlCellTypeVisible).Rows.Count =1 のときは、タイトル行が存在しているだけです。

.Offset(1).Resize(.Rows.Count - 1) は、タイトル行を削除しないようにしています。

Sub TestSort_Delete()
  Dim lngRow As Long
  With ActiveSheet
    'エラーが発生したら、ErrHandler に飛ぶ
    On Error GoTo ErrHandler
    .Range("A1").CurrentRegion.AutoFilter _
    Field:=1, _
    Criteria1:="○"
    '○の行の削除の方法
    With .AutoFilter.Range
      'すでに削除されてしまっているときは、削除を行わない
      If .SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then
        .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
      End If
    End With
ErrHandler:
    If Err.Number > 0 Then
      MsgBox Err.Number & ": " & Err.Description, 48
    End If
    .Range("A1").CurrentRegion.AutoFilter
  End With
End Sub
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています