- ベストアンサー
エクセルVBA オートフィルタについて
オートフィルタは2つまでしか条件が設定できません。 3つ以上設定する方法はないでしょうか?(OR条件です) オートフィルタの引数(Criteria)は2つしかありませんから、恐らく3つ以上の設定はできないと思っています。 そこで、オートフィルタを複数回設定し、使っていない列に特定の文字(例えば○など)を入れ、最後にこの○を条件にすることにより、実質的に3つ以上条件のフィルタリングを実現させたいと考えております。 そこでお聞きしたいのは、各条件でフィルタリングした時に、任意の列に○を入れる方法です。 例えば myRng.AutoFilter Field:=4, Criteria1:="=?UA*" でフィルタリングしたエリアの特定の列に○を入れるにはどのようなVBAになるのでしょうか? オートフィルタを使わず、ループで全行の条件を聞いて、○をつけることは可能ですが、行数が非常に多いので時間がかかってしまいます。 オートフィルタを使えばすばやく該当行が選択されますので、何とかこれを利用したいと思っています。何か良い方法は無いでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 格好をつけたコードを載せておきます。 Sub test() Dim srcRange As Range Dim targetRange As Range Dim i As Long Const fieldName As String = "フィールド名" Set srcRange = ActiveSheet.AutoFilter.Range Set targetRange = srcRange.SpecialCells(xlCellTypeVisible) Set targetRange = Intersect(targetRange, srcRange.Columns(1)).Offset(0, srcRange.Columns.Count) For i = 1 To targetRange.Areas.Count targetRange.Areas(i).Value = "○" Next i srcRange.Cells(1).Offset(0, srcRange.Columns.Count).Value = fieldName End Sub
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 オートフィルタもフィルタオプションも、作ってみれば同じです。 >オートフィルタを使わず、ループで全行の条件を聞いて、○をつけることは可能ですが、行数が非常に多いので時間がかかってしまいます。 そんなはずはないです。ふつうは、ループで入れません。 単なる数式では、フィルタオプションでも、オートフィルタでも、考え方は同じですが、フィルタオプションは、数式を入れないだけです。多少、フィルタオプションのほうが速いように思います。 具体的な内容がほしいのですが、たぶん、サンプルを見せないと納得いかないと思いますので、以下に書いておきます。以下の場合は、数式だけ入れ替えれば使えるはずです。 A B C D 項目1 項目2 項目3 項目4 1 B2えM a あ 2 A2えN b い 3 E1あN c う 4 B1おM d え 5 A2おN e お 6 E1えN f か 7 A1あN g き 8 B1かN h く 9 E1あM i け 検査内容、項目2 の中に、A,1,あ,N の4つが揃っている行の抽出 ''----------------------------------- ''オートフィルターの場合 Sub Test1() Dim n As Integer Dim i As Integer Const m As Integer = 2 '検査フィールド 'A1 を基点とする With ActiveSheet If .AutoFilterMode = False Then .Range("A1").AutoFilter End If If .AutoFilterMode Then .ShowAllData With .AutoFilter.Range n = .Columns.Count 'オートフィルタの項目数 i = n - m + 1 '距離の決定 .Offset(, n).Columns(1).FormulaLocal = _ "=IF(COUNTIF(RC[-" & CStr(i) & "],""*A*"")+" & _ "COUNTIF(RC[-" & CStr(i) & "],""*1*"")+" & _ "COUNTIF(RC[-" & CStr(i) & "],""*あ*"")+" & _ "COUNTIF(RC[-" & CStr(i) & "],""*N*"")=4,""○"","""")" .Offset(, .Columns.Count).Columns(1).Cells(1).Value = "Temp" End With .AutoFilterMode = False .Range("A1").AutoFilter Field:=n + 1, Criteria1:="○" End If End With End Sub ''----------------------------------- ''フィルターオプションの場合 Sub Test2() Dim n As Integer Dim i As Integer Const m As Integer = 2 '検査フィールド 'A1 を基点とする With ActiveSheet If .AutoFilterMode Then .Range("A1").AutoFilter End If With .Range("A1").CurrentRegion n = .Columns.Count '検査の項目数 i = n - m + 2 '距離の決定 '数式の代入 .Offset(1, n + 1).Cells(1).FormulaLocal = _ "=COUNTIF(RC[-" & CStr(i) & "],""*A*"")+" & _ "COUNTIF(RC[-" & CStr(i) & "],""*1*"")+" & _ "COUNTIF(RC[-" & CStr(i) & "],""*あ*"")+" & _ "COUNTIF(RC[-" & CStr(i) & "],""*N*"")=4" 'フィルタオプションの実行 .AdvancedFilter _ Action:=xlFilterInPlace, _ CriteriaRange:=.Offset(, n + 1).Resize(2), _ Unique:=False End With End With End Sub
お礼
回答ありがとうございます。 ループとはフィルタを全く使わないで、ForとかDo Loopを使って1行ずつセルの内容を調べる方法のことです。 ご教授いただいた内容は理解するのに時間がかかりました。 かなり高度な内容ですね。 返事が遅くなってすいませんでした。
- mitarashi
- ベストアンサー率59% (574/965)
フィールド名の行にもマークが付いてしまうのはご愛敬という事でご容赦下さい。これ以上は、寝不足になるので手抜きです。 Sub test() Dim targetRange As Range Dim i As Long 'A1から表があって、オートフィルターがかかっているとする Range("A1").Select Selection.CurrentRegion.Select Selection.SpecialCells(xlCellTypeVisible).Select 'J列に目印を入れる Set targetRange = Selection.Columns(1).Offset(0, 9) For i = 1 To targetRange.Areas.Count targetRange.Areas(i).Value = "○" Next End Sub 外していたらすみません。
補足
回答ありがとうございます。 #1の方へ 私の勘違いでした。 横方向へ並べればAND条件、縦方向に並べればOR条件ですね。 うまく行きました。 ただフィルタリング後にマニュアルでいじれるAutofilterに対し、Advancedfilterは自由度が少なくなりますね。 それとフィルタリング項目の第1行目の各項目に項目名が埋まっていないとAdvancedfilterは動きませんね。 Autofilterは空白の項目がトップでも、同じ内容の項目があっても問題なく動きますね。 トップ項目が埋まっていない場合、一時的に項目を埋めて、フィルタリングに元に戻そうかと考えております。 No2の方へ 関係無い内容ですいません。
- shikisaito
- ベストアンサー率52% (257/491)
> オートフィルタは2つまでしか条件が設定できません。 > 3つ以上設定する方法はないでしょうか?(OR条件です) オートフィルタ(AutoFilter)ではなく、 フィルタオプションの設定(AdvancedFilter)を使えばいいのでは?
お礼
回答ありがとうございます。 AdvancedFilter、知りませんでした。使ってみます。 尚、後学の為、各条件でフィルタリングした時に、任意の列に○を入れる方法についても教えていただければ幸いです。
補足
AdvancedFilterを使ってみましたが、複数の条件を指定する時はAND条件しか使えないようですね。 今回の設定はOR条件になります。 具体的にはB列に ?AB*、?DG*、MX7*の3つの条件を指定します。 AutofilterはOR条件が使えますが、AdvancedFilterはやはりAND条件だけなのでしょうか?
お礼
回答ありがとうございます。 これでバッチリですね!