
Excel VBAのAutoFilterプロパティについて質問です。
(Excelのバージョンは2010です。)
■背景
・マクロ実行時、オートフィルタを解除し、終了直前に実行前の抽出状態を復元するマクロを組んでいます。
・実行前の抽出情報を取得するために、ワークシートのAutoFilterプロパティから必要な情報を事前に配列に格納しています。
(具体的には、Criteria1、Operator、Criteria2の3つのプロパティをn×3次元の配列に格納)
■問題
・以下の通り、ワークシートにデータが入力されていたとします。
A列
1 10
2 11
3 11
4 11
5 12
・通常、「トップテン」のオートフィルタで「上位3項目」などのように指定する場合は、以下のプロパティをAutoFilterメソッドに渡します。(細かい記述は割愛)
Criteria1:= 3
Operator:= xlTop10Items
※Excelのオートフィルタの仕様上、上述の例で言えば、A1~A4が表示されます。
・このような絞り込みがなされたフィルタ情報を取得しようとした場合、以下の様にAutoFilterプロパティに格納されているため、このまま配列に受け渡した上で、再度オートフィルタを復元しようとしてもエラーとなってしまいます。
Criteria1:= ">=11"
Operator:= xlTop10Items
※Operatorに敢えて「0」を受け渡し、「11以上」と指定させるようフィルタを復元することで、
結果的な表示はA1~A4が表示された状態に戻せるのですが、
本来であれば「上位3項目」というフィルタを復元させたいです。
・上記の例の場合、「上位2項目」「上位3項目」「上位4項目」いずれの絞り込みをしたとしても、AutoFilterプロパティには「11以上」という状態しか保持していないため、「上位何項目で絞り込んだか」をRANK関数等から逆算することもできません。
■質問
・「トップテン」のオートフィルタで絞り込みをした場合、「上位何項目で絞り込んだか」を取得するようなプロパティ、または方法(多少無理矢理でも構いません)をご存知でしたら、ご教示頂ければ幸いです。
以上、宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
こんばんは。
言われて、なるほどと思いました。それは、不可逆なプロパティなのですね。
要するに、外部ツールを使っているから、取得出来ないのでしょう。
でも、
>「上位何項目で絞り込んだか」
というのは、
>「上位2項目」「上位3項目」「上位4項目」
どれも正解ではないでしょうか?
Win32APIで、Top 10 Filter Dialog Box(bosa_sdm_XL9)の中身を取り出せる人もいるかもしれませんが、今の私は、VBAマクロを忘れつつあるので、この程度です。
計算的に、出すしか方法が見当たりません。
以下の注意は、一番上の「項目名あり(True)」をありにしていますが、なし(False)にすれば、先頭から数えます。1列目の場合、2列目の場合とCriteria1を探すようにしています。ただ、複数の項目に対するものとかは、できませんが、以下の考え方を読んでみてください。テクニックはあっても、難しいことはしていません。また、Excelのバージョンによっても、読み取れる数の制限が発生するかもしれません。
'//
Sub Test1()
Dim Rng As Range
Dim n As Variant
Dim cl As Long
Dim dummy As Variant
Dim j As Long
Dim Ar() As Variant
Dim Arx() As Long
Dim i As Long
Dim c As Range
Dim cnt As Long
Dim t As Long
Dim a As Variant
Const bHEAD As Boolean = True '*注意-項目名あり
With ActiveSheet
'チェック-AutoFilter
If .AutoFilterMode = False Then MsgBox "オートフィルタモードではありません。", 48: Exit Sub
If .FilterMode = False Then MsgBox "すべて表示されています。", 48: Exit Sub
On Error Resume Next
For cl = 1 To .AutoFilter.Filters.Count
dummy = .AutoFilter.Filters(cl).Criteria1
If dummy <> Empty Then Exit For
dummy = Empty
Next cl
On Error GoTo 0
If .AutoFilter.Filters(cl).Operator <> xlTop10Items Then MsgBox "上位項目ではありません。", 48: Exit Sub
Set Rng = .AutoFilter.Range
If bHEAD Then 'トップに項目名があれば、1行減らす
Set Rng = Rng.Offset(1).Resize(Rng.Rows.Count - 1)
End If
j = Rng.Columns(cl).SpecialCells(xlCellTypeVisible).Count
ReDim Ar(j - 1)
ReDim Arx(j - 1)
For Each c In Rng.Columns(cl).SpecialCells(xlCellTypeVisible)
If c.Value <> "" Then
Ar(i) = c.Value
Arx(i) = i + 1
i = i + 1
End If
Next c
Ar = Application.Small(Ar, Arx) '昇順に並べ替え
For Each a In Ar
If t <> a Then
cnt = cnt + 1
End If
t = a
Next a
End With
If cnt <> j Then
MsgBox "上位" & cnt & "~" & j & "までの項目", vbInformation
Else
MsgBox "上位" & j & "までの項目", vbInformation
End If
End Sub
'//
WindFallerさん
とてもご丁寧なご回答、ありがとうございます。
ソースコード、大変参考になりました。
これなら、「上位何項目で絞り込んだか」をかなりの確度で算出できそうです。
>>「上位何項目で絞り込んだか」
>というのは、
>>「上位2項目」「上位3項目」「上位4項目」
>どれも正解ではないでしょうか?
個人的には「上位3項目」で絞り込んでいたのであれば、復元時にも「上位3項目」で設定し直したいイメージでした。
(トップテン オートフィルタのコマンドボックスに「上位」「3」「項目」と出るので、復元前後でここの値が変わってしまうのは避けたい。。)
但し、AutoFilterプロパティの限界のようですね。
>Win32APIで、Top 10 Filter Dialog Box(bosa_sdm_XL9)の中身を取り出せる人もいるかもしれません
こちらについても、もう少し調べてみようと思います。
アドバイスありがとうございます。
※ベストアンサーについては、もう少々お待ちください。
(他の皆様のご回答もお待ちした上で判断させて頂きたく。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) エクセルVBAコピー 2 2022/06/08 21:45
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Excel(エクセル) エクセルVBA オートフィルタでの絞り込みと並び替えについて 1 2023/07/08 13:08
- Excel(エクセル) 【エクセル」 特定のセルで条件抽出した列を、別シートに上から詰めて表示したい。 8 2022/04/08 16:00
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Excel(エクセル) エクセルでフィルタ後、考えている場所に値コピーができない。 1 2022/05/02 21:01
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで時刻(8:00~20:00)...
-
Excelのオートフィルタで非表示...
-
PhotoShopElement フィルタ 理...
-
エクセルでオートフィルタのボ...
-
エクセルの偶数行(奇数行)の抽出
-
エクセル キーとなる項目で判...
-
【Excel/関数/条件付き書式】月...
-
【EXCEL】条件に一致した最新デ...
-
Excel 日付・時刻データの抽出
-
excelオートフィルタの検索条件...
-
Excelマクロ:オートフィルタ3...
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
PowerPointで表の1つの列だけ...
-
Excelで隣のセルと同じ内容に列...
-
エクセルVBAで別BOOKに「名前の...
-
Excel 条件による複数行への値...
-
エクセル 同じ値を探して隣の...
-
エクセルでの複数条件下での標...
-
Excel2000のセル内の文字列の数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでオートフィルタのボ...
-
エクセルのオートフィルタで最...
-
エクセルで時刻(8:00~20:00)...
-
Excelのオートフィルタで非表示...
-
エクセル関数で、数字の入った...
-
エクセルの偶数行(奇数行)の抽出
-
access マクロでのフィルタの...
-
エクセルにて、フィルタをかけ...
-
Excel共有ブックのオートフィル...
-
オートフィルタで3つ以上の条...
-
オートフィルタは金額の桁カン...
-
データの抽出を教えてください
-
エクセルで隔週をもとめる
-
可視セルを対象としたcountifが...
-
エクセル、オートフィルタで最...
-
オートフィルタで未入力(空白...
-
オートフィルタを見出し行選択...
-
Excelで文字を入力と自動的にフ...
-
Excel2003 オートフィルタで「...
-
なぜShowAllDataだとうまく行か...
おすすめ情報