2017-07-27 7 views
0

Ich versuche, eine Excel-Tabelle automatisch über VBA zu filtern.Filtern von Excel-Tabelle mit VBA

Die Tabelle enthält eine Reihe von Zeilen und befindet sich derzeit in B5: N584 von Sheet2. Die erste Spalte der Tabelle hat "Country" als Header und das ist die Spalte, auf die ich den Filter anwenden möchte. Ich möchte, dass die Tabelle automatisch nach dem vom Benutzer eingegebenen Ländernamen gefiltert wird. Der Ländername wird auf Zelle B3 von Sheet2 sein, jetzt als "= Sheet1! A1" definiert, wo der Benutzer das Land eingibt.

Die Art, wie ich es gerne arbeiten würde, ist: - Der Benutzer schreibt einen Ländernamen auf Zelle A1 von Sheet1. - Das Land wird automatisch in Zelle B3 von Sheet2 gezogen. - Die Tabelle wird in der ersten Spalte entsprechend dem Inhalt von Zelle B3 von Tabelle2 gefiltert.

Dies ist der VBA-Code habe ich geschrieben:

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 

Auf Zelle B2 ich geschrieben habe, "Country" genau wie in der Spaltenüberschrift.

Was ich getan habe, funktioniert fast. Das einzige Problem ist, dass der Filter nicht automatisch angewendet wird. Das vom Benutzer eingegebene Land in Zelle A1 wird in Zelle B3 von Tabelle 2 gezogen, aber der Filter wird erst angewendet, wenn ich auf die Bearbeitungsleiste von Zelle B3 klicke und auf Eingabe klicke, ohne etwas zu ändern. Dann wird der Filter auf die folgende Tabelle angewendet.

Ich frage mich, was verhindern könnte, dass die Tabelle automatisch erkennt, dass ein neues Land in Zelle B2 ist, ohne dass man auf die Zelle klicken und ENTER drücken muss.

Vielen Dank.

Antwort

0

Legen Sie Ihr Arbeitsblatt fest, um den Code auszulösen, wenn der Benutzer die Daten in Zelle A1 eingegeben hat.

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

End If

+0

Vielen Dank für Ihre Hilfe.Wie würde ich das tun, wenn A1 in einem anderen Blatt ist? Wie verweise ich das andere Blatt im "= Range()"? – franciscofcosta

+0

Sie müssten den Event-Handler 'WOrksheet_Change' in das * Other * Sheet einfügen und dann den' Range' für das Blatt qualifizieren, gegen das er arbeiten muss (zB 'Worksheets (" Sheet2 "). Range (" B5: ... ') –

0

Betrachtet man zwei Blätter genannt Tabelle1 und Tabelle2 und der Tisch ist auf Tabelle2 im Bereich von Ihnen angegebenen.

unter der Annahme, auch die folgenden Fälle ...

  1. Benutzer geben den Ländernamen in A1 in Sheet1.
  2. Auf Sheet2 B2 hat den Header Land wie der Header in B5 in der Tabelle.
  3. B3 auf Sheet2 hat eine Formel = Sheet1! A1

Sicherstellen, dass alle obigen Annahmen richtig sind, entfernen Sie den Ereigniscode Wechsel von Sheet1 Modul und setzen Sie dann den folgenden Code auf Sheet2 Modul.

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

Edit:

Eigentlich können Sie den Blattbezug entfernen, weil der Code auf dem Sheet2 Modul selbst ist.

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