Excel VBAでフィルタを使う際によく出会う落とし穴のひとつが、AutoFilterMode
プロパティ です。
「AutoFilterMode = True
なのにフィルタが効かない」「絞り込みを実行しても反応しない」といった現象に悩んだ方も多いのではないでしょうか。
ここでは、なぜこうした問題が起こるのか、そしてどう対処すべきかをわかりやすく解説します。
目次
1. AutoFilterModeとは?
AutoFilterMode
はシートに「フィルタが存在するかどうか」を返すプロパティです。- 返り値は以下のようになります。
True
→ フィルタが有効(ただし絞り込みされているかは別問題)False
→ フィルタ自体が存在しない
つまり、AutoFilterMode = True
であっても、必ずしも「フィルタが正しく機能している」とは限らないのです。
2. フィルタが効かない主な原因
(1) データ範囲外にフィルタが設定されている
- フィルタは「連続したセル範囲」にしか作用しません。
- 空白行や別のテーブルがあると、フィルタが正しく認識されず、
AutoFilterMode = True
でもデータに対して機能しないことがあります。
(2) ヘッダー行がずれている
- フィルタは基本的に 1行目をヘッダー行 として認識します。
- しかし、ヘッダー行に空白がある、データ範囲が途中から始まるなどの場合、フィルタがかかっていても絞り込みが効きません。
(3) フィルタが「見えているだけ」の状態
- 以前にフィルタを設定したまま、データが削除・変更されると、フィルタボタンだけが残り「見かけ上はフィルタが有効」な状態になります。
- この場合、
AutoFilterMode = True
でも実際にはデータが対象外です。
3. 解決方法
(1) 既存フィルタを解除して再設定する
フィルタが正しく機能しないときは、まず一度フィルタを解除し、改めて設定し直すのが基本です。
With Worksheets("Sheet1")
'既存のフィルタを解除
If .AutoFilterMode Then .AutoFilterMode = False
'新しくフィルタを設定(A1セルから始まる表を想定)
.Range("A1").CurrentRegion.AutoFilter
End With
👉 この方法なら「フィルタが存在するけれど効かない」という曖昧な状態を避けられます。
(2) データ範囲を明示的に指定する
CurrentRegion
は空白行や列で範囲が途切れるため、うまくいかないこともあります。
その場合は、明示的に範囲を指定するのが確実です。
With Worksheets("Sheet1")
'範囲を明示してフィルタを設定
.Range("A1:C100").AutoFilter
End With
(3) ヘッダー行を確認する
- フィルタを設定する前に、必ず「表の1行目がヘッダー行になっているか」を確認してください。
- 空白や重複した列名があると、思ったように動作しないことがあります。
4. 実務でのチェックポイント
- フィルタが効かないときは「AutoFilterModeがTrueだから大丈夫」と思い込まない。
- 解除して再設定するのが最も手早く確実。
- 空白行が混ざっていないか、範囲を正しく指定しているかも必ず確認する。
5. まとめ
AutoFilterMode = True
は「フィルタが存在する」ことを示すだけで、「有効に動いている」保証ではない。- フィルタが効かない場合は、一度 解除して再設定 するのが基本対策。
- 範囲の指定方法やヘッダー行の整合性を見直すことも重要。
コメント