[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『【VBA】アクティブセルの値でオートフィルター』(りん)
いろいろ探してみましたがわかりませんでしたのでお願いいたします。
すでにフィルターが設定されている名簿の一覧表があります。A列に「氏名」、B列に「性別」、C列に「都道府県」が入力されているのですが、ボタンひとつで、アクティブセルの値をフィルターしたいと考えています。特定のセルの値をフィルターするのではなく、そのとき指定したアクティブセルの値です。そのため、B列の「女性」という値でフィルターするときや、C列の「北海道」という値でフィルターすることもあります。実際にはこの表は20列ぐらいあります。
以上のような機能は可能でしょうか。よろしくお願いいたします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
例えばこんな感じでしょうかね...
Sub Test()
If ActiveCell Is Nothing Then Exit Sub
With ActiveCell
If Not ActiveSheet.AutoFilterMode Then .AutoFilter
.AutoFilter .Column - ActiveSheet.AutoFilter.Range.Column + 1, "=" & .Value
End With
End Sub
(白茶) 2021/03/16(火) 10:09
フィルターできる時とできない時があります。
特に、最初フィルターしようとすると、
「実行時エラー'91' - オブジェクト変数または With ブロック変数が設定されていません。」と出て、
デバッグとして「.AutoFilter .Column - ActiveSheet.AutoFilter.Range.Column + 1, "=" & .Value」を指します。
しかし「終了」を押して、再び同じセルでフィルターすると問題なくできます。
どうしてでしょうか。
(りん) 2021/03/16(火) 10:28
どうしてでしょうね? ゴメンナサイ分かりません^^;
(白茶) 2021/03/16(火) 10:55
ぶつかりましたが、そのまま If Not ActiveSheet.AutoFilterMode Then .AutoFilter は、 If ActiveSheet.AutoFilterMode Then .AutoFilter: .AutoFilter Else .AutoFilter のほうがいいかもしれません (´・ω・`) 2021/03/16(火) 11:03
ちょっと考えてみたんですけど、やっぱわかんなかった^^;
こちらExcel2010なんですけど、エラー出ないですね。 [テープル]を設定してある表で且つオートフィルタ矢印未設定だったらエラー出ましたけど。
(↓一応その部分だけ対応してみましたが、そういう問題ではない気がします)
Sub Test2()
If ActiveCell Is Nothing Then Exit Sub
With ActiveCell
If Not .ListObject Is Nothing Then
.ListObject.ShowAutoFilter = True
ElseIf Not ActiveSheet.AutoFilterMode Then
.AutoFilter
End If
.AutoFilter .Column - ActiveSheet.AutoFilter.Range.Column + 1, "=" & .Value
End With
End Sub
(白茶) 2021/03/16(火) 11:46
白茶さん 単純な例でいうと、1つのシートに2つの独立な領域があって、 一つめの領域ですでにAutoFilterがかかっているときに、 2つ目の領域のセルをアクティブにして実行するとエラーになります。
なので、AutoFilterを使い回さないで、 AutoFilterを解除してから新規でAutoFiterするのが安全なようです。 (´・ω・`) 2021/03/16(火) 11:56
(´・ω・`)さん、どうも。いつもお世話になってます。 なるほど確かにそれは想定してませんでした。
>AutoFilterを解除してから新規でAutoFiterする これやっちゃうと、 >B列の「女性」という値でフィルター して、更に >C列の「北海道」という値でフィルター する場合、 B列の絞り込みが無くなっちゃいますので、使い回しで運用してたんですが... こりゃちょっと宿題かなぁ... どうしょっかなー... (もはや自分の事しか考えてない^^; りんさんゴメンナサイ)
兎にも角にも、ありがとうございました。
(白茶) 2021/03/16(火) 12:16
さらに、大変恐縮ですが、追加でお聞きしてよろしいですか?
テーブルクリア(解除ではありません)のボタンがありまして、「ShowAllData」でクリアされるのですが、すべてのフィルタがクリアされた状態でボタンを押すとエラーになります。
こちらのエラーの解消方法はありますか?
(りん) 2021/03/16(火) 13:09
オートフィルタの話だとすると、絞り込まれてない状態で「ShowAllData」をかけるとエラーになるということですが、2通りの解決方法があるとおもいます。
(1)「On Error Resume Next」でエラーを無視する (2)絞り込まれているかどうか「ワークシートのFilterModeプロパティ」で判定して、真のときのみ「ShowAllData」する
【参考】 http://officetanaka.net/excel/vba/tips/tips104.htm http://officetanaka.net/excel/vba/tips/tips129.htm
(もこな2) 2021/03/16(火) 16:47
あっちゃー。 ほったらかしでしたスミマセン^^; そりゃ右往左往しますよね。
なるほどテーブル使ってたんですね。(それなら納得です)
んで、 そもそもオートフィルタが無かった場合の処理として ・オートフィルタを設置してでも絞り込みを続行するか ・何もしないで終わるか 私自身の >>どうしょっかなー... のそこが正に争点にもなるのですが、
汎用的な機能として活用するなら、先の(´・ω・`)さんご指摘のケース等も考えると、 やっぱ余計な事はしない方がいいかなって思ってます。今は。
「絞り込みしたい」って時点で、大抵の場合オートフィルタは既に設置済だろうし、 極端な話、ちょっと絞り込みたかったが為に エリア1がListObject.AutoFilterでエリア2はActiveSheet.AutoFilterなんて状態になっちゃうのも 運用面でどうかと思います。(仮に意図的にそうするなら、やはり既に設置済でしょうしねぇ)
てな訳で、 その点しか織り込んでない手抜きコードですけど一応貼り直しときます。(要らんかも知れませんけど) ご参考までということで。
Sub Test3()
If ActiveCell Is Nothing Then Exit Sub
Dim AFRange As Range
With ActiveCell
If .ListObject Is Nothing Then
' On Error Resume Next 'やっぱ余計な世話は焼かないでおこう
' If Not ActiveSheet.AutoFilterMode Then .AutoFilter
' On Error GoTo 0
If Not ActiveSheet.AutoFilterMode Then Exit Sub
Set AFRange = .Worksheet.AutoFilter.Range
Else
.ListObject.ShowAutoFilter = True '←ココまで[余計なお世話]認定しなくてもイイよね..
Set AFRange = .ListObject.AutoFilter.Range
End If
Set AFRange = AFRange.Offset(1, 0).Resize(AFRange.Rows.Count - 1)
If Intersect(ActiveCell, AFRange) Is Nothing Then Exit Sub
.AutoFilter .Column - AFRange.Column + 1, "=" & .Value
End With
End Sub
(白茶) 2021/03/16(火) 20:08
結局、オートフィルタなのかよく分かりませんでしたが、オートフィルタが常に設定されているとしたら↓みたいな感じでもよいかもですね。(Date型のデータがあるとまずいですが・・・・)
(すべてシートモジュールに記述)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'//オートフィルタのデータ部でダブルクリックしたときだけ、その値で絞り込み
With AutoFilter.Range
If Intersect(.Cells, .Cells.Offset(1), Target) Is Nothing Then Exit Sub
Cancel = True
.AutoFilter Field:=Target.Column, Criteria1:=Target.Value & ""
End With
End Sub
'------------------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'//オートフィルタのデータ部で右クリックしたときだけ、絞り込みを全解除
With AutoFilter.Range
If Intersect(.Cells, .Cells.Offset(1), Target) Is Nothing Then Exit Sub
Cancel = True
On Error Resume Next
ShowAllData
On Error GoTo 0
End With
End Sub
(もこな2) 2021/03/17(水) 17:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.