Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1948to1952
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Welche (Befehls-)Schaltfläche wurde gedrückt? (VBA)

Welche (Befehls-)Schaltfläche wurde gedrückt? (VBA)
11.10.2023 15:45:15
DerLaborant
Guten Tag zusammen,

ich beschäftige mich erst seit einigen Tagen mit VBA und komme an einer Stelle nicht weiter.
Per Schaltfläche (Formularsteuerelement) rufe ich ein Makro zur Autofilterung von Daten auf. Ich habe insgesamt 3 Schaltflächen, mit denen ich 3 verschiedene Filter aktiviere.
Hinter jeder Schaltfläche steht ein eigenes Makro.
Diese unterscheiden sich aber nur marginal voneinander, sodass ich das insofern optimieren möchte, dass ich auslese welche der Schaltflächen gedrückt wurde, um dann "If Button Filter 1 gedrückt; Dann XY" zu ermöglichen.

Ich konnte trotz intensiver Suche kein Beispiel finden, welches diese Funktion zeigt.

Mein "Filter Code"

Sub FilterHeute()


Application.ScreenUpdating = False
tblPb.Unprotect
tblEin.Unprotect

tblPb.Cells(2, 1).Select

If tblPb.FilterMode = True Then

tblPb.ListObjects(1).AutoFilter.ShowAllData
tblPb.ListObjects(1).ShowAutoFilter = False

Dim varCB As Integer
For varCB = 2 To 12 Step 2
tblEin.Cells(varCB, 3).Value = False
Next varCB

tblPb.Activate
tblPb.Cells(2, 1).Select
Selection.End(xlDown).Offset(1, 0).Select
ActiveWindow.ScrollRow = Selection.Row
ActiveWindow.SmallScroll Up:=15

Else

'Der Rowindex von Cells müsste sich abhängig vom gedrückten Button ändern
tblEin.Cells(2, 3).Value = True

'Die RGB Werte von Criteria1 müssten sich abhängig vom gedrückten Button ändern
tblPb.Range(Cells(3, 8), Cells(1500, 15)).AutoFilter Field:=1, Criteria1:=RGB(235, 255, 163), Operator:=xlFilterCellColor, VisibleDropDown:=False
Dim varFF As Integer
For varFF = 2 To 15
tblPb.Range(Cells(3, 8), Cells(1500, 15)).AutoFilter Field:=varFF, Criteria1:="=""""", Operator:=xlOr, Criteria2:=">""""", VisibleDropDown:=False
Next varFF

Application.Goto Reference:=tblPb.Cells(2, 1), Scroll:=True

End If

tblEin.Protect
tblPb.Protect
Application.ScreenUpdating = True

End Sub


Zum Verständnis: Das Makro setzt auf "tblEin" eine Zelle auf "True", welche ich dann über eine bedingte Formatierung auslese. Die Änderung der im Code angesprochenen Werte sollte ich problemlos über eine Variable realisieren können.
Beispieldatei ist anbei. Die Datei dient der Ermittlung und Überwachung von Prüfterminen anhand eines Ausgangsdatums. Blattschutz ist ohne PW.

https://www.herber.de/bbs/user/163340.xlsm

Da ich blutiger Anfänger bin, nehme ich auch gerne Hinweise/Tipps allgemeiner Natur zum Code oder zu anderen Möglichkeiten der Umsetzung gerne entgegen.

Vielen Dank schon einmal.

Liebe Grüße,
DerLaborant

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Welche (Befehls-)Schaltfläche wurde gedrückt? (VBA)
11.10.2023 15:57:24
daniel
Hi

der Ausdruck Application.Caller gibt dir den Namen des Buttons zurück der das Makro ausgelöst hat.
Also:

If Application.Caller = "dein name" Then


etwas aufpassen musst, du wenn du Grafikelementen so ein Makro zuweist (die kann man genauso wie die Formularfeldbuttons dafür verwenden)
Application.Caller gibt nur die ersten 30 Zeichen des Namens ab, wenn dieser länger ist, wird abgeschnitten, wenn du also einem
"Rechteck: obere Ecken, eine abgerundet, eine abgeschnitten 2" ein Makro zuweist, müsstest du das auf einen kürzeren Namen umbenennen, wenn du mit Application.Caller arbeiten willst.

Gruß Daniel
Anzeige
AW: Welche (Befehls-)Schaltfläche wurde gedrückt? (VBA)
11.10.2023 15:58:58
Piet
Hallo

das ist mein Standard Code mit Select Case wo ich bei 10 Button die Button Nummer 1-10 auswerte.
Ich benutze ihn um beim Sortieren die Sortier Adresse für jede Spalte zu setzen.
Du kannst ihn ja umstricken, indem du hinter jeder Button Nr. dein Makro aufrufst.

mfg Piet

Sub Übersicht_Case_sortieren()
Dim Adr1 As String, Schfla, lz1 As Long
Schfla = Right(Application.Caller, 2)
lz1 = Cells(Rows.Count, 3).End(xlUp).Row
If lz1 7 Then Exit Sub

Select Case Schfla
Case 1: Adr1 = "A8"
Case 2: Adr1 = "B8"
Case 3: Adr1 = "C8"
Case 4: Adr1 = "D8"
Case 5: Adr1 = "E8"
Case 6: Adr1 = "F8"
Case 7: Adr1 = "G8"
Case 8: Adr1 = "H8"
Case 9: Adr1 = "I8"
Case 10: Adr1 = "J8"
End Select
Anzeige
AW: Welche (Befehls-)Schaltfläche wurde gedrückt? (VBA)
11.10.2023 19:00:59
DerLaborant
Hallo ihr Lieben,

vielen dank Daniel, Piet und Herbert.

Ich habe Herberts Lösung genutzt, werde aber die Vorschläge von euch sicher in Zukunft auch gebrauchen können. Danke dafür :)

Hier der aktuelle Code
Sub Pruefungen()

Dim varCB As Integer
Dim varFF As Integer
Dim sSFName$

sSFName = Application.Caller

Application.ScreenUpdating = False
tblPb.Unprotect
tblEin.Unprotect

'* Heutige
If sSFName = "SF_heutige" Then
tblEin.Cells(4, 3).Value = False
tblEin.Cells(6, 3).Value = False
tblEin.Cells(2, 3).Value = True
tblPb.Range(Cells(3, 8), Cells(1500, 15)).AutoFilter Field:=1, Criteria1:=RGB(235, 255, 163), Operator:=xlFilterCellColor, VisibleDropDown:=False
End If

'* 7Tage
If sSFName = "SF_7Tage" Then
tblEin.Cells(2, 3).Value = False
tblEin.Cells(6, 3).Value = False
tblEin.Cells(4, 3).Value = True
tblPb.Range(Cells(3, 8), Cells(1500, 15)).AutoFilter Field:=1, Criteria1:=RGB(255, 235, 163), Operator:=xlFilterCellColor, VisibleDropDown:=False
End If

'* 28Tage
If sSFName = "SF_28Tage" Then
tblEin.Cells(2, 3).Value = False
tblEin.Cells(4, 3).Value = False
tblEin.Cells(6, 3).Value = True
tblPb.Range(Cells(3, 8), Cells(1500, 15)).AutoFilter Field:=1, Criteria1:=RGB(163, 235, 255), Operator:=xlFilterCellColor, VisibleDropDown:=False
End If

For varFF = 2 To 15
tblPb.Range(Cells(3, 8), Cells(1500, 15)).AutoFilter Field:=varFF, Criteria1:="=""""", Operator:=xlOr, Criteria2:=">""""", VisibleDropDown:=False
Next varFF
Application.Goto Reference:=tblPb.Cells(2, 1), Scroll:=True

tblEin.Protect
tblPb.Protect
Application.ScreenUpdating = True
End Sub


Den anfänglichen Teil in dem geprüft wird, ob schon ein Filter aktiv ist, habe ich entfernt. Der war ursprünglich dafür gedacht, bei wiederholtem Klick auf die jeweilige Schaltfläche den Filter wieder zu entfernen. Das löse ich jetzt aber komplett mit der "Zurücksetzen"-Schaltfläche; macht mehr Sinn.

Ergänzt habe ich noch, dass er je nach dem welche Schaltfläche gedrückt wurde, die "Aktivierung" der anderen Schaltflächen zurücksetzt (Die Kontrollkästchen für die bedingte Formatierung).
Mir fällt jetzt nur auf, dass die Ausführung des Codes spürbar länger dauert als zuvor, obwohl ja deutlich weniger drin steht. Vielleicht gibt es dazu noch eine Anmerkung von euch. Ich kann allerdings mit der kurzen Verzögerung auch gut leben.

Ich wünsche noch einen schönen Abend,
DerLaborant
Anzeige
AW: Danke für die Rückmeldung. owt
12.10.2023 08:58:14
Herbert Grom
,,,
AW: Welche (Befehls-)Schaltfläche wurde gedrückt? (VBA)
12.10.2023 09:21:02
daniel
Und was unterscheidet jetzt Herberts Lösung von meinem Vorschlag?
Ich sehe keinen Unterschied.
Was ist anders?

Gruß Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige