2k Aufrufe
Gefragt in Tabellenkalkulation von joedeefoster Einsteiger_in (7 Punkte)
Guten Morgen miteinander

gerne würde ich im Excel mit Hilfe von Toggle buttons folgendes machen:

Es sollen mehrere toggles nebeneinander aufgereiht angezeigt werden. Beim drücken des 1. Buttons soll ein Teil der Daten gefiltert werden. z.B. all diejenigen Teile aus einer Liste mit ca 10 verschiedenen Währungen, die in USD sind.
Als nächster Schritt soll ein zweiter Button aktiviert werden können, ohne das die Auswahl des 1. Buttons aufgehoben wird. z.B sollen zusätzlich noch alle EUR Teile angezeigt werden.
Schlussendlich sollen also von ca 5000 Datensätzen nur die gewählten Währungen angezeigt werden (ca 200 Datensätze).

Abschliessend will ich mit einem "New Search" Button wieder alle Daten anzeigen und automatisch alle gewählten Buttons wieder inaktiv erscheinen lassen.

Ich habe dieses Problem versucht mit Makros zu lösen: Es fügt eine neue Spalte ein, schreibt eine 1 falls EUR bzw USD und anschliessend mit Autofilter die Nichtleeren filtern. Das Problem: Erstens ist es unschön, da man die "Arbeit" des Makros sehen kann und zweitens ist es viel zu langsam. Meine Frage daher: Gibt es mit VBA Möglichkeiten zur Lösung dieses Problems?

Vielen Dank für eure Inputs!

4 Antworten

0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Dominik,

warum nimmst Du nicht den Autofilter von Excel? Darin hast Du verschiedene Filtermöglichkeiten und kannst auch einen benutzerdefinierten Filter anwenden. Eventuell hilft Dir das ja schon weiter.
Alles weitere wird schwierig, ohne den Aufbau Deiner Datei zu kennen bzw. eine Beispieldatei zu haben.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von joedeefoster Einsteiger_in (7 Punkte)
Hi Oliver,

hier ist der Code eines Buttons, mit dem man beispielsweise EUR rausfiltern lassen kann:

Private Sub ToggleButton9_Click()
If ToggleButton9 = True Then
Range("B15:ag15").Select
Range("X15").Activate
Selection.AutoFilter
Range("V16").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-19]=""EUR"",""EUR"","""")"
Range("V16").Select
Selection.AutoFill Destination:=Range("V16:V5000"), Type:=xlFillDefault
Range("V16:V5000").Select
Range("X16").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-2]="""",IF(RC[-1]="""","""",RC[-1]),RC[-2])"
Range("X16").Select
Selection.AutoFill Destination:=Range("X16:X5000"), Type:=xlFillDefault
Range("X16:X5000").Select
Selection.Copy
Range("W16").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("X16:X5000").Select
Application.CutCopyMode = False
Selection.ClearContents
Range("V16:V5000").Select
Selection.ClearContents
Range("B15:ag15").Select
Range("X15").Activate
Selection.AutoFilter
Selection.AutoFilter Field:=22, Criteria1:="<>"
Range("A1").Select
Else
Range("B15:ag15").Select
Selection.AutoFilter
Range("W16:W5000").Select
Selection.Replace What:="EUR", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("B15:ag15").Select
Range("X15").Activate
Selection.AutoFilter
Selection.AutoFilter Field:=22, Criteria1:="<>"
Range("A1").Select
End If
End Sub


Den entsprechenden Code habe ich auch für andere Währungen verwendet. Somit ist es möglich, dass zwei Buttons gleichzeitig gedrückt werden können und beide Filter angezeigt werden. Aber leider ist diese Methode bei ca. 5000 Datensätzen ziehmlich langsam und er springt während den Berechnungen immer nach rechts zu den Spalten AG z.b. Weiter habe ich das Problem, dass wenn ich den Button wieder deaktiviere zeigt er mir keine Daten mehr an, was eigentlich ja auch Sinn macht. Wenn ich allerdings wieder alle Daten angezeigt haben will muss ich nach der Abwahl den Autofilter manuell entfernen und wieder setzen.

Beim Button für die "New Search" habe ich leider nichts wirklich verwendbares. Was er jedoch können sollte: Alle gedrückten Toggle Buttons deaktivieren und am Schluss alle Daten anzeigen.

Gruss
Joe
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Joe,

zunächst einmal entferne die ganzen Select- und Activate -Anweisungen. Anstelle von z.B.

Range("B15:ag15").Select
Range("X15").Activate
Selection.AutoFilter

kann man auch

Range("B15:ag15.AutoFilter
schreiben. Das bringt schon mal eine ganze Menge Geschwindigkeit. Dann schreibe gleich am Anfang Deines Makros, also Leerzeile vor "If ToggleButton9 = True Then"
einfügen und darin dann die Zeile

Application.ScreenUpdating = False
eintragen. Das verhindert, dass Du Einzelschritte, sofern diese nach dem Löschen der ganzen Select- und Activate-Anweisungen überhaupt noch auftreten, siehst.

Um den Filter zu deaktivieren verwende die Zeile

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False

Die schaltet den Autofilter aus, sofern dieser aktiviert ist.

Eventuell hilft Dir das ja schon mal weiter?

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo,

ich nochmal. Uuups, da habe ich doch glatt in der Zeile

Range("B15:ag15.AutoFilterdie Klammer vergessen. Es muss natürlich

Range("B15:ag15).AutoFilterheißen.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
...