VBA Makro Excel Zeile Aus-/Einblenden?


18.09.2020, 14:30

Anbei ein Screenshot meiner Tabelle

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hier mein Lösungsvorschlag, eine Ereignisprozedur, die Du in das VBA Codeblatt der entsprechenden Tabelle einfügen musst. Nicht in ein eigenes Modul. Weißt Du, wie das geht? Wenn nicht, bitte melden.

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("C3:D3")) Is Nothing Then Exit Sub

On Error GoTo Fehlermeldung
MidNM = DateValue(CDate("15." & [C3] & "." & [D3])) + 30
LastDay = Day(DateValue("1." & Month(MidNM) & "." & Year(MidNM)) - 1)
For i = 36 To LastDay + 6 Step -1
    Rows(i).EntireRow.Hidden = True
Next
For i = LastDay + 5 To 30 Step -1
    Rows(i).EntireRow.Hidden = False
Next
Exit Sub
Fehlermeldung:
MsgBox "Bitte das Format der Monatsangabe überprüfen"
End Sub

Zur Funktion:

Wenn weder C3 noch D3 geändert wurde, wird die Prozedur sofort verlassen.

Wenn Monat oder Jahr geändert wurde, folgt die Auswertung. Zuerst setze ich aus den Angaben in C3 und D3 einen Datumsstring mit dem 15. Tag zusammen und addiere 30 Tage, um in den nächsten Monat zu springen. Vom 1. des Folgemonats ziehe ich 1 ab und bestimme den Tageswert dieses Datums, dem letzten Tag in dem ausgewählten Monat. Auf diese Weise werden automatisch auch Schaltjahre berücksichtigt.

Mit diesem Wert steuere ich das Ein- bzw. Ausblenden der Tageszeilen am Ende des Monats. Bei nur 30 Tagen wird Zeile 36 ausgeblenden, bei 31 Tagen eingeblendet. Bei 28 Tagen (Feb ohne Schaltjahr) werden entsprechend mehr Zeilen ausgeblendet.

Kleine Warnung: Die Inhalte der ausgeblendeten Zeilen bleiben erhalten! Wenn Du also irgendwelche Berechnungen durchführst, könnten die Ergebnisse falsch sein!

Wichtig ist noch, dass die Auswahlstrings für den Monat von Excel als Monat verstanden werden. Mai und Okt gehen, May und Oct nicht.

Gegebenenfalls kommt eine entsprechende Aufforderung.

Hoffe, das hilft Dir weiter und freue mich auf Feedback.

Perfekt!

Wirklich tausend Dank!

0

Kann man in diesen Code noch eine Zeile einfügen, die bewirkt, dass die unterste eingeblendete Zeile fett unterstrichen ist? Wäre quasi die Kirsch auf der Torte :)

0
@Laura92564

Ja, das lässt sich machen. Welche Spalten sollen denn einen unteren Rahmen bekommen? Und hast Du sonst irgendwelche Rahmen?

0
@Laura92564

Hi, würde es nicht schon reichen, den entsprechenden Zellen in Zeile 37 einen oberen Rahmen zu verpassen? Egal welcher Monat, Zeile 37 ist doch die erste Zeile nach dem letzten Tag des Monats. Damit hättest Du Deinen unteren Rahmen.

0
@Hannes62a

Naja, es sollte jeweils die letzte eingeblendete Zeile unten fett sein. Generell kannst Du das Layout meinem Bild entnehmen - so sollte das im Idealfall aussehen :)

0

Moin,

Du schreibst, dass Du Monat und Jahr durch ein Dropdown in Zelle C3 auswählst.

Im Code prüfst Du dann aber nur auf einen Monat. Da stimmt etwas nicht. Sinnvollerweise sollten Monat und Jahr in zwei Zellen mit Dropdown eingestellt werden. Zeig uns doch bitte mal den Aufbau der Tabelle.

Ich würde das so lösen, dass ich über eine Ereignisprozedur die Änderung des Monats/Jahrs abfange und dann die Zeile(n) entsprechend ausblende, ohne dass manuell ein Makro angestoßen werden muss.

@geri3d: Ich glaube, dass auch bei Deinem Code die Zuweisung der Eigenschaft Hidden falsch ist. Wenn der Tag vor dem 1. ein 30. ist, muss die Zeile 36 ausgeblendet werden. Hidden muss dann auf True gesetzt werden.

Ich würde auch nicht auf =30 testen, sondern auf <31. Sonst hat der Februar 31 Tage.

Bis später, Hannes

Hallo Hannes, ja ich habe zwei nebeneinander gelegene Zellen, nämlich C3 (Monat) und D3 (Jahr) mit Dropdown. Mein Code sollte erstmal nur dazu dienen wenigstens die Monate mit 31 Tagen und 30 Tagen zu separieren - klar fehlt dann noch Februar, aber das war mir dann zu kompliziert. Das wäre dann mein nächster Arbeitsschritt gewesen.

Wie lädt man hier ein Bild hoch?

VG, Laura

1
@Laura92564

Da musst Du wahrscheinlich selber eine Antwort verfassen. In den Kommentaren geht das nicht.

1
@Hannes62a

@Hannes62a Ich habe oben den Screenshot eingefügt.

0

Damit sich das Format des Blattes nicht ändert (Auch für den Ausdruck) mache ich dies nur über bedingte Formatierung.
Anmerkung:
Es gilt bei der VBA Lösung auch Schaltjahre und den Februar zu beachten.

 - (Computer, Excel, VBA)

Im April, September ... müsste doch Hidden auf True gesetzt werden, um den nicht existierenden 31. auszublenden, oder stehe ich auf der Leitung?

Hier ein Codeschnipsel den ich kurz zusammengestellt habe, du musst es noch an deine Bedürfnisse anpassen.

Das klappt auch mit Schaltjahren.

Sub MonatsMakro()
Dim d As Date
d = InputBox("Bitte Datum eingeben!", "Datum", Format(Date, "dd.mm.yyyy"))
If IsDate(d) Then
    If Day(DateSerial(Year(d), Month(d) + 1, 0)) = 30 Then
        Sheets("Tabelle1").Range("A36").EntireRow.Hidden = False
    Else
        Sheets("Tabelle1").Range("A36").EntireRow.Hidden = True
    End If
End If
End Sub



Woher ich das weiß:Beruf – Früher Softwareentwickler bei CSDIT

Danke für deine schnelle Antwort.

Meine Zellen mit den Daten ergeben sich automatisiert aus der Dropdown-Auswahl Monat / Jahr über diverse WENN-Funktionen. Ich weiß daher nicht genau, was ich in der dritten Code-Zeile anpassen soll. Wäre super, wenn du mir da noch helfen könntest.

Grüße

Laura

1
@Laura92564
Sub MonatsMakro()
Dim d As Date

d = CDate(Sheets("Tabelle1").Range("C3").Value)
If IsDate(d) Then
    If Day(DateSerial(Year(d), Month(d) + 1, 0)) = 30 Then
        Sheets("Tabelle1").Range("A36").EntireRow.Hidden = False
    Else
        Sheets("Tabelle1").Range("A36").EntireRow.Hidden = True
    End If
Else
    Msgbox "Falsches Datumsformat"
End If

End Sub
1
@geri3d

Nochmal danke! Allerdings funktioniert der Code nicht. Vielleicht bin ich auch zu unfähig, korrigier mich, wenn ich falsch liege, aber die grünen Textpassagen soll ich doch anpassen, oder nicht? Bekomme bei der dritten Code-Zeile schon eine Laufzeiten-Fehlermeldung:

d = CDate(Sheets("Übersicht").Range("C3").Value)

Auch ist mir nicht klar, was ich bei

   Msgbox "Falsches Datumsformat"

einsetzen soll :(

1

Was möchtest Du wissen?