質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

21458閲覧

【Excel VBA】フィルターをかけた後のデータ範囲で、1行目の見出しを選択できません。

PotePui

総合スコア69

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/03/01 12:56

編集2019/03/01 13:21

今日はVBAについてになります。
最終的に欲しい結果を記載します。

■欲しい結果
掲題の件の通り、フィルタリング後、I列の1行目(見出し)から一つ下セルに移動して、
そのセルから、最終行まで選択して削除するVBAを作成すること。です。

■できているところ
I列から一つ下のセルを選択する箇所以外

■できていないところ
0. 上記記載のI1セルを選択する

VBA

1range("I1").select, range("A1").offset(0,8).select 2```など 30. その下のセルを選択する箇所 4色々調べていくうちに、.entireRow.HiddenやxlcelltypeVisibleなどが使えるようですが、よく分かりませんでした。 5 6VBAはまだ中級いくかいかないか、そんな程度です。 7 8■最後に、今のコードを記載いたします。 9フィルタ条件が"<1999/12/31"になっているのは、1900年代の値をプログラムが抽出するためです。この値が必要ないため、VBAでここを削除するつもりでいます。 10 11※下記の箇所がわからないところです。 12その下の、ForNextや他にもDoUntil,Whileなどももっと良い処理があればご教示いただけますと幸いです。 13ちなみに、範囲は固定ではありませんので、ループ処理を行っています。 14つまり、データ範囲は可変で、最終行がさらに大きくなる可能性があることを考えての処理に現在しています。 15 16よろしくお願いいたします。 17```VBA 18' ################ 19' ここから 20' ################ 21Range("A1").Activate 22Range("A1").Offset(0, 8).Select 23' ################ 24' ここまで 25' ################
```VBA Option Explicit Dim MaxRow As Long Dim MaxColumn As Integer Public Sub フィルターで1900年代の値は削除する() ' ' 1900年代の値は、更新日、公開日ではないため、削除する。 MaxRow = Range("A1").SpecialCells(xlLastCell).Row MaxColumn = Range("A1").SpecialCells(xlLastCell).Column 'フィルターが既に設定されている場合、解除をして処理を抜ける。 If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter Exit Sub End If ' フィルターが設定されていない場合の処理 If ActiveSheet.AutoFilterMode = False Then Range("A1").Select Selection.AutoFilter '"I9"列の値<1999/12/31より前の日付でフィルターを掛ける。 Range("A1").CurrentRegion.AutoFilter field:=9, Criteria1:="<1999/12/31", Operator:=xlAnd ' ################ ' ここから ' ################ Range("A1").Activate Range("A1").Offset(0, 8).Select ' ################ ' ここまで ' ################ Dim i As Long For i = 1 To MaxRow Step 1 If Cells(i, 9).EntireRow.Hidden = False Then Exit For End If i = i + 1 Next i ActiveCell.Select End If Range(Selection, Selection.End(xlDown)).Select ' 選択範囲をクリア Selection.ClearContents Selection.AutoFilter Range("A1").Select End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

VBA

1Sub test() 2 With ActiveSheet 3 If .AutoFilterMode Then .AutoFilter.Range.AutoFilter 4 With .Range("A1").CurrentRegion 5 .AutoFilter field:=9, Criteria1:="<1999/12/31" 6 .Offset(1).Delete xlShiftUp 7 .AutoFilter 8 End With 9 End With 10End Sub

こんな感じでいいと思います。
フィルターモード中は非表示行は操作対象になりませんので、
ざっくり、表全体を指定しても大丈夫です。
さらにタイトル行を除いて操作対象にするなら、
これもざっくり1行分オフセットしてやればいいと思います。
まぁ比較的簡単にタイトル行を除外できますが、
1行余分に下の行を削除したところで空白行なので、
何の問題もないですよね?

With句の意味&使い方は解りますかね?
.AutoFilter.Range.AutoFilter
↑の意味解りますかね?

投稿2019/03/01 14:25

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PotePui

2019/03/02 05:36

ありがとうございます。 こちらも検証しました。 上記の方と同じ理由で、 フィルター後の可視セル(表)全体がクリアされてしまってました???? .Offset(1) これが1行分オフセットなら、 その位置から、 Range(Selection, Selection.End(xlDown)).Select を使って最終行まで選択できそうかなと思ってます。 With句は 最初に対象となるオブジェクトを記載して、 そのあとにプロパティを記載していくって思ってます。 今、時間がなくて調べられないので、とりあえずご連絡まで。 ありがとうございます。
guest

0

ご希望のことを簡潔にいうと、
I列の1900年代(1999/12/31以前)の値をクリアしたい。
ということだと解釈しましたが、あってますか。

非表示セルはClearContentsの対象外ですの下記でいいかと。

vba

1Sub フィルターで1900年代の値は削除する() 2 With ActiveSheet.Range("A1").CurrentRegion 3 'フィルターが既に設定されている場合、解除をして処理を抜ける。 4 If ActiveSheet.AutoFilterMode Then 5 .AutoFilter 6 Exit Sub 7 End If 8 .AutoFilter Field:=8, Criteria1:="<=1999/12/31" 9 .Resize(, 1).Offset(1, 7).ClearContents 10 .AutoFilter 'オートフィルター解除 11 End With 12End Sub

上記のコードを理解するのに参考になると思われるリンク

Office TANAKA - VBA高速化テクニック[Selectしない]

Office TANAKA - 今さら聞けないVBA[Withって何ですか?]

Office TANAKA - セルの操作[セル範囲の取得]

Excel VBA Offset とResizeを使いこなそう

投稿2019/03/02 01:32

編集2019/03/02 05:37
hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PotePui

2019/03/02 05:27

お返事ありがとうございます。 >I列の1900年代(1999/12/31以前)の値をクリアしたい。 はい、その認識で間違いありません。 そのうえで、検証してみましが、 I列にフィルターをかけるようにしてもうまくいかなかったです。 何がうまくいかなかったのかは、 フィルター後のI列のデータはすべてクリアするのはいいのですが、 他の列のデータは残しておきたいです。 I列には日付が1列に入力されていて、他の列には他のデータが入っているので、 他のデータまで消されちゃうような形は困ってしまいます。 参考サイトありがとうございます。 リサイズは知らなかったです。大変参考になります。
hatena19

2019/03/02 06:50

コードがテストに作成したデータ(C列に日付)のものだったので、I列に日付の場合に変更しておきました。変更したコードで試してみてください。
PotePui

2019/03/02 14:09

ありがとうございます。 列が一つずれてましたが下記コードでしっかり1999年以降のものは削除されました。 '''VBA End Sub Sub フィルターで1900年代の値は削除するz() With ActiveSheet.Range("A1").CurrentRegion 'フィルターが既に設定されている場合、解除をして処理を抜ける。 If ActiveSheet.AutoFilterMode Then .AutoFilter Exit Sub End If .AutoFilter Field:=9, Criteria1:="<=1999/12/31" .Resize(, 1).Offset(1, 8).ClearContents .AutoFilter 'オートフィルター解除 End With End Sub ''' 最後に、 I列で1999年以前の日付のデータのみを抽出して、 このあとに、隣の、(隣でなくとも)J列、K列と2行はそのまま条件指定なしで、 .clearContetentsやDeleteできるようにするには、どうすればよいでしょうか。 詳細については下記になります。 1.I列を1999年以前でフィルタをかけて、I列のみ削除する ⇒ ここまで現在成功 2.J列、K列も上記フィルタを解除しないで、そのまま選択して、最終行までデータ削除を行う。 ⇒ 今回知りたい箇所 大変申し訳ございませんが、よろしくお願いいたします。
PotePui

2019/03/02 16:54

自己解決にいたしましたが、 もとになったのは、教えていただいたコードになります。 上記質問の2のケースが今回解決したコードになっています。 ありがとうございました。
guest

0

自己解決

教えていただいたコードを結果的に下記のような形にして、
今回のご質問は無事解決いたしました。

教えていただき、ありがとうございます。

VBA

1Sub Delete_DataBefore1999() 2 With ActiveSheet.Range("A1").CurrentRegion 3 'フィルターが既に設定されている場合、解除をして処理を抜ける。 4 If ActiveSheet.AutoFilterMode Then 5 .AutoFilter 6 Exit Sub 7 End If 8 'I列のUpdated(更新日カラム)において、1999/12/31以前の日付のみを絞り込む 9 .AutoFilter field:=9, Criteria1:="<=1999/12/31" 10 .Resize(, 1).Offset(1, 8).ClearContents 11 'J列の値が空でない場合、フィルタがかかっている表示J列の値をクリア 12 .AutoFilter field:=10, Criteria1:="<>""" 13 .Resize(, 1).Offset(1, 9).ClearContents 14 .AutoFilter field:=11, Criteria1:="<>""" '上記同様に、K列もクリア 15 .Resize(, 1).Offset(1, 10).ClearContents 16 .AutoFilter 'オートフィルター解除 17 End With 18 Range("A1").Select 19End Sub

投稿2019/03/02 16:49

PotePui

総合スコア69

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問