• ベストアンサー

エクセルVBA オートフィルタについて

オートフィルタは2つまでしか条件が設定できません。 3つ以上設定する方法はないでしょうか?(OR条件です) オートフィルタの引数(Criteria)は2つしかありませんから、恐らく3つ以上の設定はできないと思っています。 そこで、オートフィルタを複数回設定し、使っていない列に特定の文字(例えば○など)を入れ、最後にこの○を条件にすることにより、実質的に3つ以上条件のフィルタリングを実現させたいと考えております。 そこでお聞きしたいのは、各条件でフィルタリングした時に、任意の列に○を入れる方法です。 例えば myRng.AutoFilter Field:=4, Criteria1:="=?UA*" でフィルタリングしたエリアの特定の列に○を入れるにはどのようなVBAになるのでしょうか? オートフィルタを使わず、ループで全行の条件を聞いて、○をつけることは可能ですが、行数が非常に多いので時間がかかってしまいます。 オートフィルタを使えばすばやく該当行が選択されますので、何とかこれを利用したいと思っています。何か良い方法は無いでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.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

believe_me
質問者

お礼

回答ありがとうございます。 これでバッチリですね!

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 オートフィルタもフィルタオプションも、作ってみれば同じです。 >オートフィルタを使わず、ループで全行の条件を聞いて、○をつけることは可能ですが、行数が非常に多いので時間がかかってしまいます。 そんなはずはないです。ふつうは、ループで入れません。 単なる数式では、フィルタオプションでも、オートフィルタでも、考え方は同じですが、フィルタオプションは、数式を入れないだけです。多少、フィルタオプションのほうが速いように思います。 具体的な内容がほしいのですが、たぶん、サンプルを見せないと納得いかないと思いますので、以下に書いておきます。以下の場合は、数式だけ入れ替えれば使えるはずです。  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

believe_me
質問者

お礼

回答ありがとうございます。 ループとはフィルタを全く使わないで、ForとかDo Loopを使って1行ずつセルの内容を調べる方法のことです。 ご教授いただいた内容は理解するのに時間がかかりました。 かなり高度な内容ですね。 返事が遅くなってすいませんでした。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

フィールド名の行にもマークが付いてしまうのはご愛敬という事でご容赦下さい。これ以上は、寝不足になるので手抜きです。 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 外していたらすみません。

believe_me
質問者

補足

回答ありがとうございます。 #1の方へ 私の勘違いでした。 横方向へ並べればAND条件、縦方向に並べればOR条件ですね。 うまく行きました。 ただフィルタリング後にマニュアルでいじれるAutofilterに対し、Advancedfilterは自由度が少なくなりますね。 それとフィルタリング項目の第1行目の各項目に項目名が埋まっていないとAdvancedfilterは動きませんね。 Autofilterは空白の項目がトップでも、同じ内容の項目があっても問題なく動きますね。 トップ項目が埋まっていない場合、一時的に項目を埋めて、フィルタリングに元に戻そうかと考えております。 No2の方へ 関係無い内容ですいません。

回答No.1

> オートフィルタは2つまでしか条件が設定できません。 > 3つ以上設定する方法はないでしょうか?(OR条件です) オートフィルタ(AutoFilter)ではなく、 フィルタオプションの設定(AdvancedFilter)を使えばいいのでは?

believe_me
質問者

お礼

回答ありがとうございます。 AdvancedFilter、知りませんでした。使ってみます。 尚、後学の為、各条件でフィルタリングした時に、任意の列に○を入れる方法についても教えていただければ幸いです。

believe_me
質問者

補足

AdvancedFilterを使ってみましたが、複数の条件を指定する時はAND条件しか使えないようですね。 今回の設定はOR条件になります。 具体的にはB列に ?AB*、?DG*、MX7*の3つの条件を指定します。 AutofilterはOR条件が使えますが、AdvancedFilterはやはりAND条件だけなのでしょうか?

関連するQ&A

専門家に質問してみよう