データが変更されたときにExcelの自動フィルターを自動更新する方法


15

データが変更されたときにExcelの自動フィルターを自動更新するにはどうすればよいですか?

使用例:1つのセルの値をフィルター処理された値に変更します。他に何もせずに現在の行が消えるのを見たいです。


3
そのコードをWorksheet_Calculate()イベントの代わりにWorksheet_Change()イベントに配置すると、機能するようになりました。
F106dart

1
これを答えとして受け入れて、他の人があなたが何をしたかを知り、質問が解決されたようにします。
jzd

Calculateがパラメーターを予期していたため、別の変更を行う必要がありました。今では動作します!
ソリン

回答:


7

これでコードを交換することも、トリックを行うようです(少なくともExcel 2010では):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

4

テーブルを操作したときに、これが機能しないことがわかりました。フィルターはシート上ではなく、テーブル上にありました。このコードはトリックをしました

Private Sub Worksheet_Change(ByVal Target As Range)
    With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
         .AutoFilter.ApplyFilter
    End With
End Sub

ここで情報を見つけました:http : //www.jkp-ads.com/articles/Excel2007TablesVBA.asp


1

シート名を右クリックし、[コードの表示]を選択して、以下のコードを貼り付けます。貼り付けた後、左上の[ファイル]の下にあるExcelアイコンをクリックするか、Alt-F11を入力してスプレッドシートビューに戻ります。

これにより、自動更新が有効になります。マクロをサポートする形式でファイルを保存することを忘れないでください.xlsm

Private Sub Worksheet_Change(ByVal Target As Range)

    If Me.FilterMode = True Then
        With Application
           .EnableEvents = False
           .ScreenUpdating = False
        End With

        With ActiveWorkbook
            .CustomViews.Add ViewName:="Mine", RowColSettings:=True
          Me.AutoFilterMode = False
            .CustomViews("Mine").Show
            .CustomViews("Mine").Delete
        End With


         With Application
           .EnableEvents = True
           .ScreenUpdating = True
        End With
    End If

End Sub

1

Worksheet_ChangeイベントにもとづくVBA / Macroを使用していますが、私のアプローチは少し異なります... OK、最初にコード、次に説明:

Private Sub Worksheet_Change(ByVal Target As Range)
    ' first remove filter
    ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1        
    ' then apply it again
    ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1, Criteria1:="<>0"
End Sub

Alt+ F11キーの組み合わせを使用して、開発パネルを表示し、自動更新するフィルターを含むワークシートにコードを貼り付けます。)

私の例では、単一の列(この場合はL)に単純なフィルターがあり、データ範囲は1(見出しを含む場合もある)から126(行に十分な数を選択)の行にあると仮定しています承知しました)。操作は簡単です。シート上で何かが変更されると、指定された範囲のフィルターが削除/再適用され、更新されます。ここで少し説明が必要なのはFieldCriteriaです。

フィールドは、範囲のオフセットの整数です。私の場合、列フィルターは1つしかなく、範囲は範囲の最初の1列(L)で構成されます(したがって、値として1を使用します)。

基準は、データ範囲に適用するフィルタを説明する文字列です。私の例では、L列が0と異なる行のみを表示したいと思います(したがって、「<> 0」を使用しました)。

それで全部です。Range.AutoFilterメソッドの詳細については、https://msdn.microsoft.com/en-us/library/office/ff193884.aspxを参照してください。


0

答えを統合するだけです:

ソリン言う:

シート名を右クリックし、[コードの表示]を選択して、以下のコードを貼り付けます。貼り付けた後、左上の[ファイル]の下にあるExcelアイコンをクリックするか、Alt-F11を入力してスプレッドシートビューに戻ります。

これにより、自動更新が有効になります。マクロをサポートする形式のファイルを.xlsmで保存することを忘れないでください。

そして、Chrisはこのコードを使用しました(2010年に私がやったばかりです)。

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

投稿を展開しないと、長い答えしか表示されません!;)


-1

申し訳ありませんが、コメントするには担当者が不十分です。(管理者、これを上記のコメントに自由にカットしてください。)「Worksheet_ChangeイベントにもとづくVBA /マクロを使用しますが、私のアプローチ...」で始まるユーザー「danicotra」応答は、
「最初にフィルターを削除
」し、それを適用します再び
Excel 2007+を使用する場合の正しいソリューションです。ただし、.AutoFilter.ApplyFilterはXL03以前では無効であるため、以下の方法を示します。

本当の専門家と達人がコードを読んでくれることを願っています。なぜなら、それが最高の棚材料だと確信しているからです。おそらく、この答えに対する不可解な下票の数は、人々が以下で行われている良いことを見ると逆転する可能性があります。

danicotraは簡単な例を使用しました。実際には、より一般的にこれを行うことができます。ActiveSheetで次の(または他のシートオブジェクト)を想定します。

  1. オートフィルターの範囲を保存します。.AutoFilter.Filters.Count列と(.AutoFilter.Range.Count / .AutoFilter.Filters.Count)行があり、rngAutofilterに保存されます

  2. .Onまたは.Operatorがfalseの場合、「アプリケーション定義エラー」を避けるように注意して、各.AutoFilter.Filters.Countオートフィルターアイテムの4つのプロパティのそれぞれをmyAutofilters配列に収集します。(myAutofiltersは、ステップ1の行と列の数に再調整されます)

  3. フィルターをオフにしますが、.ShowAllDataでドロップダウンを保持します

  4. 保存された配列に従って.Onであった各フィルター項目について、各.AutoFilter.Filters.Count自動フィルター項目の4つのプロパティのうち3つをリセットします。.Operatorがfalseの場合は、「アプリケーション定義エラー」を回避するように注意してください。したがって、各項目「i」に対して、
    rngAutofilter.AutoFilter Field:= i、Criteria1:= myAutofilters(i、2)
    または
    rngAutofilter.AutoFilter Field:= i、Criteria1:= myAutofilters(i、2)、Operator:= myAutofilters(i、3)、Criteria2:= myAutofilters(i、4)

これで、コードの開始前と同じ範囲でオートフィルターが再設定されますが、データの変更に応じてオートフィルターが更新されます。

Public myAutofilters As Variant, rngAutofilter As Range 'Public
Sub SaveAndRestoreAutofilters()
  'This will update the autofilter display to recognize data changes by turning autofilter off and then on, preserving all characteristics
  'Note, XL2007 and later have .autofilter.applyfilter, but not the invaluable XL03 and earlier
  Dim i As Long, iNumAutofilters As Long, iNumActiveAutofilters As Long
  iNumActiveAutofilters = SaveAutoFilterInfo(iNumAutofilters) 'NOTE! Use CALL or assignment to prevent parentheses from forcing ByVal !
  If iNumActiveAutofilters < 1 Then
      Application.StatusBar = "0 ACTIVE filters;" & iNumAutofilters & " autofilters"
      Exit Sub
  End If
  ActiveSheet.ShowAllData

  Rem Here optionally do stuff which can include changing data or toggling autofilter columns

  For i = 1 To iNumAutofilters
      If myAutofilters(i, 1) Then
          If myAutofilters(i, 3) <> 0 Then 'then .Operator is something, so set it and Criteria2, else just Criteria1
              rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2), Operator:=myAutofilters(i, 3), Criteria2:=myAutofilters(i, 4) ', On:=true by rule
          Else
              rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2) ', On:=true by rule (it's R/O anyway)
          End If
          Rem Selection.AutoFilter Field:=i 'How you'd "turn off" only a single column's autofiltering. FYI .On is R/O!
      End If
      'activesheet.autofiltermode=false 'just FYI, how you comprehensively turn off filtering on a sheet (erasing the dropdowns and criteria and filter range!)
  Next i
End Sub
Function SaveAutoFilterInfo(iNumAutofilters As Long) As Long
  Dim i As Long, iRowsAutofiltered As Long
  SaveAutoFilterInfo = 0 'counts the number that are .On, and returns the total
  iNumAutofilters = ActiveSheet.AutoFilter.Range.Columns.Count
  If ActiveSheet.AutoFilter.Filters.Count <> iNumAutofilters Then MsgBox "I can't explain this. All bets are off. Aborting.": Exit function
  ReDim myAutofilters(1 To iNumAutofilters, 4)
  For i = 1 To iNumAutofilters
      myAutofilters(i, 1) = ActiveSheet.AutoFilter.Filters(i).On
      If myAutofilters(i, 1) Then
          SaveAutoFilterInfo = SaveAutoFilterInfo + 1
          myAutofilters(i, 2) = ActiveSheet.AutoFilter.Filters(i).Criteria1
          myAutofilters(i, 3) = ActiveSheet.AutoFilter.Filters(i).Operator
          If myAutofilters(i, 3) <> 0 Then 'then is either xlAnd, xlOr, etc., and there's a second criteria
              myAutofilters(i, 4) = ActiveSheet.AutoFilter.Filters(i).Criteria2
          End If
      End If
  Next i
  iRowsAutofiltered = ActiveSheet.AutoFilter.Range.Count / ActiveSheet.AutoFilter.Range.Columns.Count
  Set rngAutofilter = Cells(ActiveSheet.AutoFilter.Range.Row, ActiveSheet.AutoFilter.Range.Column).Resize(iRowsAutofiltered, iNumAutofilters)
End Function

なぜWORLDで誰かがこの便利な答えに賛成票を投じないのでしょうか?それは完全な自立コードを含み(そして徹底的にテストされました)、さらにコードの詳細な説明さえ与えますか?私は真剣に尋ねています。人々はスーパーユーザーの優れた専門家の助けを求めていますか?相対的に支持するために、単にダウン投票するトロールはありますか??
MicrosoftShouldBeKickedInNuts

1
少なくともあなたが投票した場合にコメントするb___があるので、私はフィードバックを使ってコミュニティにより良いサービスを提供できます。管理者、それは私がしたい提案です。すべてのダウン投票に説明コメントが必要です。私は多くの明らかに素晴らしい投稿が不可解にダウン投票されたことを見てきました。
MicrosoftShouldBeKickedInNuts

-1
Excelの「テーブルからのデータ」/パワークエリを使用して、ファイルを開くときにデータを更新するオプションを提供します。
(また、自動ソート、およびインデックス列(フィルタリングされた行の数を自動的に))

これにより、別のシートに結果が作成されます。

-マウスを使用して必要なデータを選択(行と列)
-テーブルからデータタブをクリック
-最後の列で、空白を除外します(塗りつぶされたセルのみを表示する場合はオプション)
-列、インデックス列の追加(オプション、フィルター結果に行番号を追加する場合)
-閉じてロードする

もう一度編集するには、[クエリ]タブをクリックしてから[編集]をクリックします

Excelの[デザイン]タブをクリックし、更新の下の矢印、接続プロパティ、
ファイルを開くときにデータを更新します。


適応:https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/
パート:3. Power Queryを使用したドロップダウンリストのソート


空ではない場合、たとえばフィールドa1の場合、sheet1からデータをコピーすることもできます。
これをsheet2のa1フィールドにコピーします:
= IF(Sheet1!A1 ""; Sheet1!A1; "")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.