Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Monatsanfang

VBA Monatsanfang
29.06.2006 22:07:08
Stefan
Hallo
habe folgendes Problem
Ich würde gerne unten stehendes Makro über eine MsgBox (OK) einmalig jeden Monatsanfang (ersten Werktag(Mo-Fr)) ausführen.
Nach klick OK

Sub löschenStatistik()
ActiveWindow.ScrollWorkbookTabs Position:=xlLast
Sheets("Statistik").Select
ActiveSheet.Unprotect
Columns("A:I").Select
Range("I1").Activate
Selection.Clear
Columns("K:K").ClearContents
Range("M2").Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Danke
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Monatsanfang
29.06.2006 22:13:45
Ramses
Hallo
und was soll passieren, wenn der Monatsanfang auf das Wochenende fällt und/oder der nächste Tag ein Feiertag, vielleicht auch nur ein regionaler, ist ?
Gruss Rainer
AW: VBA Monatsanfang
29.06.2006 22:20:30
Stefan
Ich stelle mir das so vor !?
ich könnte zb aus Zelle A1 den zuletzt gespeicherten Monat als vergleich nehmen
Grob in einer Formel ausgedrückt
Angenommen wir haben jetzt Juli
=Wenn(A1=Monat juni jetzt aber Juli;MsgBox zum Makro ausführen;keine MsgBox)
Ich hoffe so könnt es irendwie gehen (mit einem Vergeich).
Anzeige
AW: VBA Monatsanfang
29.06.2006 22:45:31
Ramses
Hallo
schön dass du dir das so vorstellst ;-)
Aber
1.) Betrifft deine Frage den Monatsanfang
2.) Hast du meine Frage nicht beantwortet
3.) Kannst du aus einer Formel heraus ein Makro nur bedingt ausführen, d.h. es kann nicht alles gemacht werden.
Mit einer Formel ist das also gar nicht möglich.
Kannst du VBA ?
Gruss Rainer
Anzeige
AW: VBA Monatsanfang
29.06.2006 23:20:42
Stefan
1. Nein (da neuer Ansatz)
2
3. OK
?. Ich habe schon im VBA gearbeitet bin jedoch Amateur
Mein Lösungsversuch geht dahin
Ich Speichere beim beenden der Datei das Aktuelle Datum in Zelle "A1" ab !!
Ist es nun möglich in VBA nehme an Arbeitsmappe?
1. Beim öffnen der Datei den Monat zu vergleichen ("a1" & aktueller MM )
2. Wenn ja das dann die MSgbox kommt.
Anzeige
AW: VBA Monatsanfang
30.06.2006 10:49:45
fcs
Hallo Stefan,
das kann man mit einem Workbook_Open Makro umsetzen
Im folgenden Beispiel wird der 1. Arbeitstag im Monat mit einer Function bestimmt und mit dem aktuellen Tage verglichen.
mfg
Franz
Im VBA-Editor Unter "DieseArbeitsmappe":

Private Sub Workbook_Open()
'Vergleich des 1. Arbeitstages im Monat mit dem aktuellen Datum
November = True '1. November ist Feiertag
If Date = ErsterArbeitstag(Date, November) Then
If MsgBox("Heute ist der 1. Arbeitstag im Monat!" & vbLf & vbLf & _
"Soll die alte Statistik gelöscht werden?", vbQuestion + vbYesNo) = vbYes Then
Call löschenStatistik
End If
End If
End Sub

In ein Modul, das Löschen-Makro hab ich ein wenig optimiert:

Sub löschenStatistik()
' Löschen der alten Statistik-Daten
With Sheets("Statistik")
.Unprotect
.Columns("A:I").Clear
.Columns("K:K").ClearContents
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
End Sub
Function ErsterArbeitstag(Datum As Date, Optional ByVal November As Boolean) As Date
'Bestimmung des 1. Arbeitstages im Monat des Datum
'  Datum = DateSerial(2006, 6, 1) 'Testzeile
Select Case Month(Datum)
Case 1, 5 'Feiertag 1. Jan + 1. Mai
ErsterArbeitstag = Feiertag1(Datum)
Case 10 'Feiertag 3. Oktober
ErsterArbeitstag = Feiertag3(Datum)
Case 11 'Feiertag 1. November (regional)
If November = True Then
ErsterArbeitstag = Feiertag1(Datum)
Else
ErsterArbeitstag = KeinFeiertag1(Datum)
End If
Case 2, 3, 4, 6, 7, 8, 9, 12  'Standardmonate
ErsterArbeitstag = KeinFeiertag1(Datum)
Case Else
'do nothing
End Select
End Function
Private Function Feiertag1(Datum As Date) As Date
'1. Arbeitstag, wenn der 1. des Monats ein Feiertag ist
Select Case WeekDay(Datum)
Case vbFriday
Feiertag1 = DateSerial(Year(Datum), Month(Datum), 4)
Case vbSaturday
Feiertag1 = DateSerial(Year(Datum), Month(Datum), 3)
Case Else
Feiertag1 = DateSerial(Year(Datum), Month(Datum), 2)
End Select
End Function
Private Function Feiertag3(Datum As Date) As Date
'1. Arbeitstag, wenn der 3. des Monats ein Feiertag ist
Select Case WeekDay(Datum)
Case vbSaturday
Feiertag3 = DateSerial(Year(Datum), Month(Datum), 4)
Case vbSunday
Feiertag3 = DateSerial(Year(Datum), Month(Datum), 2)
Case Else
Feiertag3 = DateSerial(Year(Datum), Month(Datum), 1)
End Select
End Function
Private Function KeinFeiertag1(Datum As Date) As Date
'1. Arbeitstag, wenn der 1. des Monats kein Feiertag ist
Select Case WeekDay(Datum)
Case vbSaturday
KeinFeiertag1 = DateSerial(Year(Datum), Month(Datum), 3)
Case vbSunday
KeinFeiertag1 = DateSerial(Year(Datum), Month(Datum), 2)
Case Else
KeinFeiertag1 = DateSerial(Year(Datum), Month(Datum), 1)
End Select
End Function

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

VBA für den Monatsanfang in Excel automatisieren


Schritt-für-Schritt-Anleitung

Um ein VBA-Makro zu erstellen, das am Monatsanfang eine MsgBox anzeigt, folge diesen Schritten:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Doppelklicke im Projektfenster auf DieseArbeitsmappe.

  3. Füge den folgenden Code in das Fenster ein:

    Private Sub Workbook_Open()
       ' Vergleich des 1. Arbeitstages im Monat mit dem aktuellen Datum
       Dim November As Boolean
       November = True ' 1. November ist Feiertag
    
       If Date = ErsterArbeitstag(Date, November) Then
           If MsgBox("Heute ist der 1. Arbeitstag im Monat!" & vbLf & vbLf & _
           "Soll die alte Statistik gelöscht werden?", vbQuestion + vbYesNo) = vbYes Then
               Call löschenStatistik
           End If
       End If
    End Sub
  4. Füge das Makro löschenStatistik in ein Modul ein. Der Code könnte so aussehen:

    Sub löschenStatistik()
       ' Löschen der alten Statistik-Daten
       With Sheets("Statistik")
           .Unprotect
           .Columns("A:I").Clear
           .Columns("K:K").ClearContents
           .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
       End With
    End Sub
  5. Füge die Funktion ErsterArbeitstag hinzu, um den ersten Arbeitstag zu bestimmen:

    Function ErsterArbeitstag(Datum As Date, Optional ByVal November As Boolean) As Date
       ' Bestimmung des 1. Arbeitstages im Monat
       Select Case Month(Datum)
           Case 1, 5 ' Feiertag 1. Jan + 1. Mai
               ErsterArbeitstag = Feiertag1(Datum)
           Case 10 ' Feiertag 3. Oktober
               ErsterArbeitstag = Feiertag3(Datum)
           Case 11 ' Feiertag 1. November
               If November = True Then
                   ErsterArbeitstag = Feiertag1(Datum)
               Else
                   ErsterArbeitstag = KeinFeiertag1(Datum)
               End If
           Case 2, 3, 4, 6, 7, 8, 9, 12
               ErsterArbeitstag = KeinFeiertag1(Datum)
           Case Else
               ' do nothing
       End Select
    End Function
  6. Schließe den VBA-Editor und speichere die Datei als Excel-Makro-fähige Arbeitsmappe (*.xlsm).


Häufige Fehler und Lösungen

  • Fehler: MsgBox erscheint nicht
    Lösung: Stelle sicher, dass das Makro in Workbook_Open korrekt eingebettet ist und dass die Arbeitsmappe auch wirklich beim Öffnen die Makros aktiviert.

  • Problem: Feiertage werden nicht berücksichtigt
    Wenn Feiertage nicht korrekt erkannt werden, überprüfe die Funktion ErsterArbeitstag und passe die Feiertagslogik an Deine Region an.


Alternative Methoden

Wenn Du keine VBA-Programmierung nutzen möchtest, kannst Du auch die Funktion WENN in Excel verwenden, um Benachrichtigungen zu erstellen. Diese Methode ist jedoch weniger automatisiert und erfordert manuelle Eingriffe.


Praktische Beispiele

Hier ist ein Beispiel für eine einfache Implementierung, die den ersten Arbeitstag im Monat überprüft:

Function Beispiel()
    Dim Heute As Date
    Heute = Date
    If Heute = ErsterArbeitstag(Heute) Then
        MsgBox "Heute ist der erste Arbeitstag des Monats!"
    End If
End Function

Tipps für Profis

  • Verwende Debug.Print, um den Status Deines Codes während der Ausführung zu überprüfen. Dies hilft, Fehler zu finden.
  • Halte Deine Makros modular, indem Du einzelne Funktionen für spezifische Aufgaben erstellst. Das erhöht die Wartbarkeit.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass das Makro nur einmal pro Monat ausgeführt wird?
Du kannst das aktuelle Datum mit einem in einer Zelle gespeicherten Datum vergleichen und das Datum nach der Ausführung aktualisieren.

2. Funktioniert das auch in Excel 365?
Ja, die hier beschriebenen VBA-Techniken funktionieren in Excel 365 sowie in anderen modernen Excel-Versionen.

3. Was mache ich, wenn ich einen Fehler im VBA-Code bekomme?
Überprüfe die Fehlermeldung und den betreffenden Codeabschnitt. Oftmals sind Syntaxfehler oder nicht deklarierte Variablen die häufigsten Ursachen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige