• ベストアンサー

ExcelVBAで、オートフィルタについての質問

まず、オートフィルタをかけます。A列には月が入っています。ワークシートAには、1月、7月、8月が入っていて、ワークシートBには、2月、3月、4月、5月が入っていたりとばらばらです。 で、ExcelVBAでオートフィルタのかけ方は分かったのですが、このフィルタのかかった状態でA列に入っている要素を取得したいのです。例えば、ワークシートAなら1月と7月と8月というデータを取得したいのです。 こんなことはできますか?大きい本屋へ行って本を色々調べたり、ヘルプを見たりしたのですが、方法が分かりませんでした。 分かる方は教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

やっぱり直接オートフィルターのリストを見る訳ではないのですが・・。 オートフィルターをかけると言うことは、EXCELの表は 月  項目 1月 AAA 3月 BBB 8月 CCC という感じで1行目に列名。2行目以降にはデータという形式になっていますか? であれば次のではどうでしょうか。 ※[ツール]-[参照設定]で  Microsoft DAO 3.6 Object Libraryにチェック Sub Test() Dim DB As DAO.Database 'データベース Dim RS As DAO.Recordset 'レコードセット Dim strSQL As String 'SQL文 Dim strResult As String '結果表示用文字列 'EXCELをDBとして開く Set DB = OpenDatabase("C:\tmp\Book2.xls", False, True, "EXCEL 8.0;HDR=YES;") 'シートSheet1から「月」という列(A列)でグループ化して抽出するSQL文作成(月でソート) strSQL = "SELECT [月] FROM [Sheet1$] GROUP BY [月] ORDER BY [月]" Set RS = DB.OpenRecordset(strSQL) strResult = "RESULT" Do Until RS.EOF '抽出結果を取得 strResult = strResult & vbCrLf & RS.Fields("月").Value '次のレコードへ RS.MoveNext Loop '抽出された月を表示 MsgBox strResult 'クローズ RS.Close DB.Close '開放 Set RS = Nothing Set DB = Nothing End Sub

kamkamkam3
質問者

お礼

どうもありがとうございます。 すごいですね。そんな方法があったのですか。Excel自信をデータベースとして扱えるというのが知りませんでした。その方法なら、処理もすばやくできそうです。 検索やら、ソートをしながら、抽出するというマクロをつくるにはつくったのですが、データが1500件とかあると、とても時間がかかってしまうのです。ただ単に僕のプログラムが下手なだけかもしれませんが。。 詳しいコメント付きでここまでソースコードを書いていただいて、大変感謝をしております。他の方法も実は思いついたのですが、penpenpenさんの方法と両方試していい方を使おうと思います。 とにかく、丁寧に答えていただいてありがとうございました。

その他の回答 (2)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

直接オートフィルタの抽出リストにアクセスする方法は解かりません。 作業用のシートに抽出するので良ければ、下記の感じとか。 Sheet1のA1からデータがあるとして、Sheet2にA列の重複しないデータをコピーします。 Sub Test() Dim tr As Range  With Worksheets("Sheet1")   Set tr = .Range("A1", .Range("A65536").End(xlUp))   tr.AdvancedFilter Action:=xlFilterCopy, _      CopyToRange:=Worksheets("Sheet2").Range("A1"), _      Unique:=True  End With End Sub

kamkamkam3
質問者

お礼

どうもありがとうございました。 実は、多分、オートフィルタのドロップダウンリストの抽出リストにアクセスする方法はないと思うんです。 で、その場合は、papayukaさんの方法でやろうと思っていたんですが、やり方がわからなく「本屋へいかなきゃなー」と思っていたんですが、思わぬところで教えてくれて、大変感謝しております。 どうしてもできないようなら(多分できないのですが)papayukaさんのコードを拝借しようとおもいます。 どうもありがとうございました。申し訳ないのですが、もうちょっと締め切りをのばさせてもらいます。すみません。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

質問の意味が良く解りません。 A1からの表として、 Sub Test()  Range("A1").CurrentRegion. _    SpecialCells(xlCellTypeVisible).Select End Sub で表示セルを選択出来ますが、そういう事?

kamkamkam3
質問者

お礼

どうもありがとうございます。 ちょっと分かりにくかったみたいです。 オートフィルタをかけてでてくるドロップダウンリストの要素を取得したいのです。 例えば、ワークシートAにオートフィルタをかけてA列にでてくるドロップダウンを表示すると、(すべて)、(トップテン)、(オプション)、1月、7月、8月と出てくるのですが、それを取得したいのです。