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

オートフィルタをマクロで書いたのですが、一部うまくいかなくて困っています。
わかる方がいらしたらぜひご教授ください。

商品情報というブックがあり、抽出シート(1枚目)と2枚目のシートにデータが入っています。
2枚目のシートのフィールド名を抽出シートのA1を基準に貼り付けています。
条件をA1:I2に入力し、2枚目のシートの条件に合うものを抽出シートのA5以降に取り出すマクロを書いています。次回マクロを起動させたときにA5以降にデータがあれば削除させます。

そこで問題なのですが、A1:I2の条件だとA列からI列までのフィールド名に対する条件を
1行入力することができますが、同じ行になるのでAND条件になってしまいます。
本当は条件列をI3までにして、条件を2行にわたって書いて または条件も検索したいのです。
ただ、または条件は入力する場合と入力がない場合があります。
条件をA1:I3(3行目)に変更してマクロを実行すると、または 条件がある場合はちゃんとでるのですが、条件がない場合はすべてでてきてしまいます。

どのようにすればA1:I3に変更して、2行目と3行目に条件があった場合はその条件で該当するものを
抽出し、特に3行目に条件がない場合は2行目だけの条件で抽出できるのでしょうか?
(2行目のAnd条件検索と3行目のまたは条件検索ができますでしょうか?)

Dim myRow1 As Long, myRow2 As Long

myRow1 = Sheets(2).Range("A" & Rows.Count).End(xlUp).Row
myRow2 = Sheets("抽出").Range("A" & Rows.Count).End(xlUp).Row

If myRow2 >= 5 Then
Sheets("抽出").Range("A5:I" & myRow2).ClearContents
Sheets("抽出").Range("A5:I" & myRow2).ClearFormats

End If

Sheets(2).Range("A1:I" & myRow1).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Worksheets("抽出").Range("A1:I2"), CopyToRange:=Sheets("抽出").Range("A5"), Unique:=False


End Sub

A 回答 (2件)

>CriteriaRange:=Worksheets("抽出").Range("A1:I2")



ここを以下のように変更する。


Sheets(2).Range("A1:I" & myRow1).AdvancedFilter _
  Action:=xlFilterCopy, _
  CriteriaRange:=Sheets("抽出").Range("A1").CurrentRegion, _
  CopyToRange:=Sheets("抽出").Range("A5"), Unique:=False


なお、Sheets(2)もIndex番号ではなくちゃんとシート名にした方がいいかと。

以上です。
    • good
    • 0
この回答へのお礼

ご親切にありがとうございました。
ちゃんと動くようになり感動しています。

勉強になります!!!

お礼日時:2010/11/09 09:55

フィルタオプションの検索条件範囲を自動的に検出したいということでしょうか?



その場合は、myRow1の部分を以下のように変更してみてください。

myRow1 = Sheets(2).Range("A1").CurrentRegion.Rows.Count

この回答への補足

ご指示ありがとうございます。

フィルタオプションの検索条件範囲を自動的に検出したいということでしょうか?

そうです。下記のRange("A1:I2")のところをI3にしてしまうと3行目に何も入ってないと
全データがでてきてしまいますので、範囲が("A1:I3")になっていて3行目に何も入っていなければ
2行目のみで検索。3行目に何か書いてあれば2・3行目を使って検索をさせたいのです。
または自動的に条件が入っているかどうかを判断して検索するようなことをしたいのです。
別に下記の記述にこだわっているわけではないのですが・・・。

myRow1 = Sheets(2).Range("A1").CurrentRegion.Rows.Count
はmyRow1,myRow2と記述している一番冒頭に書くのでしょうか?
書いてみたのですがうまくいきません。
これはシート2に入っているデータの行の最終行という意味ではないのでしょうか?


Sheets(2).Range("A1:I" & myRow1).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Worksheets("抽出").Range("A1:I3"), CopyToRange:=Sheets("抽出").Range("A5"), Unique:=False

お手数ですがご指導よろしくおねがいいたします。

補足日時:2010/11/08 23:09
    • good
    • 0
この回答へのお礼

なんとかできるようになりました。
いろいろとご指導ありがとうございました。
少しづつ自分でも勉強していきます!!

お礼日時:2010/11/09 00:24

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