気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Excel VBA オートフィルタを解除、復帰させる方法(3つ以上条件へ対応 Excel 2007以降で動作)

オートフィルタを解除し、なんらかの編集作業を行った後に、前のオートフィルタの状態に復帰させる方法を下記に記載します。 いろいろ調べたのですが、3つ以上の条件を設定した場合に対応したものがなかったので考えてみました。

オートフィルタの保存と復帰

Private Dim filterArray()
Private currentFiltRange As String

Private Function PRV_Save_Filters(T_Sheet As Worksheet)
  Dim f As Long
  
  With T_Sheet.AutoFilter
    ' フィルタ設定範囲
    currentFiltRange = .Range.Address
    With .Filters
      'フィルタ情報格納配列
      ReDim filterArray(1 To .Count, 1 To 3)
      For f = 1 To .Count
        ' フィルタ情報を取得
        With .Item(f)
          If .On Then
            ' フィルタ要素を配列に詰める
            filterArray(f, 1) = .Criteria1 '条件1の値とオペランド
            filterArray(f, 2) = .Operator 'And、Or、xlFilterValuesなどが設定される
            If .Operator And .Operator <> xlFilterValues Then
              ' フィルタ条件2つ
              filterArray(f, 3) = .Criteria2 '条件2の値とオペランド
            End If
          End If
        End With
      Next
    End With
  End With
End Function


Private Function PRV_Restore_Filters(T_Sheet As Worksheet)
  '現在のフィルタ設定範囲
  Dim col As Long
   
  With T_Sheet
    ' 行の左から右にフィルタを設定していく
    For col = 1 To UBound(filterArray(), 1)
      If IsEmpty(filterArray(col, 1)) Then
        GoTo Continue
      End If
      
      If filterArray(col, 2) Then
        '識別子要素がある場合(And,Or等)
        If filterArray(col, 2) = xlFilterValues Then
          ' フィルタ条件3つ以上
          .Range(currentFiltRange).AutoFilter field:=col, _
          Criteria1:=filterArray(col, 1), _
          Operator:=filterArray(col, 2)
          GoTo Continue
        End If
      
        ' フィルタ条件2つ
        .Range(currentFiltRange).AutoFilter field:=col, _
        Criteria1:=filterArray(col, 1), _
        Operator:=filterArray(col, 2), _
        Criteria2:=filterArray(col, 3)
        GoTo Continue
      End If
      
      '識別子要素がない場合(And,Or等)
      ' フィルタ条件1つ
      .Range(currentFiltRange).AutoFilter field:=col, _
      Criteria1:=filterArray(col, 1)
      
Continue:
    Next
  End With
End Function

オートフィルタを解除する

'フィルタ設定がある場合
If T_Sheet.FilterMode = True Then
T_Sheet.ShowAllData
End If

参考URL

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14103890229