目安箱 IV

目安箱投稿のルールはこちらをごらんください。
ご意見は電子メールで承っています。
「目安箱」は質問禁止です。技術的な質問はそれぞれの質問箱へどうぞ。

迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
101 / 118 ツリー ←次へ | 前へ→

【87】オートフィルタしたデータ抽出時の不具合の出るコードの書き方 Jaka 05/2/21(月) 17:20 Excel[未読]

【87】オートフィルタしたデータ抽出時の不具合の...
Excel  Jaka  - 05/2/21(月) 17:20 -

引用なし
パスワード
   オートフィルタしたデータを抽出する際、下記の様なコードは、とんでもない落とし穴が潜んでいます。
抽出データ範囲の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

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
101 / 118 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:   
0
(SS)C-BOARD v3.8 is Free