質問: Worksheets(ws02).Range("A2") Worksheets(ws01).Range("A1").AutoFilter Field:=col_num, Criteria1:=val ``` ### ここから本題です... VBAのフィルタに関する質問です。 画像にもあるように、黄色の背景色があるところは要注意項目のため、背景色があるセルをフィルタから除外したり、背景色がある項目だけ検索したいときがあります。 例えば「東京の背景色があるところ」と検索したいのです。 そこで、Criteria2にも追加して検索しようとしました(以下のプログラム) ``` Worksheets(ws01).Range("A1").AutoFilter Field:=col_num, Criteria1:=RGB(255, 255, 0), Operator:=xlFilterCellColor, Criteria2:=val ``` しかし、黄色の背景色がある項目が全部抽出され、対象以外も出てきてしまって困っています。 色々と調べては見たものの、いまいちどうやればいいのかピンと来ていません。 文字と背景色を検索条件として共存させれば良いのか、ご教授ください。 また、難しいのであれば、どのように回避すべきかを教えていただければ大変助かります。 厚かましいと思いますが、よろしくお願いします。 使用環境 : Excel2013
回答: AutoFilterだけの機能では無理だと思います。 作業列を使う方法がよく使われます。 Office TANAKA - Excel VBA Tips[オートフィルタ[作業列で絞り込む]] 複雑な条件(複数除外等)のオートフィルター(AutoFilter)|VBA技術解説 追記 > > フィルタにかけた後、抽出された項目の氏名をコピーして別シートに貼り付けるものです。 > > > フィルターは手段で最終目的が該当する氏名のコピーなら、 オートフィルターは使わずに、 VBAで該当する氏名を配列に格納して、 それを出力先に代入すればシンプルになるでしょう。 コード例 ``` Sub NameCopy() Dim ws01 As Worksheet: Set ws01 = Sheet1 Dim ws02 As Worksheet: Set ws02 = Sheet2 Dim col_Num As Long: col_Num = ws02.Range("A1") Dim val As String: val = ws02.Range("A2") Dim maxRow As Long: maxRow = ws01.Cells(1, 1).End(xlDown).Row '該当する名前の格納用配列(最大数分確保しておく) Dim aryName() As String: ReDim aryName(maxRow - 2) Dim i As Long, cnt As Long For i = 2 To maxRow With ws01.Cells(i, col_Num) If .Interior.Color = vbYellow And .Value = val Then aryName(cnt) = ws01.Cells(i, 1) cnt = cnt + 1 End If End With Next ws02.Range("B:B").ClearContents '名前配列を縦横変換して代入、代入するセル範囲のサイズを該当件数で制限しておく ws02.Range("B1").Resize(cnt).Value = WorksheetFunction.Transpose(aryName) End Sub ```