|
オートフィルタしたデータを抽出する際、下記の様なコードは、とんでもない落とし穴が潜んでいます。
抽出データ範囲の1件目に1件しかないデータを抽出すると、とんでもない結果になります。
一見効率がよさそう、見た目がよさそう、スマートな書き方(どこがスマートだかわかりませんが...)と言う理由なら止めた方がいいです。
Range("A2", Range("A65536").End(xlUp)).SpecialCells(xlCellTypeVisible)
私も効率がよさそうだと言う理由で、今までのパターンと変えて、このパターンで1度、似たようなパターンで
1度回答してしまった事があります。
この欠点に気づかなければ、多分ずっとこのパターンを使用していたかもしれません。
オートフィルタするデータが、こんな感じだとして、下記コード注意1〜3を実行してみてください。
A
1 項目A
2 8 ← この位置のデータを抽出する際、同じ物が他に無いと問題が起こります。
3 9
4 2
5 1
6 2
7 3
8 3
9 1
10 4
11 4
12 7
13 3
14 5
15 1
16 6
Sub 注意1()
Dim AR As Long, MyRag As Range
'AR = Range("A65536").End(xlUp).Row '← フィルタする前の最終行を使えば大丈夫です。
Range("A1").AutoFilter Field:=1, Criteria1:="8"
'オートフィルタ後に表示されている最後の行を使った方が効率がよさそうに見えますが、
'↓ ここにあるととんでもないことになる。
AR = Range("A65536").End(xlUp).Row
Set MyRag = Range("A2:A" & AR).SpecialCells(xlCellTypeVisible)
MsgBox "抽出されたセルアドレス " & MyRag.Address
MyRag.Select
ActiveSheet.AutoFilterMode = False
Set MyRag = Nothing
End Sub
Sub 注意2()
Dim MyRag As Range
Range("A1").AutoFilter Field:=1, Criteria1:="8"
'注意1と同じパターン
Set MyRag = Range("A2", Range("A65536").End(xlUp)).SpecialCells(xlCellTypeVisible)
MsgBox "抽出されたセルアドレス " & MyRag.Address
MyRag.Select
ActiveSheet.AutoFilterMode = False
Set MyRag = Nothing
End Sub
Sub 注意3() '注意1と同じですが、フィルタする範囲を指定。
Dim AR As Long, MyRag As Range
AR = Range("A65536").End(xlUp).Row
Range("A1:A" & AR).AutoFilter Field:=1, Criteria1:="8"
Set MyRag = Range("A2", Range("A65536").End(xlUp)).SpecialCells(xlCellTypeVisible)
MsgBox "抽出されたセルアドレス " & MyRag.Address
MyRag.Select
ActiveSheet.AutoFilterMode = False
Set MyRag = Nothing
End Sub
要するに、抽出する時にフィルタする前の範囲とフィルタした後の範囲を、見た目で判断して変えてはダメだと言うことなんでしょうか?
by
Win98se & EXL2000SR-1
Win2000 & EXL97
Win2000 & EXL2002
|
|