2017-07-27 3 views
0

VBAを使用してExcelテーブルを自動的にフィルタリングしようとしています。VBAでExcelテーブルをフィルタリングする

表にはいくつかの行があり、現在Sheet2のB5:N584にあります。 テーブルの最初の列にはヘッダーとして "国"があり、これはフィルターを適用する列です。ユーザーが入力した国名に応じて、テーブルを自動的にフィルタリングしたいと思います。国名はSheet2のセルB3にあり、ユーザーが国を入力するところの "= Sheet1!A1"と定義されています。

私が動作させたい方法は次のとおりです。 - ユーザーがSheet1のA1セルに国名を書き込みます。 - 国は自動的にSheet2のセルB3に引き出されます。 - Sheet2のセルB3の内容に従って、最初の列のテーブルがフィルタリングされます。

Public Sub Worksheet_Change(ByVal Target As Range) 

    If Target.Address = Range("B3").Address Then 
     Range("B5:N584").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("B2:B3") 
    End If 

End Sub 

セルB2に、私はちょうど列ヘッダーのように「国」を書いた:

これは私が書いたVBAコードです。

ほとんど何もしていない。唯一の問題は、フィルタが自動的に適用されていないことです。セルA1のユーザ入力国はSheet2のセルB3に引っ張られますが、セルB3の数式バーをクリックして何も変更せずに入力をクリックするまで、フィルタは適用されません。その後、フィルタは下の表に適用されます。

セルをクリックしてEnterキーを押すことなく、セルB2に新しい国があることをテーブルが自動的に検出するのを防ぐことができますか?

ありがとうございます。

答えて

0

ユーザーがセルA1にデータを入力したときにコードをトリガーするようにワークシートを設定して、このセルの変更を検出し、変更を待つのではなくコードをトリガーします。

If Target.Address = Range("A1").Address Then 
    Range("B5:N584").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("B2:B3") 

END IF

+0

ありがとうございました。A1が別のシートにある場合、どうすればいいですか? "= Range()"内の他のシートをどのように参照するのですか? – franciscofcosta

+0

'Whereretsheet_Change'イベントハンドラを* other *シートに配置してから、動作させる必要のあるシートに 'Range 'を修飾する必要があります(例えば' Worksheets( "Sheet2")。 B5:... ') –

0

あなたはシート1とシート2と呼ばれる2枚のシートを持って考えると、テーブルには、指定範囲内でSheet2のです。

また、以下の場合を想定し...

  1. ユーザーは、シート1にA1に国の名前を入力します。
  2. On Sheet2 B2には、表のB5のヘッダーと同じ国のヘッダーがあります。
  3. シート2上のB3は、式=シート1!A1

は、すべて上記の仮定が正しいことを確認し、Sheet1のモジュールからの変更イベントのコードを削除してからSheet2のモジュールに次のコードを配置しています。

Private Sub Worksheet_Calculate() 
    Sheets("Sheet2").Range("B5").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Sheets("Sheet2").Range("B2:B3") 
End Sub 

編集:コードはSheet2のモジュール自体にあるので

実際にあなたがシート参照を削除することができます。

Private Sub Worksheet_Calculate() 
    Range("B5").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("B2:B3") 
End Sub 
関連する問題