プロが教えるわが家の防犯対策術!

お世話になります。現在ExcelVBAでフィルタオプションを使用したプログラム製作を行っています。
検索条件を入力し実行ボタンを押すと、そのDB上で検索条件で指定されたものがフィルタオプションの機能を利用し表示されるようになりました。

今、新機能の実装するためフィルタオプションで抽出された結果のデータに対してのみ処理を行いたいのですが、
抽出レコードのデータを取り込もうにもDo LoopやOffset等でセルデータを取り込もうとすると
どうしても一般的にフィルタオプションを解除していないと選択できないようなセルデータを取得しているようです。

例えば
1行目がタイトル行として

2行目から
1
2
3
4
5
6
とある場合にフィルタオプションで3以上のデータをフィルタさせると結果は

タイトル
3
4
5
6

となりますが、この時この結果3,4,5,6をデータとして取り込みたいので

A1からDo LoopでOffset(0,1)しながらデータを取り込むと
結果1~6までのデータが全て取れてしまいます。
この状況を何とか打破すべくお力添えをいただけませんでしょうか?

A 回答 (2件)

sub macro1()


 dim r as long
 dim h as range

’一個も抽出されなかった場合に注意
 r = range("A65536").end(xlup).row
 if r = 1 then
  msgbox "no match data"
  exit sub
 end if

’可視セルを取得する
 for each h in range("A2:A" & r).specialcells(xlcelltypevisible)
  msgbox h.address
 next
end sub

などのように。
    • good
    • 0

基本的には、「フィルタ」は条件に合わないセル行を非表示にするもので、データは、シートに残っている。

そうでなければ困る場合が多い。
(1)可視セルをとらえるコードにする
(2)別セル範囲に結果を出す(フィルタオプションの設定で)
同じシートの別セル範囲に結果を出せば良いようです。
これはフィルターフィルタオプションの設定の仕組みを使ってます。
フィルタの▼クリックで現れる「オプション」ではない。
ーー
マクロの記録を採って多少付け加えただけのもの。
Sub Macro4()
Range("A1:A7").Select
Range("A1:A7").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"E1:E2"), CopyToRange:=Range("H1:H8"), Unique:=False
d = Range("H100").End(xlUp).Row
MsgBox d
For i = 2 To d
MsgBox Cells(i, "H")
Next i
End Sub
("H100").は適当に実情にあわせて。
ーー
別シートに結果を出したい場合は、その別シートを開いて、操作を始め、データ範囲や条件セル範囲は別シートのセル範囲指定になります(します)。
抽出範囲を別シート指定の形式にすると、不可になるでしょう。
見出し見出し見出し
1>=33
24
35
46
5
6
この場合は行番号は「飛んで表示されない」ことからも判りますが、シートの行を非表示にするものではない。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!