オートフィルターとClearContentsメソッド

フィルターをかけているときのRange.ClearContentsメソッドの挙動

ちょっとビックリしたので、記しておく。

フィルターで非表示の列が含まれているRangeオブジェクトにClearContentsメソッドを実行する

f:id:akashi_keirin:20180225200115j:plain

こんな表があったとする。E列には全て値が入っている。

f:id:akashi_keirin:20180225200126j:plain

んで、オートフィルターで「武松」と「楊志」の行を非表示にする。

f:id:akashi_keirin:20180225200250j:plain

こうなる。

んで、この状態(E列の上から下までが選択されている)で

Public Sub testClearValue()
  Dim targetRange As Range
  Set targetRange = Selection
  targetRange.ClearContents
End Sub

このコードを実行する。見ての通り選択範囲(Selection)を変数targetRangeにぶち込んで、targetRangeに対してClearContentsメソッドを実行するだけの簡単なプロシージャだ。

すると、

f:id:akashi_keirin:20180225200259j:plain

こうなる。一見、意図通りの結果に見えるが、フィルターを解除すると、

f:id:akashi_keirin:20180225200316j:plain

ファッ!!!!????

フィルターをかけた状態でイミディエイトで確認すると、

f:id:akashi_keirin:20180225200328j:plain

この通り。

よって、「Selection」すなわち「targetRange」は、ちゃんとセル14個分のはず。

なんでやねん!!!!????

範囲内のそれぞれのセルにClearContentsメソッドを実行する

わけが分からないけれど、現実なのだから仕方がない。

同じ状態から、今度は

Public Sub testClearValue()
  Dim targetCell As Range
  For Each targetCell In Selection
    targetCell.ClearContents
  Next
End Sub

このコードでやってみる。

f:id:akashi_keirin:20180225200338j:plain

今度は意図通りの結果となった。

おわりに

こんなことになるとは全く知らなかった。

フィルターと併用するときには気をつけないといけないなあ。