Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1968to1972
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

Geht's einfacher?

Geht's einfacher?
11.03.2024 07:38:11
Nordic
Hallo :)
ich habe in den letzten Tag so gut es mir möglich war etwas zusammengebastelt.
Irgendwie beschleicht mich jedoch das Gefühl, dass ich mehr Aufwand betrieben habe als nötig.
Was soll passieren? Im Grunde ist es eine Art ToDo-Liste, die Mo - Do bestimmte Gegebenheiten überprüft und in einem Textfeld ausgibt.


Private Sub UserForm_Activate()

Dim ws As Worksheet
Dim executionDay As Integer
Dim toDay As String
Dim currentDay As String
Dim currentDate As Date
Dim foundDate As Date
Dim actorNew As String
Dim allActorsNew As String
Dim actorEnd As String
Dim allActorsEnd As String
Dim actorRep As String
Dim allActorsRep As String
Dim actorSoon As String
Dim allActorsSoon As String
Dim infoToDay1 As String
Dim infoToDay2 As String
Dim infoToDay3 As String
Dim i As Long

Set ws = ThisWorkbook.Sheets("Projektplan")
UserForm2.TextBox1.Value = ""
executionDay = Weekday(Date, vbMonday)
currentDate = Date

If executionDay = 1 Then

toDay = gWeekday(executionDay)
UserForm2.TextBox1.Value = "Tagesinfo für " & toDay & ", den " & currentDate
currentDay = TextBox1.Text & vbCrLf

For i = 7 To gLR
If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 7 = foundDate Then
actor = ws.Cells(i, "B").Value
allActors = allActors & vbCrLf & actor & " am " & foundDate
End If
End If
Next i

If allActors > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für folgende TN endet die Maßnahme in 7 Tagen." & vbCrLf & _
"Ggf. Verlängerungen prüfen!" & vbCrLf & allActors
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Kein TN endet in 7 Tagen." & vbCrLf & _
"Prüfen auf Verlängerungen optional."
End If
End If

If executionDay = 2 Then

toDay = gWeekday(executionDay)
UserForm2.TextBox1.Value = "Tagesinfo für " & toDay & ", den " & currentDate
currentDay = TextBox1.Text & vbCrLf

For i = 7 To gLR
If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 7 = foundDate Then
actor = ws.Cells(i, "B").Value
allActors = allActors & vbCrLf & actor & " am " & foundDate
End If
End If
Next i

If allActors > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für folgende TN endet die Maßnahme in 7 Tagen.." & vbCrLf & _
"Ggf. Verlängerungen prüfen!" & vbCrLf & allActors
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Kein TN endet in 7 Tagen." & vbCrLf & _
"Prüfen auf Verlängerungen obligatorisch!"
End If

End If

If executionDay = 3 Then

toDay = gWeekday(executionDay)
UserForm2.TextBox1.Value = "Tagesinfo für " & toDay & ", den " & currentDate
currentDay = TextBox1.Text & vbCrLf

For i = 7 To gLR

If IsDate(ws.Cells(i, "D").Value) Then
foundDate = ws.Cells(i, "D").Value
If currentDate = foundDate Then
actorNew = ws.Cells(i, "B").Value
allActorsNew = allActorsNew & vbCrLf & actorNew
End If
End If

If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 1 = foundDate Then
actorEnd = ws.Cells(i, "B").Value
allActorsEnd = allActorsEnd & vbCrLf & actorEnd
End If
End If

If IsDate(ws.Cells(i, "U").Value) Then
foundDate = ws.Cells(i, "U").Value
If currentDate + 1 = foundDate Then
actorRep = ws.Cells(i, "B").Value
allActorsRep = allActorsRep & vbCrLf & actorRep
End If
End If

Next i

If allActorsNew > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für folgende TN ist heute der Maßnamestart geplant:" & vbCrLf & allActorsNew
infoToDay1 = TextBox1.Text & vbCrLf
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Es sind für heute keine Zugänge geplant."
infoToDay1 = TextBox1.Text & vbCrLf
End If

If allActorsEnd > "" Then
UserForm2.TextBox1.Value = "Maßnameende morgen:" & vbCrLf & allActorsEnd
infoToDay2 = TextBox1.Text & vbCrLf
Else
UserForm2.TextBox1.Value = "Kein Maßnameende morgen."
infoToDay2 = TextBox1.Text & vbCrLf
End If

If allActorsRep > "" Then
UserForm2.TextBox1.Value = "Berichte morgen fällig:" & vbCrLf & allActorsRep
infoToDay3 = TextBox1.Text & vbCrLf
Else
UserForm2.TextBox1.Value = "Keine Berichtsabgaben morgen"
infoToDay3 = TextBox1.Text & vbCrLf
End If

UserForm2.TextBox1.Value = infoToDay1 & vbCrLf & infoToDay2 & vbCrLf & infoToDay3

End If

If executionDay = 4 Then

toDay = gWeekday(executionDay)
UserForm2.TextBox1.Value = "Tagesinfo für " & toDay & ", den " & currentDate
currentDay = TextBox1.Text & vbCrLf

For i = 7 To gLR

If IsDate(ws.Cells(i, "D").Value) Then
foundDate = ws.Cells(i, "D").Value
If currentDate + 6 = foundDate Then
actorSoon = ws.Cells(i, "B").Value
allActorsSoon = allActorsSoon & vbCrLf & "> " & actorSoon & " am " & foundDate
End If
End If

If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 4 = foundDate Then
actorEnd = ws.Cells(i, "B").Value
allActorsEnd = allActorsEnd & vbCrLf & "> " & actorEnd & " am " & foundDate
End If
End If

If IsDate(ws.Cells(i, "U").Value) Then
foundDate = ws.Cells(i, "U").Value
If currentDate + 4 = foundDate Then
actorRep = ws.Cells(i, "B").Value
allActorsRep = allActorsRep & vbCrLf & "> " & actorRep & " am " & foundDate
End If
End If

Next i

If allActorsSoon > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Einladungen zum Maßnamestart versenden an:" & vbCrLf & allActorsSoon
infoToDay1 = TextBox1.Text & vbCrLf
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für nächsten Mittwoch sind keine Zugänge vorgesehen."
infoToDay1 = TextBox1.Text & vbCrLf
End If

If allActorsEnd > "" Then
UserForm2.TextBox1.Value = "Folgende TN enden am Montag:" & vbCrLf & _
"Dokumentation und TN Ordner prüfen!" & vbCrLf & allActorsEnd
infoToDay2 = TextBox1.Text & vbCrLf
Else
UserForm2.TextBox1.Value = "Für Montag sind keine Austritte vorgesehen"
infoToDay2 = TextBox1.Text & vbCrLf
End If

If allActorsRep > "" Then
UserForm2.TextBox1.Value = "Für folgende TN ist am Montag ein Bericht abzugeben:" & vbCrLf & allActorsRep
infoToDay3 = TextBox1.Text & vbCrLf
Else
UserForm2.TextBox1.Value = "Für Montag sind keine Berichtsabgaben vorgesehen"
infoToDay3 = TextBox1.Text & vbCrLf
End If

UserForm2.TextBox1.Value = infoToDay1 & vbCrLf & infoToDay2 & vbCrLf & infoToDay3

End If

End Sub


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

Vielleicht hat jemand eine Idee wie der Code schlanker wird, ohne dabei die "Übersichtlichkeit" einzubüßen.

Grüße zum Wochenstart, Nordic (Uwe)

32
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Geht's einfacher?
11.03.2024 08:11:53
Oberschlumpf
Moin Uwe,

lange nix von dir gelesen :-)

Hab erst mal n paar Fragen, bzw Anregungen.

1. "...eine Art ToDo-Liste, die Mo - Do bestimmte Gegebenheiten überprüft..."

Ich glaube, zumindest für mich trifft es zu, dass kaum einer Lust hat, so lange mit deiner Datei "zu spielen" (auszuprobieren), bis man weiß, - was genau denn - du mit "...bestimmte Gegebenheiten..." meinst.

Daher würde ich vorschlagen, dass du uns an 2 oder 3 Beispielen - möglichst ganz genau - erklärst, welche Gegebenheiten erfüllt sein müssten, damit diese im Textfeld angezeigt werden.

2. Nach Öffnen deiner Datei und Klick auf den Toggle-Button "ToDo" versuchte ich natürlich zuerst das geöffnete Userform(ular) mit Klick oben rechts wieder zu schließen.
Als Hinweis erschien die Meldung "Bitte mit dem button Info schließen"

Ok, ich klick auf den Toggle-Button "Info"...was passiert?...es öffnet sich ein weiteres Userform...namens "Info"^^
Auch das lässt sich nicht mit Klick oben rechts schließen.

Ich klick wieder auf den Button "Info" = Info-Fenster schließt sich
nun klick ich auf den Button "ToDo" = ToDo-Fenster schließt sich auch (obwohl doch ToDo-Fenster mit Klick auf "Info"-Button schließen soll)

Du solltest also den Hinweis-Text entsprechend an den Button anpassen, der zuvor zum Öffnen eines Userforms angeklickt wurde....(oder vllt doch das Schließen von Userform mit Klick oben rechts erlauben ;-) ...aber ich denk mal, du willst lieber beim Button-Klick bleiben, oder?)

So, dies nur erst mal als Anfang von mir.
Erst mal kann zumindest ich ja eh nix machen, weil ich zu 1. ja noch Antwort benötige.
Und ich werd auch wieder erst heute nachmittag Zeit haben, weiterzuhelfen.....aber...zum Glück gibbs ja noch viele weitere Helfer, von denen sich vllt der Eine oder die Andere mit Verstehen nich so schwer tun wie ich :-)

Ciao
Thorsten
Anzeige
AW: Geht's einfacher?
11.03.2024 08:26:49
MCO
Moin!

Ja, da ist Potential drin.
Die Fälle 1+2 hab ich zusammengefasst, grundsätzlich ist hier SELECT besser als alle Fälle mit IF abzufragen.
Die Fälle 3+4 hab seperat gelassen, da du ganz andere Variablen verwendest. Da ich die nicht zerschiessen wollte, musst du das mal selbst schauen, was da möglich ist.

Grundsätzlich hab ich Variablen die in jedem Fall hergeleitet werden oben über die SELECT geschrieben und Variablen, die immer belegt werden Unterhalb zusammengefasst.

Zu überlegen wäre noch, ob du gLR nicht auch schon vorher einer Variablen zuweist, um nicht jedesmal in die funktion abzuspringen.

Viel Erfolg!
Gruß, MCO


Private Sub UserForm_Activate()

Dim ws As Worksheet
Dim executionDay As Integer
Dim toDay As String
Dim currentDay As String
Dim currentDate As Date
Dim foundDate As Date
Dim actorNew As String
Dim allActorsNew As String
Dim actorEnd As String
Dim allActorsEnd As String
Dim actorRep As String
Dim allActorsRep As String
Dim actorSoon As String
Dim allActorsSoon As String
Dim infoToDay1 As String
Dim infoToDay2 As String
Dim infoToDay3 As String
Dim i As Long

Set ws = ThisWorkbook.Sheets("Projektplan")
UserForm2.TextBox1.Value = ""
executionDay = Weekday(Date, vbMonday)
currentDate = Date
toDay = gWeekday(executionDay) '(steht überall drin)
UserForm2.TextBox1.Value = "Tagesinfo für " & toDay & ", den " & currentDate
currentDay = TextBox1.Text & vbCrLf

Select Case executionDay 'kann Fälle zusammenfassen

Case 1, 2

For i = 7 To gLR
If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 7 = foundDate Then
actor = ws.Cells(i, "B").Value
allActors = allActors & vbCrLf & actor & " am " & foundDate
End If
End If
Next i

If allActors > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für folgende TN endet die Maßnahme in 7 Tagen." & vbCrLf & _
"Ggf. Verlängerungen prüfen!" & vbCrLf & allActors
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Kein TN endet in 7 Tagen." & vbCrLf & _
"Prüfen auf Verlängerungen " & IIf(executionDay = 1, "optional.", "obligatorisch!") 'Unterschied von 1 zu 2
End If

Case 3

For i = 7 To gLR
If IsDate(ws.Cells(i, "D").Value) Then
foundDate = ws.Cells(i, "D").Value
If currentDate = foundDate Then
actorNew = ws.Cells(i, "B").Value
allActorsNew = allActorsNew & vbCrLf & actorNew
End If
End If

If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 1 = foundDate Then
actorEnd = ws.Cells(i, "B").Value
allActorsEnd = allActorsEnd & vbCrLf & actorEnd
End If
End If

If IsDate(ws.Cells(i, "U").Value) Then
foundDate = ws.Cells(i, "U").Value
If currentDate + 1 = foundDate Then
actorRep = ws.Cells(i, "B").Value
allActorsRep = allActorsRep & vbCrLf & actorRep
End If
End If
Next i

If allActorsNew > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für folgende TN ist heute der Maßnamestart geplant:" & vbCrLf & allActorsNew
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Es sind für heute keine Zugänge geplant."
End If

If allActorsEnd > "" Then
UserForm2.TextBox1.Value = "Maßnameende morgen:" & vbCrLf & allActorsEnd
Else
UserForm2.TextBox1.Value = "Kein Maßnameende morgen."
End If

If allActorsRep > "" Then
UserForm2.TextBox1.Value = "Berichte morgen fällig:" & vbCrLf & allActorsRep
Else
UserForm2.TextBox1.Value = "Keine Berichtsabgaben morgen"
End If

infoToDay1 = TextBox1.Text & vbCrLf
infoToDay2 = TextBox1.Text & vbCrLf
infoToDay3 = TextBox1.Text & vbCrLf

UserForm2.TextBox1.Value = infoToDay1 & vbCrLf & infoToDay2 & vbCrLf & infoToDay3

Case 4

For i = 7 To gLR
If IsDate(ws.Cells(i, "D").Value) Then
foundDate = ws.Cells(i, "D").Value
If currentDate + 6 = foundDate Then
actorSoon = ws.Cells(i, "B").Value
allActorsSoon = allActorsSoon & vbCrLf & "> " & actorSoon & " am " & foundDate
End If
End If

If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 4 = foundDate Then
actorEnd = ws.Cells(i, "B").Value
allActorsEnd = allActorsEnd & vbCrLf & "> " & actorEnd & " am " & foundDate
End If
End If

If IsDate(ws.Cells(i, "U").Value) Then
foundDate = ws.Cells(i, "U").Value
If currentDate + 4 = foundDate Then
actorRep = ws.Cells(i, "B").Value
allActorsRep = allActorsRep & vbCrLf & "> " & actorRep & " am " & foundDate
End If
End If
Next i

If allActorsSoon > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Einladungen zum Maßnamestart versenden an:" & vbCrLf & allActorsSoon
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für nächsten Mittwoch sind keine Zugänge vorgesehen."
End If

If allActorsEnd > "" Then
UserForm2.TextBox1.Value = "Folgende TN enden am Montag:" & vbCrLf & _
"Dokumentation und TN Ordner prüfen!" & vbCrLf & allActorsEnd
Else
UserForm2.TextBox1.Value = "Für Montag sind keine Austritte vorgesehen"
End If

If allActorsRep > "" Then
UserForm2.TextBox1.Value = "Für folgende TN ist am Montag ein Bericht abzugeben:" & vbCrLf & allActorsRep
Else
UserForm2.TextBox1.Value = "Für Montag sind keine Berichtsabgaben vorgesehen"
End If

infoToDay1 = TextBox1.Text & vbCrLf
infoToDay2 = TextBox1.Text & vbCrLf
infoToDay3 = TextBox1.Text & vbCrLf
UserForm2.TextBox1.Value = infoToDay1 & vbCrLf & infoToDay2 & vbCrLf & infoToDay3

End Select

End Sub
Anzeige
AW: Geht's einfacher?
11.03.2024 11:36:29
Oppawinni
Ich bin jetzt vielleicht off-Topic aber..
was mir auffällt ist:
- Du folgst in keinster Weise den Namenskonventionen (siehe ggf. Tutorials). Das ist ja kein Zwang aber es kann das Leben leichter machen, insb. wenn verschiedene Leute den Code bearbeiten. Gut, die Masse ist String, kann man sich vielleicht einprägen. Ich mag das trotzdem nicht.
- Maßnahme hab ich mal gelernt, aber vielleicht ist Maßname neue Rächtschraibung. So wird der Code auch kürzer.

Ich hab mich sonst nicht weiter in den Code vertieft und werde es auch nicht. Ohne komplett zu verstehen, was das Ding tut, kann ich dazu halt auch nichts weiter sagen.
Anzeige
AW: Geht's einfacher?
11.03.2024 10:02:22
daniel
was soll der Code denn machen?
was willst du erreichen?
Beschreibe mal an ein paar Beispielen, was der Anwender tun muss und was der Code daraus macht.
Gruß Daniel
AW: Geht's einfacher?
11.03.2024 13:53:14
Oppawinni
Eigentlich wollte ich mir das ja nicht weiter anschauen, aber wie es halt so ist.
Ich hab halt am unteren Ende des Codes versehentlich ein bisschen gelesen.
Und da frag ich mich, was bitte passiert denn da, da wird in eine Textbox was rein geschrieben,
dann wird es in eine Variable gelegt dabei ein Linefeed angehängt.
Das Ganze dreimal und am Ende werden dann drei Variablen wieder zusammen geführt, dabei nochmal Linefeeds eingefügt,
um damit dann den Inhalt der Textbox zu überschreiben.

Das ist von hinten durch die Brust, oder?

So inetwa sollte das gehen, ohne das Ganze hin und her:



infoToDay1 = ""
If allActorsSoon > "" Then
infoToDay1 = infoToDay1 & currentDay & vbCrLf & _
"Einladungen zum Maßnamestart versenden an:" & vbCrLf & allActorsSoon
Else
infoToDay1 = infoToDay1 & currentDay & vbCrLf & _
"Für nächsten Mittwoch sind keine Zugänge vorgesehen."
End If
infoToDay1 = infoToDay1 & String(2, vbCrLf)

If allActorsEnd > "" Then
infoToDay1 = infoToDay1 & "Folgende TN enden am Montag:" & vbCrLf & _
"Dokumentation und TN Ordner prüfen!" & vbCrLf & allActorsEnd
Else
infoToDay1 = infoToDay1 & "Für Montag sind keine Austritte vorgesehen"
End If
infoToDay1 = infoToDay1 & String(2, vbCrLf)

If allActorsRep > "" Then
infoToDay1 = infoToDay1 & "Für folgende TN ist am Montag ein Bericht abzugeben:" & vbCrLf & allActorsRep
Else
infoToDay1 = infoToDay1 & "Für Montag sind keine Berichtsabgaben vorgesehen"
End If
infoToDay1 = infoToDay1 & String(2, vbCrLf)

UserForm2.TextBox1.Value = infoToDay1

Anzeige
AW: Geht's einfacher?
11.03.2024 15:42:58
Oppawinni
Jetzt bin ich da mal komplett drüber, aber das ist ungetestet.
Ein paar Variablen hab ich eliminiert, für einige fehlte die Dimensionierung (Option Explicit).
Ob das currentDate = Date
sinnvoll ist ? Naja, ich hab es gelassen

Was ich geändert habe ist im Wesentlichen, dass der Text für die Textbox grundsätzlich erst in einem String zusammen gebastelt wird und nur jeweils einmal der Textbox zugewiesen wird. Das hin und her zwischen Variablen und Textbox trägt jedenfalls nichts zur Klarheit des Codes bei.

Die Funktion gLR hätte man vielleicht als solche kenntlich machen sollen, etwa gLR(), aber das ist ja ohnehin ein Einzeiler, den man gut an den Anfang der Sub stellen kann.
Ich habe also gLR() raus geworfen. Dafür gibt es jetzt einmal lngLastRow = ws.Cells(Rows.Count, 2).End(xlUp).Row

toDay hab ich mit = WeekdayName(executionDay, , vbMonday) ebenfalls vor die If's gesetzt, kommt damit auch nur einmal vor.
Man hätte jetzt natürlich noch prüfen können, was an Wiederholungen so vorkommt und damit Code kürzen können, aber es ist vielleicht sinnvoll die Struktur im Hinblick auf mögliche zukünftige Anpassungen so zu belassen, ob man da jetzt ein paar IF's oder Select-Case macht halte ich für unwichtig. Ich will diese Diskussion hier auch nicht führen, die hab ich schon oft genug (auch in Bezug auf verschiedenen anderen Sprachen) gehabt.

Soweit also mein Vorschlag:
Option Explicit


Private Sub UserForm_Activate()

Dim ws As Worksheet
Dim executionDay As Integer
Dim toDay As String
Dim currentDay As String
Dim currentDate As Date
Dim foundDate As Date
Dim actorNew As String
Dim allActorsNew As String
Dim allActors As String
Dim actorEnd As String
Dim actor As Variant
Dim allActorsEnd As String
Dim actorRep As String
Dim allActorsRep As String
Dim actorSoon As String
Dim allActorsSoon As String
Dim strInfoToDay As String
Dim i As Long
Dim lngLastRow As Long

Set ws = ThisWorkbook.Sheets("Projektplan")
lngLastRow = ws.Cells(Rows.Count, 2).End(xlUp).Row

currentDate = Date
executionDay = Weekday(Date, vbMonday)
toDay = WeekdayName(executionDay, , vbMonday)

UserForm2.TextBox1.Value = ""

If executionDay = 1 Then

strInfoToDay = "Tagesinfo für " & toDay & ", den " & currentDate & vbCrLf

For i = 7 To lngLastRow
If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 7 = foundDate Then
actor = ws.Cells(i, "B").Value
allActors = allActors & vbCrLf & actor & " am " & foundDate
End If
End If
Next i

If allActors > "" Then
strInfoToDay = strInfoToDay & vbCrLf & _
"Für folgende TN endet die Maßnahme in 7 Tagen." & vbCrLf & _
"Ggf. Verlängerungen prüfen!" & vbCrLf & allActors
Else
strInfoToDay = strInfoToDay & vbCrLf & _
"Kein TN endet in 7 Tagen." & vbCrLf & _
"Prüfen auf Verlängerungen optional."
End If

UserForm2.TextBox1.Value = strInfoToDay

End If

If executionDay = 2 Then

strInfoToDay = "Tagesinfo für " & toDay & ", den " & currentDate & vbCrLf

For i = 7 To lngLastRow
If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 7 = foundDate Then
actor = ws.Cells(i, "B").Value
allActors = allActors & vbCrLf & actor & " am " & foundDate
End If
End If
Next i

If allActors > "" Then
strInfoToDay = strInfoToDay & vbCrLf & _
"Für folgende TN endet die Maßnahme in 7 Tagen.." & vbCrLf & _
"Ggf. Verlängerungen prüfen!" & vbCrLf & allActors
Else
strInfoToDay = strInfoToDay & vbCrLf & _
"Kein TN endet in 7 Tagen." & vbCrLf & _
"Prüfen auf Verlängerungen obligatorisch!"
End If

UserForm2.TextBox1.Value = strInfoToDay

End If

If executionDay = 3 Then

strInfoToDay = "Tagesinfo für " & toDay & ", den " & currentDate & vbCrLf

For i = 7 To lngLastRow

If IsDate(ws.Cells(i, "D").Value) Then
foundDate = ws.Cells(i, "D").Value
If currentDate = foundDate Then
actorNew = ws.Cells(i, "B").Value
allActorsNew = allActorsNew & vbCrLf & actorNew
End If
End If

If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 1 = foundDate Then
actorEnd = ws.Cells(i, "B").Value
allActorsEnd = allActorsEnd & vbCrLf & actorEnd
End If
End If

If IsDate(ws.Cells(i, "U").Value) Then
foundDate = ws.Cells(i, "U").Value
If currentDate + 1 = foundDate Then
actorRep = ws.Cells(i, "B").Value
allActorsRep = allActorsRep & vbCrLf & actorRep
End If
End If

Next i

If allActorsNew > "" Then
strInfoToDay = strInfoToDay & vbCrLf & _
"Für folgende TN ist heute der Maßnamestart geplant:" & vbCrLf & allActorsNew
Else
strInfoToDay = strInfoToDay & vbCrLf & _
"Es sind für heute keine Zugänge geplant."
End If
strInfoToDay = strInfoToDay & vbCrLf & vbCrLf

If allActorsEnd > "" Then
strInfoToDay = strInfoToDay & "Maßnameende morgen:" & vbCrLf & allActorsEnd
Else
strInfoToDay = strInfoToDay & "Kein Maßnameende morgen."
End If
strInfoToDay = strInfoToDay & vbCrLf & vbCrLf

If allActorsRep > "" Then
strInfoToDay = strInfoToDay & "Berichte morgen fällig:" & vbCrLf & allActorsRep
Else
strInfoToDay = strInfoToDay & "Keine Berichtsabgaben morgen"
End If
strInfoToDay = strInfoToDay & vbCrLf

UserForm2.TextBox1.Value = strInfoToDay

End If

If executionDay = 4 Then

strInfoToDay = "Tagesinfo für " & toDay & ", den " & currentDate & vbCrLf

For i = 7 To lngLastRow
If IsDate(ws.Cells(i, "D").Value) Then
foundDate = ws.Cells(i, "D").Value
If currentDate + 6 = foundDate Then
actorSoon = ws.Cells(i, "B").Value
allActorsSoon = allActorsSoon & vbCrLf & "> " & actorSoon & " am " & foundDate
End If
End If

If IsDate(ws.Cells(i, "R").Value) Then
foundDate = ws.Cells(i, "R").Value
If currentDate + 4 = foundDate Then
actorEnd = ws.Cells(i, "B").Value
allActorsEnd = allActorsEnd & vbCrLf & "> " & actorEnd & " am " & foundDate
End If
End If

If IsDate(ws.Cells(i, "U").Value) Then
foundDate = ws.Cells(i, "U").Value
If currentDate + 4 = foundDate Then
actorRep = ws.Cells(i, "B").Value
allActorsRep = allActorsRep & vbCrLf & "> " & actorRep & " am " & foundDate
End If
End If

Next i

If allActorsSoon > "" Then
strInfoToDay = strInfoToDay & vbCrLf & _
"Einladungen zum Maßnamestart versenden an:" & vbCrLf & allActorsSoon
Else
strInfoToDay = strInfoToDay & currentDay & vbCrLf & _
"Für nächsten Mittwoch sind keine Zugänge vorgesehen."
End If
strInfoToDay = strInfoToDay & vbCrLf & vbCrLf

If allActorsEnd > "" Then
strInfoToDay = strInfoToDay & "Folgende TN enden am Montag:" & vbCrLf & _
"Dokumentation und TN Ordner prüfen!" & vbCrLf & allActorsEnd
Else
strInfoToDay = strInfoToDay & "Für Montag sind keine Austritte vorgesehen"
End If
strInfoToDay = strInfoToDay & vbCrLf & vbCrLf

If allActorsRep > "" Then
strInfoToDay = strInfoToDay & "Für folgende TN ist am Montag ein Bericht abzugeben:" & vbCrLf & allActorsRep
Else
strInfoToDay = strInfoToDay & "Für Montag sind keine Berichtsabgaben vorgesehen"
End If
strInfoToDay = strInfoToDay & vbCrLf

UserForm2.TextBox1.Value = strInfoToDay

End If

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "Bitte mit dem Button 'ToDo' schließen!"
Cancel = True
End If
End Sub
Anzeige
AW: Geht's einfacher?
11.03.2024 17:48:15
Yal
Hallo Uwe,

ich entdecke erst jetzt, dass eine Datei vorliegt...

"ohne die Übersichtlichkeit einzubüssen" LOL!

Const cDateFmt = "DDDD, \d\e\n DD. MMMM YYYY"


Private Sub UserForm_Activate()
Dim Erg As String
Dim txt As String

Select Case Weekday(Date, vbMonday)
Case 1, 2
Erg = Actor_behandeln("R", 7) 'Alle
If Erg = "" Then
txt = txt & vbCr & "Kein TN endet in 7 Tagen." & vbCr & "Prüfen auf Verlängerungen optional."
Else
txt = txt & vbCr & "Für folgende TN endet die Maßnahme in 7 Tagen." & vbCr & Erg & vbCr & "Ggf. Verlängerungen prüfen!"
End If

Case 3
Erg = Actor_behandeln("D", 0) 'New
If Erg = "" Then
txt = txt & vbCr & "Es sind für heute keine Zugänge geplant."
Else
txt = txt & vbCr & "Für folgende TN ist heute der Maßnamestart geplant:" & vbCr & Erg
End If

Erg = Actor_behandeln("R", 1) 'Ende
If Erg = "" Then
txt = txt & vbCr & "Kein Maßnahmeende morgen."
Else
txt = txt & vbCr & "Maßnahmeende morgen:" & vbCr & Erg
End If

Erg = Actor_behandeln("U", 1) 'Rep
If Erg = "" Then
txt = txt & vbCr & "Für nächsten Mittwoch sind keine Zugänge vorgesehen."
Else
txt = txt & vbCr & "Einladungen zum Maßnamestart versenden an:" & vbCr & Erg
End If
Case 4
Erg = Actor_behandeln("D", 6) 'Soon
If Erg = "" Then
txt = txt & vbCr & "Für nächsten Mittwoch sind keine Zugänge vorgesehen."
Else
txt = txt & vbCr & "Einladungen zum Maßnahmestart versenden an:" & vbCr & Erg
End If

Erg = Actor_behandeln("R", 4) 'End
If Erg = "" Then
txt = txt & vbCr & "Für Montag sind keine Austritte vorgesehen"
Else
txt = txt & vbCr & "Folgende TN enden am Montag:" & vbCr & "Dokumentation und TN Ordner prüfen!" & vbCr & Erg
End If

Erg = Actor_behandeln("U", 4) 'Rep
If Erg = "" Then
txt = txt & vbCr & "Für Montag sind keine Berichtsabgaben vorgesehen"
Else
txt = txt & vbCr & "Für folgende TN ist am Montag ein Bericht abzugeben:" & vbCr & Erg
End If
End Select

UserForm2.TextBox1.Value = "Tagesinfo für " & Format(Date, cDateFmt) & txt
End Sub

Private Function Actor_behandeln(Spalte As String, Versatz As Long) As String
Dim Z
Dim Erg

With ThisWorkbook.Sheets("Projektplan")
For Each Z In Range(.Cells(7, Spalte), .Cells(gLR, Spalte))
If DateDiff("d", Z.Value, Date) = Versatz Then Erg = Erg & vbCr & Z.EntireRow.Range("B1").Value & " am " & Format(Date + Versatz, cDateFmt)
Next
End With
If Erg = vbCr Then Erg = ""
Actor_behandeln = Erg
End Function


Wenn Du nicht jedesmal sehr sepzifische Meldungen, sondern generischen, könnte man wie die Tage 1 und 2 einige Behandlung zusammenfassen.
Du benutzt sehr viele Variablen, aber der Text schreibst Du jedesmal ins UserForm2.TextBox1, auch wenn der Text noch nicht Final ist, da lohnt sich eine Variable.
vbCr und vbCrLf sind in dem Fall gleichwertig. vbCr ist aber kürzer

VG
Yal

Anzeige
AW: Geht's einfacher?
11.03.2024 20:35:04
Alwin Weisangler
Hallo Uwe,

ich würde statt in Schleifen abklappern es mit Application.Match erschlagen.

Beispielhaft für die 1. und 2. Wochentagsabfrage:


Private Sub UserForm_Activate()
Dim allActors$, Actor$
Dim ws As Worksheet
Dim executionDay As Integer
Dim toDay As String
Dim currentDay As String
Dim currentDate As Date
Dim foundDate As Date
Dim actorNew As String
Dim allActorsNew As String
Dim actorEnd As String
Dim allActorsEnd As String
Dim actorRep As String
Dim allActorsRep As String
Dim actorSoon As String
Dim allActorsSoon As String
Dim infoToDay1 As String
Dim infoToDay2 As String
Dim infoToDay3 As String
Dim i As Long
Dim sDate As Variant

Set ws = ThisWorkbook.Sheets("Projektplan")
UserForm2.TextBox1.Value = ""
executionDay = Weekday(Date, vbMonday)
currentDate = Date

If executionDay = 1 Then

toDay = gWeekday(executionDay)
UserForm2.TextBox1.Value = "Tagesinfo für " & toDay & ", den " & currentDate
currentDay = TextBox1.Text & vbCrLf

sDate = Application.Match(CLng(currentDate + 7), ws.Columns(18), 0) ' findet Zeilennummer des gesuchten Datums
If Not IsError(sDate) Then foundDate = ws.Cells(sDate, "R")
If Not IsError(sDate) Then Actor = ws.Cells(sDate, "B")
If Not IsError(sDate) Then allActors = allActors & vbCrLf & Actor & " am " & foundDate

If allActors > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für folgende TN endet die Maßnahme in 7 Tagen." & vbCrLf & _
"Ggf. Verlängerungen prüfen!" & vbCrLf & allActors
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Kein TN endet in 7 Tagen." & vbCrLf & _
"Prüfen auf Verlängerungen optional."
End If
End If

If executionDay = 2 Then

toDay = gWeekday(executionDay)
UserForm2.TextBox1.Value = "Tagesinfo für " & toDay & ", den " & currentDate
currentDay = TextBox1.Text & vbCrLf

sDate = Application.Match(CLng(currentDate + 7), ws.Columns(18), 0) ' findet Zeilennummer des gesuchten Datums
If Not IsError(sDate) Then foundDate = ws.Cells(sDate, "R")
If Not IsError(sDate) Then Actor = ws.Cells(sDate, "B")
If Not IsError(sDate) Then allActors = allActors & vbCrLf & Actor & " am " & foundDate

If allActors > "" Then
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Für folgende TN endet die Maßnahme in 7 Tagen.." & vbCrLf & _
"Ggf. Verlängerungen prüfen!" & vbCrLf & allActors
Else
UserForm2.TextBox1.Value = currentDay & vbCrLf & _
"Kein TN endet in 7 Tagen." & vbCrLf & _
"Prüfen auf Verlängerungen obligatorisch!"
End If

End If
' ... dein restlicher Code so wie vorgeschlagen mit Application.Match anpassen.

Das ist schneller und benötigt weniger Codezeilen.
Da waren ein paar Variablen nicht deklariert. So lang man Aufbau der Prozedur ist, empfiehlt es sich in die erste Zeile Option Explicit zu schreiben.
Dies verhindert unsinnige Fehler.

Gruß Uwe
Anzeige
AW: Geht's einfacher?
11.03.2024 21:45:02
Oppawinni
Blick ich das jetzt nicht, oder was?
Sieht für mich aus, als würdest du nur einen Teilnehmer finden wollen.
Dir ist schon klar, dass es mehrere Treffer geben könnte, oder ?
Uwe (Nordic), und wann gibts von dir Antworten? owT
11.03.2024 21:15:50
Oberschlumpf
AW: Geht's einfacher?
12.03.2024 07:13:14
Nordic
Moinsen ihr Lieben
Allda, was geht'n hier ab! :)
Leider hatte ich gestern nicht mehr die Zeit alle eure Tipps und Anregungen durchzulesen.
Daher erst heute eine Reaktion von mir: Vielen Herzlichen Dank für eure Mühe die ihr, wie schon so oft (und auch nicht nur bei mir) in diese Anfrage reingesteckt habt.
Ich werd die Lösungsansätze nun erstmal in Ruhe durchgehen und ganz bestimmt davon lernen können.
In jedem Fall werd ich mich aber zeitnah nochmal zur Oscarverleihung melden.
Kommt gut durch den Tag.
Grüße, Nordic (Uwe)
Anzeige
AW: Geht's einfacher?
12.03.2024 19:59:08
Nordic
Moinsen :)
nachdem ich mich erst jetzt vor den Rechner gesetzt habe, erstmal ein paar Rückmeldungen.
Ich mach das einfach mal gesammelt ;)

- Code testen UND vor allem auch verstehen hab ich mir für heut Abend auf Zettel geschrieben
- Darauf bezog sich auch der belächelte Ausdruck "Übersichtlichkeit". Mir ging es damit darum, dass ich natürlich auch durchblicken will\muss an welcher Stelle was passiert für den Fall, dass ich mal was ändern muss.
- die übermäßig vielen Variablen, vorallem beim Schreiben in die Textbox, kamen daher, dass mir für jede Fallprüfung bereits vorhandener Text überschrieben wurde. Daher dachte ich mir "Ergebnis zwischenspeichern und am Schluss zusammensetzen.
- Ich hatte gestern früh auf "lange" Erklärungen verzichtet - gegenüber sonst ;) - da ich einerseits etwas in Eile war um zur Arbeit zu kommen und andererseits davon ausging, dass es sich durch die Ausgabetexte ergibt. Wie gesagt ich hab das ganze mir irgendwie zusammen gebastelt, es funktioniert sogar :), dennoch hatte ich den Eindruck, dass es bisschen viel Code für sich im Grunde wiederholende Routinen ist. In Zukunft werd ich wieder etwas mehr zum Zweck schreiben ;)
- Danke übrigens auch für die Hinweise zu den Rechtschreibfehlern und dem falschen Hinweistext zum Schließen der "ToDo-Box". Letzteres kommt wohl von "Ach, das hab ich doch schon an anderer Stelle, also brauch ich's ja nur kopieren" Auf den Text hatte ich in dem Moment nicht mehr geachtet.
- Zwei Fragen:
Warum macht es keinen Sinn immer dann wenn ich die letzte Zeile brauche in die dafür erstellte Funktion gLR zu springen?
Ich hatte schon überlegt die Ausgabetexte möglichst als Const an den Anfang zu stellen. Damit müsste ich nicht den ganzen Code durchforsten wenn diese Text irgendwie geändert werden sollen. Gute Idee oder eher nicht?

Grüße und einen entspannten Abend euch, Nordic (Uwe)

P.S. Ich bin sehr froh über die viele (und bisweilen auch geduldige) Unterstützung die ich hier erfahren habe :)
Anzeige
AW: Geht's einfacher?
13.03.2024 13:30:36
Oppawinni
Zu deinen 2 Fragen:

Warum macht es keinen Sinhn immer dann wenn ich die letzte Zeile brauche in die dafür erstellte Funktion gLR zu springen?
Kann man machen, aber wenn ich den Code lese, muss ich, wenn ich wissen will, was da passiert wegen EINER Zeile erst mal die Funktion suchen und da frag ich mich dann schon, ob man diese eine Zeile nicht einfach in den Code integrieren könnte. Klar, wenn man sowas in X Subs braucht, kann das einen gewissen Vorteil haben, wenn man da etwas ändern muss. Ich würde, wenn es schon unbedingt so sein soll, wenigstens sofort erkennen wollen, dass gLR keine Variable, sondern eine Funktion ist. Einfach gLR() zu schreiben dürfte kein Problem machen und würde das sofort erklären.

Ich hatte schon überlegt die Ausgabetexte möglichst als Const an den Anfang zu stellen. Damit müsste ich nicht den ganzen Code durchforsten wenn diese Text irgendwie geändert werden sollen. Gute Idee oder eher nicht?
Da sehe ich keinen Vorteil. Was man tun könnte, um die Lesbarkeit zu erhöhen, wäre eher sowas
Const cStartCol = "D"
Const cEndCol = "R"
Const cReportCol = "U"
anfang zu setzen und an solchen Stellen dann
If IsDate(ws.Cells(i, cEndCol).Value) Then
Das lässt dann auch leichter eine Änderung zu.
Auch was Yal vorschlug, nämlich den Select-Case nicht mit 1,2,3,4 zu machen, sondern "Montag","Dienstag" .. fänd ich auch ganz gut.
AW: Geht's einfacher?
12.03.2024 11:05:52
Oppawinni
Wenn du denkst du bist fertig..
Schau bitte nochmal ob in deinem Code noch irgendwo Maßname steht, statt Maßnahme.
Es ist mir gerade wieder eingefallen. Ich hatte total aus den Augen verloren....
Es wird ja dauern, denn er jetzt viel zu verarbeiten hat owT
11.03.2024 22:43:22
Yal
Noch n bisschen Arbeit
12.03.2024 01:20:29
Oppawinni
Ich hab jetzt mal alles ein bisschen gemischt und jetzt ist es auch irgendwie übersichtlich.
Müsste man halt auch mal testen :))


Option Explicit

Private Sub UserForm_Activate()

Dim executionDay As Integer
Dim strTxt As String
Dim strSpalte As String
Dim lngInTagen As Long
Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets("Projektplan")

UserForm2.TextBox1.Value = ""
strTxt = "Tagesinfo für " & WeekdayName(Weekday(Date, vbMonday), , vbMonday) & ", den " & Date & vbCr

Select Case Weekday(Date, vbMonday)

Case 1

strSpalte = "R": lngInTagen = 7
If Not IsError(Application.Match(CLng(Date + lngInTagen), ws.Columns(strSpalte), 0)) Then
strTxt = strTxt & vbCr & _
"Für folgende TN endet die Maßnahme in 7 Tagen." & vbCr & _
"Ggf. Verlängerungen prüfen!" & vbCr _
& ActorsList("", strSpalte, lngInTagen, True)
Else
strTxt = strTxt & vbCr & _
"Kein TN endet in 7 Tagen." & vbCr & _
"Prüfen auf Verlängerungen optional."
End If

UserForm2.TextBox1.Value = strTxt

Case 2

strSpalte = "R": lngInTagen = 7
If Not IsError(Application.Match(CLng(Date + lngInTagen), ws.Columns(strSpalte), 0)) Then
strTxt = strTxt & vbCr & _
"Für folgende TN endet die Maßnahme in 7 Tagen.." & vbCr & _
"Ggf. Verlängerungen prüfen!" & vbCr & _
ActorsList("", strSpalte, lngInTagen, True)
Else
strTxt = strTxt & vbCr & _
"Kein TN endet in 7 Tagen." & vbCr & _
"Prüfen auf Verlängerungen obligatorisch!"
End If

UserForm2.TextBox1.Value = strTxt

Case 3

'new
strSpalte = "D": lngInTagen = 0
If Not IsError(Application.Match(CLng(Date + lngInTagen), ws.Columns(strSpalte), 0)) Then
strTxt = strTxt & vbCr & _
"Für folgende TN ist heute der Maßnamestart geplant:" & vbCr & _
ActorsList("", strSpalte, lngInTagen, False)
Else
strTxt = strTxt & vbCr & _
"Es sind für heute keine Zugänge geplant."
End If
strTxt = strTxt & vbCr

'end
strSpalte = "R": lngInTagen = 1
If Not IsError(Application.Match(CLng(Date + lngInTagen), ws.Columns(strSpalte), 0)) Then
strTxt = strTxt & "Maßnameende morgen:" & vbCr & _
ActorsList("", strSpalte, lngInTagen, False)
Else
strTxt = strTxt & vbCr & _
"Kein Maßnameende morgen."
End If
strTxt = strTxt & vbCr

'rep
strSpalte = "U": lngInTagen = 1
If Not IsError(Application.Match(CLng(Date + lngInTagen), ws.Columns(strSpalte), 0)) Then
strTxt = strTxt & "Berichte morgen fällig:" & vbCr & _
ActorsList("", strSpalte, lngInTagen, False)
Else
strTxt = strTxt & vbCr & _
"Keine Berichtsabgaben morgen"
End If
strTxt = strTxt & vbCr

UserForm2.TextBox1.Value = strTxt

Case 4

'Soon
strSpalte = "D": lngInTagen = 6
If Not IsError(Application.Match(CLng(Date + lngInTagen), ws.Columns(strSpalte), 0)) Then
strTxt = strTxt & vbCr & _
"Einladungen zum Maßnamestart versenden an:" & vbCr & _
ActorsList("> ", strSpalte, lngInTagen, True)
Else
strTxt = strTxt & vbCr & _
"Für nächsten Mittwoch sind keine Zugänge vorgesehen."
End If
strTxt = strTxt & String(2, vbCr)

'End
strSpalte = "R": lngInTagen = 4
If Not IsError(Application.Match(CLng(Date + lngInTagen), ws.Columns(strSpalte), 0)) Then
strTxt = strTxt & vbCr & _
"Folgende TN enden am Montag:" & vbCr & _
"Dokumentation und TN Ordner prüfen!" & vbCr & _
ActorsList("> ", strSpalte, lngInTagen, True)
Else
strTxt = strTxt & vbCr & _
"Für Montag sind keine Austritte vorgesehen"
End If
strTxt = strTxt & String(2, vbCr)

'Report
strSpalte = "U": lngInTagen = 4
If Not IsError(Application.Match(CLng(Date + lngInTagen), ws.Columns(strSpalte), 0)) Then
strTxt = strTxt & vbCr & _
"Für folgende TN ist am Montag ein Bericht abzugeben:" & vbCr & _
ActorsList("> ", strSpalte, lngInTagen, False)
Else
strTxt = strTxt & vbCr & _
"Für Montag sind keine Berichtsabgaben vorgesehen"
End If

UserForm2.TextBox1.Value = strTxt

End Select

End Sub

Private Function ActorsList(strPrefix As String, strSpalte As String, lngVersatz As Long, blnMitDatum As Boolean) As String

Dim rngCell As Range
Dim strOut As String
Dim ws As Worksheet
Dim lngLastRow As Long

Set ws = ThisWorkbook.Sheets("Projektplan")
lngLastRow = ws.Cells(Rows.Count, 2).End(xlUp).Row

With ws
For Each rngCell In Range(.Cells(7, strSpalte), .Cells(lngLastRow, strSpalte))
If DateDiff("d", Date, rngCell.Value) = lngVersatz Then
strOut = strOut & vbCr & strPrefix & ws.Cells(rngCell.Row, "B").Value & _
IIf(blnMitDatum, " am " & (Date + lngVersatz), "")
End If
Next
End With

ActorsList = strOut

End Function

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "Bitte mit dem Button 'ToDo' schließen!"
Cancel = True
End If
End Sub

AW: Noch n bisschen Arbeit
13.03.2024 07:21:41
Nordic
Moin Oppawinni,
ich hab nun Deinen Vorschlag getestet - nochmals vielen Dank Dir und allen anderen, die sich engagiert haben - und werd ihn (fast) so übernehmen :)
Zwei Fragen:
- Zumindest für heute (Case 3, andere Tage kann ich nicht testen, oder?) wäre zwischen "new" und "end" eine Leerzeile ganz schick.
Ich kann leider die Stelle an der noch ein vbcr dafür eingefügt werden sollte nicht finden.
- Würde es Sinn machen die Ausgabetexte gleich zu Anfang als Const zu deklarieren?
Beispiel:


const EndIn7 as String ="Für folgende TN endet die Maßnahme in 7 Tagen."

Damit wären die Ausgabetexte gesammelt am Anfang und ggf. leichter zu ändern.

Grüße und einen angenehmen Tag, Nordic (Uwe)
AW: Noch n bisschen Arbeit
13.03.2024 13:40:12
Oppawinni
Der Code ist ja ganz bewusst in der Reihenfolge der Ausgabe geschrieben ist, sonst würde man ja nicht einfach immer
strText = strText & ..........
schreiben können, und müsste sich das mit irgendwelchen Hilfsvariablen zusammen basteln.
Insofern ist vermutlich zwischen new und end wohl sowas
strTxt = strTxt & vbCr
dann mach halt
strTxt = strTxt & String(2, vbCr)
und wenn das nicht reicht
strTxt = strTxt & String(3, vbCr)
Zu weiteren Fragen hab ich auf einen deiner früheren Posts was geschrieben.
AW: Noch n bisschen Arbeit
13.03.2024 13:39:45
Nordic
Hallo Oppawinni,
abgesehen von meiner Rückmeldung heute früh (vbcr und const), habe ich gerade noch etwas entdeckt, was ich in meinem ursprünglichen Ansatz auch vergessen habe zu berücksichtigen.
Da für die Beendigung morgen bzw in 7 Tagen nur die Spalte "R" geprüft wird, wird mir heute ein TN "richtigerweise" angezeigt, dessen Enddatum auf morgen zeigt.
Nun har aber der TN die Maßnahme am 28.02 abgebrochen (siehe Spalte S)
Es müsste also ein Prüfung eingebaut werden ob "S" leer ist. Nur dann gilt "R", ansonsten gilt das Datum in "S"
Wäre das ein sehr großer Aufwand?
Ein Beispiel für den Fall Austritt (ob morgen oder in 7 Tagen) würde mir vollkommen ausreichen.
Die "Fleißarbeit" mach ich gerne ;)
Grüße, Nordic (Uwe)
AW: Noch n bisschen Arbeit
13.03.2024 14:03:03
Oppawinni
Da kenn ich jetzt dein Projekt zu wenig, aber vielleicht kannst du in deiner Tabelle in deine "EndDatum"-Formel einbeziehen, inwieweit ein Austrittsdatum vorliegt, und das dann als Enddatum setzen, wodurch der Code bleiben könnte, wie er ist.
Ansonsten müsste man da wahrscheinlich etwas länger über den Code nachdenken..
Alternativ
13.03.2024 20:54:07
Oppawinni
Hier mal der Code mit Prüfung von mehreren Spalten,
Da hilft halt Application.Match dann nicht mehr.
Ich hab halt jetzt vorgesehen, dass man zwei Spalten für den Datumsvergleich angeben kann.
Die erste Spalte, die ein Datum liefert wird dann für den Vergleich herangezogen.
Kommentier dir das ggf. etwas besser.
Die Function ActorsList hab ich dafür modifiziert und mit einem zusätzlichen optionalen Parameter versehen,
womit die Liste nach einem Treffer abbricht, wenn dieser True ist.
Das reicht dann aus, um zu entscheiden, inwieweit Treffer vorliegen, dient so also als Ersatz für Application.Match, ist halt langsamer.

Kann sein, dass da noch ein paar Modifikationen sind, ich hab halt ein bisschen herum gespielt.

Private Sub UserForm_Activate()


Dim strTxt As String
Dim strTag As String
Dim strSpalte As String
Dim lngInTagen As Long
Dim ws As Worksheet

'Durch Strichpunkt getrennt angegebenen Spalten werden in der angegebenen Reihenfolge gelesen.
'Der Vergleich erfolgt mit dem ersten gefundenen Datum.
Const cStartCol = "D"
Const cEndCol = "S;R" ' wenn in Spalte S nichts steht, erfolgt der Vergleich mit dem Datum in Spalte R, falls da ein Datum steht.
Const cReportCol = "U"

Set ws = Tabelle1
strTag = WeekdayName(Weekday(Date, vbMonday), , vbMonday)
strTxt = "Tagesinfo für " & strTag & ", den " & Date
UserForm2.Caption = strTxt
strTxt = strTxt & vbCr
UserForm2.TextBox1.Value = ""

Select Case strTag

Case "Montag"

strSpalte = cEndCol: lngInTagen = 7
If ActorsList("", strSpalte, lngInTagen, False, True) > "" Then
strTxt = strTxt & vbCr & _
"Für folgende TN endet die Maßnahme in 7 Tagen." & vbCr & _
"Ggf. Verlängerungen prüfen!" & vbCr & _
ActorsList("> ", strSpalte, lngInTagen, True)
Else
strTxt = strTxt & vbCr & _
"Kein TN endet in 7 Tagen." & vbCr & _
"Prüfen auf Verlängerungen optional."
End If
strTxt = strTxt & vbCr

UserForm2.TextBox1.Value = strTxt

Case "Dienstag"

strSpalte = cEndCol: lngInTagen = 7
If ActorsList("", strSpalte, lngInTagen, False, True) > "" Then
strTxt = strTxt & vbCr & _
"Für folgende TN endet die Maßnahme in 7 Tagen.." & vbCr & _
"Ggf. Verlängerungen prüfen!" & vbCr & _
ActorsList("> ", strSpalte, lngInTagen, True)
Else
strTxt = strTxt & vbCr & _
"Kein TN endet in 7 Tagen." & vbCr & _
"Prüfen auf Verlängerungen obligatorisch!"
End If
strTxt = strTxt & vbCr

UserForm2.TextBox1.Value = strTxt

Case "Mittwoch"

'new
strSpalte = cStartCol: lngInTagen = 0
If ActorsList("", strSpalte, lngInTagen, False, True) > "" Then
strTxt = strTxt & vbCr & _
"Für folgende TN ist heute der Maßnahmestart geplant:" & vbCr & _
ActorsList("+ ", strSpalte, lngInTagen, False)
Else
strTxt = strTxt & vbCr & _
"Es sind für heute keine Zugänge geplant."
End If
strTxt = strTxt & String(2, vbCr)

'end
strSpalte = cEndCol: lngInTagen = 1
If ActorsList("", strSpalte, lngInTagen, False, True) > "" Then
strTxt = strTxt & vbCr & _
"Maßnahmeende morgen:" & vbCr & _
ActorsList("- ", strSpalte, lngInTagen, False)
Else
strTxt = strTxt & vbCr & _
"Kein Maßnahmeende morgen."
End If
strTxt = strTxt & String(2, vbCr)

'rep
strSpalte = cReportCol: lngInTagen = 1
If ActorsList("", strSpalte, lngInTagen, False, True) > "" Then
strTxt = strTxt & vbCr & _
"Berichte morgen fällig:" & vbCr & _
ActorsList("-> ", strSpalte, lngInTagen, False)
Else
strTxt = strTxt & vbCr & _
"Keine Berichtsabgaben morgen"
End If
strTxt = strTxt & vbCr

UserForm2.TextBox1.Value = strTxt

Case "Donnerstag"

'Soon
strSpalte = cStartCol: lngInTagen = 6
If ActorsList("", strSpalte, lngInTagen, False, True) > "" Then
strTxt = strTxt & vbCr & _
"Einladungen zum Maßnahmestart versenden an:" & vbCr & _
ActorsList("* ", strSpalte, lngInTagen, True)
Else
strTxt = strTxt & vbCr & _
"Für nächsten Mittwoch sind keine Zugänge vorgesehen."
End If
strTxt = strTxt & String(2, vbCr)

'End
strSpalte = cEndCol: lngInTagen = 4
If ActorsList("", strSpalte, lngInTagen, False, True) > "" Then
strTxt = strTxt & vbCr & _
"Folgende TN enden am Montag:" & vbCr & _
"Dokumentation und TN Ordner prüfen!" & vbCr & _
ActorsList("- ", strSpalte, lngInTagen, True)
Else
strTxt = strTxt & vbCr & _
"Für Montag sind keine Austritte vorgesehen"
End If
strTxt = strTxt & String(2, vbCr)

'Report
strSpalte = cReportCol: lngInTagen = 4
If ActorsList("", strSpalte, lngInTagen, False, True) > "" Then
strTxt = strTxt & vbCr & _
"Für folgende TN ist am Montag ein Bericht abzugeben:" & vbCr & _
ActorsList("-> ", strSpalte, lngInTagen, False)
Else
strTxt = strTxt & vbCr & _
"Für Montag sind keine Berichtsabgaben vorgesehen"
End If
strTxt = strTxt & vbCrLf

UserForm2.TextBox1.Value = strTxt

End Select

End Sub

Private Function ActorsList(strPrefix As String, strSpalte As String, lngVersatz As Long, _
blnMitDatum As Boolean, Optional blnCheckOnly As Boolean = False) As String

Dim strOut As String
Dim ws As Worksheet
Dim arrCheck() As String
Dim i As Long
Dim vCol As Variant

Set ws = Tabelle1
arrCheck = Split(strSpalte, ";")

With ws
For i = 7 To gLR()
For Each vCol In arrCheck
If IsDate(.Cells(i, vCol)) Then
If DateDiff("d", Date, .Cells(i, vCol)) = lngVersatz Then
strOut = strOut & vbCr & strPrefix & .Cells(i, "B").Value & _
IIf(blnMitDatum, " am " & (Date + lngVersatz), "")
End If
Exit For
End If
Next
'blnCheckOnly = finish as soon as one matching actor is found
If blnCheckOnly And strOut > "" Then Exit For
Next
End With

ActorsList = strOut

End Function

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "Bitte mit dem Button 'ToDo' schließen!"
Cancel = True
End If
End Sub
AW: Alternativ
14.03.2024 07:18:48
Nordic
Hallo Oppawinni,
in aller kürze erstmal vielen Dank, dass Du Dich so reinkniest. Das weiß ich sehr zu schätzen :)
Ich werd's evtl. heute Nachmittag mal einbauen, testen und Dir eine kurze Rückmeldung geben.
Danke auch für die Beantwortung meiner Fragen.
Dass man in gewisser Weise die Anzahl von "vbcr" mit einem Parameter bestimmen kann war mitunter das verblüffendste.
Grüße, Nordic (Uwe)
AW: Alternativ
14.03.2024 10:45:05
Oppawinni
Da ist noch etwas Überhang in UserForm_Activate()
Nachdem da ja Application.Match rausgeflogen ist, braucht es da kein Dim ws As Worksheet und natürlich auch kein Set ws = Tabelle1 mehr.
AW: Alternativ
14.03.2024 13:52:34
Nordic
Hallo Oppawinni,
hab's gerade eingebaut und getestet.
Läuft super gut!
Vielen lieben Dank für Deine Mühe, die Du Dir gemacht hast :)
Grüße aus dem hohen Norden, Nordic (Uwe)
AW: Noch n bisschen Arbeit
14.03.2024 07:10:32
Nordic
Moin Oppawinni,

in der Tabelle an der Formel etwas zu machen wird mir in dem Fall nicht weiterhelfen.
Eigentlich müsste ich sogar noch eine weitere Spalte "Verbis [Ende]" einfügen, was ich mir bislang verkniffen habe, da dies u.U. einen Ratenschwanz an Formel- und evtl. auch Codeänderungen nach sich zieht.

Zum Hintergrund: Nach rd. 15 Jahren im IT-Bereich (2000-15, 1st Level-Support, Projektassi, DMS-Consulting, Prozesscontrolling, ...) arbeite ich seit 2016 wieder in der sozialen Arbeit (meine zweiter Beruf). Seit ein paar Jahren als Berater und Jobcoach bei verschiedenen Bildungsträgern.

Leider ist es so, dass gerade in der Sparte Softwareprodukte kaum das liefern was "ich" erwarte bzw durch die Jahre aus Industrie und Wirtschaft an Funktionalitäten gewohnt bin. So kam auch, ursprünglich mit einer "kleine Idee" das aktuelle Projekt (ohne offiziellen Auftrag) zustande., das ich so gut es geht überwiegend in meiner Freizeit versuche umzusetzen.
Infos sammeln, anreichern, und verdichten, das Wichtigste auf einen Blick, ohne, dass ich oder die KollegInnen sich mit "100 Klicks" auf "Suche" machen und am Ende doch nur ein Teil der erwarteten Infos erhalten oder diese Recht umständlich dargestellt sind.
Wie gesagt, das trifft aber auf die meisten Softwareprodukte im Bereich Soziale Arbeit und\oder Bildung zu.
Jede hat ihre Stärken und Schwächen, keine liefert das was der User an der Front braucht oder erwartet.
Von intuitiver Bedienbarkeit mal ganz abgesehen.
Das macht die Dokumentationspflicht und Verwaltungsaufwand, der ohnehin recht hoch ist, für die Mitarbeiter umso unbeliebter, zumal bei nicht wenigen die IT\EDV Kompetenz wenig ausgeprägt ist und auch kaum eine Motivation besteht sich ein paar Grundlagen anzueignen.

In der aktuellen, noch mindestens 2 Jahre laufenden Maßnahme, habe ich nicht nur ein laufenden Einstieg der Teilnehmer - diese werden mit teils sehr kurzer Vorlaufzeit von der Agentur jeweils zum Mittwoch zugewiesen - auch können sie aus den 11 Modulen (jedes hat eine unterschiedlich Dauer an Tagen) frei wählen.
Fehltage, auch entschuldigte, müssen nachgeholt werden.
Dadurch ergibt sich ab dem Startdatum für jeden per se eine unterschiedliche Zuweisungsdauer ab dem ersten Tag.
Je nach Fehlzeiten oder gar Modulwechsel ist der Aufenthalt ziemlich variabel.
Wird das von uns zu Beginn gemeldete Enddatum voraussichtlich überschritten müssen wir jeden Dienstag, bestenfalls eine Woche im Voraus, einen kurzen Verlängerungsantrag im System der AfA aktvieren. Maßgebend für die Verlängerung ist das bei der AfA hinterlegte Datum und nicht unseres, welches sich dynamisch fortschreibt. In aller Regel beenden die TN die Maßnahme regulär, dann ist ein Bericht spätestens eine Woche nach dem letzten Teilnahmetag einzureichen.
Hier und da kommt es aber auch zu Abbrüchen (aus welchen Gründen auch immer) oder vorzeitigem Ende, z.B. wg. Arbeitsaufnahme. Dann ist der Bericht kurzfristig fällig.
Natürlich muss auch für jeden TN täglich dokumentiert werden, von Anwesenheit bis zum konkreten täglichen Angebot und Durchführung.
Lange Rede, kurzer Sinn: Nicht nur eine ziemlich chaotisch gestrickte Maßnahme, sondern auch eine Menge Verwaltungsaufwand (gut 1/3 der wöchentlichen Arbeitszeit), so wie ein paar wichtige Parameter und Fristen, die im Blick gehalten werden müssen.

Grüße und einen angenehmen Vizefreitag, Nordic (Uwe)
AW: Geht's einfacher?
11.03.2024 19:20:40
Oppawinni
Das mit den "Actors" wollte ich auch erst fast anfassen, aber ich hab dann gesehen, dass die Ausgaben verschieden aufgebaut sind und da hab ich mir gesagt, ich lass es.
Ich nehme auch nicht an, dass der TO viel von dem was wir hier produzieren akzeptable findet, wegen der äääh Übersichtlichkeit.
AW: Geht's einfacher?
11.03.2024 19:38:29
Yal
Du hast Recht, meine Übersichtlichkeit ist unter aller Sau :-))

neuer Versuch:

Const cDateFmt = "DDDD, \d\e\n DD. MMMM YYYY"


Private Sub UserForm_Activate()
Dim Txt As String

Select Case Weekday(Date, vbMonday)
Case 1, 2
'Alle
Txt = Text & vbCr & Actor_behandeln("R", 7, _
"Kein TN endet in 7 Tagen." & vbCr & "Prüfen auf Verlängerungen optional.", _
"Für folgende TN endet die Maßnahme in 7 Tagen.", "Ggf. Verlängerungen prüfen!")
Case 3
'New
Txt = Txt & vbCr & Actor_behandeln("D", 0, _
"Es sind für heute keine Zugänge geplant.", _
"Für folgende TN ist heute der Maßnamestart geplant:")
'End
Txt = Txt & vbCr & Actor_behandeln("R", 1, _
"Kein Maßnahmeende morgen.", _
"Maßnahmeende morgen:")
'Rep
Txt = Txt & vbCr & Actor_behandeln("U", 1, _
"Für nächsten Mittwoch sind keine Zugänge vorgesehen.", _
"Einladungen zum Maßnamestart versenden an:")
Case 4
'Soon
Txt = Txt & vbCr & Actor_behandeln("D", 6, _
"Für nächsten Mittwoch sind keine Zugänge vorgesehen.", _
"Einladungen zum Maßnamestart versenden an:")
'End
Txt = Txt & vbCr & Actor_behandeln("R", 4, _
"Für Montag sind keine Austritte vorgesehen", _
"Folgende TN enden am Montag:" & vbCrLf & "Dokumentation und TN Ordner prüfen!")
'Rep
Txt = Txt & vbCr & Actor_behandeln("U", 4, _
"Für Montag sind keine Berichtsabgaben vorgesehen", _
"Für folgende TN ist am Montag ein Bericht abzugeben:")
End Select

UserForm2.TextBox1.Value = "Tagesinfo für " & Format(Date, cDateFmt) & Trim(Txt)
End Sub

Private Function Actor_behandeln(Spalte As String, Versatz As Long, TextWennLeer As String, Text1WennVoll As String, Optional Text2WennVoll As String) As String
Dim Z
Dim Erg

With ThisWorkbook.Sheets("Projektplan")
For Each Z In Range(.Cells(7, Spalte), .Cells(gLR, Spalte))
If DateDiff("d", Z.Value, Date) = 7 Then Erg = Erg & vbCr & Z.EntireRow.Range("B1").Value & " am " & Format(Date + Versatz, cDateFmt)
Next
End With
If Erg = vbCr Then
Actor_behandeln = TextWennLeer
Else
Actor_behandeln = Text1WennVoll & Erg & IIf(Text2WennVoll = "", "", vbCr & Text2WennVoll)
End If
End Function


VG
Yal
AW: Geht's einfacher?
11.03.2024 21:00:55
Oppawinni
Der TO möchte aber vielleicht doch jeden Tag mal was anderes sehen und nicht deinen Einheitsbrei.
Bei Actors z.B. hat der TO mindestens die Varianten:
allActors = allActors & vbCrLf & actor
allActors = allActors & vbCrLf & actor & " am " & foundDate
allActors = allActors & vbCrLf & "> " & actor & " am " & foundDate
Da musst du vielleicht noch einen "strActorPrefix", einen "strDatePrefix" und ein "blnIncludeDate" als Parameter einführen.
AW: Geht's einfacher?
12.03.2024 17:31:17
Oppawinni
Ich hab mal deine sehr übersichtliche Variante einfach in die Beispieldatei geworfen.
Davor hab ich mir angesehen, was angezeigt wird, wenn man ToDo aufruft.
Deine Variante brachte aber nicht das Gleiche, insbesondere keine "Actoren"
Es liegt daran, daß du
If DateDiff("d", Z.Value, Date) = 7 Then


statt:
If DateDiff("d", Date, Z.Value) = Versatz Then


rein gesetzt hast.
Ich hab es auch nicht gemacht, aber sollte kein Datumswert vorhanden sein, wäre es vielleicht sinnvoll
etwas in der Art zu machen:
If DateDiff("d", Date, IIf(IsDate(z.Value), z.Value, 0)) = Versatz Then
Erwischt!
12.03.2024 18:28:54
Yal
Hallo Oppawinni (wann hast Du übrigens von Papawinni zu Oppawini gewechselt? Glückwunsch zur neuen Generation)

ich hatte in der erste Version https://www.herber.de/forum/messages/1969100.html
richtigerweise den Abgleich zu "Versatz". Habe wohl nur in dem in dem Beitrag kopierten Code korrigiert und in VBE nicht. Mist :-)

If DateDiff("d", Date, IIf(IsDate(z.Value), z.Value, 0)) = Versatz Then

Ja, im Prinzip schon. Wenn z.Value kein Zahl ist, wird einen Fehler gemeldet. Wenn es ein Zahl ist, kann es als Datum interpretiert werden. Unwahrscheinlich, dass diese Zahl ausgerechnet das Datum von Heute + 7 Tage ist. Wenn nicht wird es eh falsch liefern.

Zwecks Übersicht könnte man auch die Wochentag auswerten:
Sub test()


Select Case Format(Date, "DDDD")
Case "Montag", "Dienstag"
Debug.Print "Es ist Montag oder Dienstag"
Case "Mittwoch"
'...
End Select
End Sub


VG
Yal


Off Topic
13.03.2024 23:25:31
Oppawinni
Ja Yal,
Unter Pappawinni war ich viele Jahre in verschiedenen Foren unterwegs,
heißt nicht, dass alles was man mit dem Nick findet auch von mir ist.
In Java-Foren z.B. vielleicht ja, aber da findet man von dem was ich da verbrochen hatte nur noch wenig.
Das hing auch daran, dass es bei einem Forum zum Zeitpunkt einer Forenübernahme recht viel Zoff gab und dann verschiedene sehr
aktive und versierte User die Löschung ihre Beiträge gefordert hatten und der neue Betreiber dem auch im Wesentlichen nachgekommen ist,
was aber bedeutete, dass dem halt auch Beiträge anderer User zum Opfer gefallen sind.
Viele wirklich interessanten Threads aus der Zeit sind damit halt leider verschwunden und ich hab mich da dann auch von Java verabschiedet.
Das hatte aber einfach den Grund, dass wir in der Firma jahrelang auf einer Uraltversion von Java festgenagelt waren und ich wollte irgendwann halt nicht mehr mit deprecated Code hantieren, von dem ich ja von vornherein weiß, dass er für die aktuellen Version komplett umgeschrieben werden müsste. Ups... off-off-topic

Nachdem aber meine Zwillings-Enkel jetzt schon über ein Jahr alt sind,
dacht ich, muss ich mich langsam an den Oppa gewöhnen. :))
AW: Geht's einfacher?
11.03.2024 14:25:45
Oppawinni
autsch.. neee carriage return und line feed sind ja 2 Zeichen
Da wir das nichts mit & String(2,vbCrLf) da würdest du nur 2 mal vbCr bekommen
Dann mach halt dafür & vbCrLF & vbCrLF wobei fraglich ist, ob
- nach der letzten Zeile auch nur ein CRLF genügen würde.
- oder vbCr nicht grundsätzlich auch genügen würde.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige