VBA Message-Box mit zwei Bedingungen?
Hallo zusammen,
ich versuche eine Message-Box in Excel zu erzeugen, die beim Wechsel eines Worksheets bald fällige bzw. überfällige Termine anzeigt. Dabei stehen die Fälligkeiten in der Spalte K. Eine solche Meldung soll allerdings unterbleiben, sofern der Bearbeitungsstand auf "abgeschlossen" gesetzt wurde. Der Bearbeitungsstand wird in der Spalte N mittels Dropdown-Liste erfasst.
Mein Code sieht folgendermaßen aus:
Private Sub Worksheet_Activate()
Dim rDatTermin
Dim rDatStand
Dim sMsgBaldFaellig As String
Dim sMsgUeberFaellig As String
Dim sMsgAbgeschlossen As String
sMsgBaldFaellig = ""
sMsgUeberFaellig = ""
For Each rDatTermin In Range("K4:K500")
If rDatTermin.Value <> "" Then
If rDatTermin.Value < Date Then
sMsgUeberFaellig = sMsgUeberFaellig & Cells(rDatTermin.Row, 2) & vbCrLf
Else
If rDatTermin.Value <= Date + 14 Then _
sMsgBaldFaellig = sMsgBaldFaellig & Cells(rDatTermin.Row, 2) & vbCrLf
End If
End If
Next
For Each rDatStand In Range("N4:N500")
If rDatStand.Value <> "" Then
If rDatStand.Value = "abgeschlossen" Then _
sMsgAbgeschlossen = 1
End If
Next
If sMsgUeberFaellig & sMsgBaldFaellig <> "" & sMsgAbgeschlossen <> 1 Then
MsgBox "Überfällig" & vbCrLf & vbCrLf & sMsgUeberFaellig & "Bald fällig" & vbCrLf & sMsgBaldFaellig
End If
End Sub
Offensichtlich klappt hier die Verknüpfung zur zweiten Bedingung noch nicht. Die erste Bedingung wird geprüft und korrekt angezeigt. Der Bearbeitungsstand wird dabei jedoch nicht berücksichtigt. Wo habe ich da meinen Gedankenfehler?
3 Antworten
Ich verstehe den Abluaf nicht. Erst gehst Du durch die Liste aller termine und baust einen String zusammen, der alle überfälligen und bald fälligen Termine enthält, unabhängig davon, ob die Aufgabe erledigt ist oder nicht.
Dann prüfst Du den Status und wenn irgenein Status "abgeschlossen" lautet, setzt Du ein Flag.
Versuche doch mal folgenden Code:
Option Explicit
Private Sub Worksheet_Activate()
Dim rDatTermin
' Dim rDatStand
Dim sMsgBaldFaellig As String
Dim sMsgUeberFaellig As String
'Dim sMsgAbgeschlossen As String
sMsgBaldFaellig = ""
sMsgUeberFaellig = ""
For Each rDatTermin In Range("K4:K500")
If Cells(rDatTermin.Row, 14) <> "abgeschlossen" Then
If rDatTermin.Value <> "" Then
If rDatTermin.Value < Date Then
sMsgUeberFaellig = sMsgUeberFaellig & Cells(rDatTermin.Row, 2) & vbCrLf
Else
If rDatTermin.Value <= Date + 14 Then _
sMsgBaldFaellig = sMsgBaldFaellig & Cells(rDatTermin.Row, 2) & vbCrLf
End If
End If
End If
End If
Next
If sMsgUeberFaellig <> "" Or sMsgBaldFaellig <> "" Then
MsgBox "Überfällig" & vbCrLf & vbCrLf & sMsgUeberFaellig & "Bald fällig" & vbCrLf & sMsgBaldFaellig
End If
End Sub
Klappt es? Freue mich auf Feedback.
In der Logik deines Quelltextes sehe ich einen Irrtum.
Als erstes gehst du die Range K4:K500 durch und prüfst ob das Feld und Heute+14 < als Heute ist.
Danach schaust du ob irgendwein Feld in Range N4:N500 'Abgeschlossen' ist, für mich macht das keinen Sinn.
Ausserdem solltest Du nicht pauschal 500 als das Ende annehmen, da du den Computer unnötige Arbeit machen lasst. Verwende
Cells(Rows.Count, 1).End(xlUp).RowDas und-Zeichen (&) ist in VBA nur dafür gut, Strings zu verketten. Wenn du mehrere Bedingungen mit einem UND verbinden willst, musst du das Schlüsselwort "And" benutzen.
Also
If sMsgUeberFaellig & sMsgBaldFaellig <> "" & sMsgAbgeschlossen <> 1 Then
austauschen mit
If sMsgUeberFaellig And sMsgBaldFaellig <> "" And sMsgAbgeschlossen <> 1 Then
Das wird wahrscheinlich schon alles sein.
Was ich auch wichtig finde: Schreib immer ganz oben über den Code "Option Explicit". Dann sagt dir VBA Bescheid, falls du irgendwelche Variablen benutzt, die VBA nicht kennt (passiert manchmal bei Schreibfehlern).
If sMsgUeberFaellig <> "" And sMsgBaldFaellig <> "" And sMsgAbgeschlossen <> 1 Then
Besten Dank, manchmal ist die Lösung so einfach. Und ja, da hatte ich ein dickes Brett vor'm Kopf.