Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Kommentare in Kalender
#21
Deinen Code habe ich annähernd verstanden! (Bin Handwerker und kein IT ler. 19 

Aber kann ich den Code irgendwie so umbasteln, dass er die falschen Datumangaben auslässt und bei alle anderen Datumeinträgen das Kommentar setzt?
Antworten Top
#22
Hallo,
 
ich bin Musiker (also auch ein Handwerker) und kein It'ler. Es ist auch nur ein Hobby, was ich hier hinterlasse.
Aber was verstehst du unter falschen Datumsangaben.
Soll im Listobject geprüft werden, ob in einer Zelle der 1. Spalte das eingegebene Datum einen gültigen Wert hat?
Was soll passieren, wenn ein ungültiges Datum wie 32.1.2023 eingetragen wird --> MsgBox Ausgabe oder Zelle leeren.
 
Gruß Uwe
Antworten Top
#23
Für ein Hobby bist Du richtig fit in Excel!

Jetzt sagt er ja beim durchlaufen über eine MsgBox, welche Datumsangaben falsch sind bzw nicht im Jahr existieren zb. 30.2.2023

Diese falschen Datumswerte soll er mit Kommentaren ignorieren und alle richtig eingetragenen Datumswerte soll er trotzdem das Kommentar setzen.
Antworten Top
#24
anbei mal deine letzte Datei.
Es wird nur ein vollständig aufbereiteter Termin (alle 3 Zellen einer Zeile im Listobject) mit gültigem und dem Kalenderjahr zugeordneten Datum übergeben.

.xlsm   Terminkalender(1).xlsm (Größe: 82,16 KB / Downloads: 3)
 
Gruß Uwe
Antworten Top
#25
Das funktioniert aber nur wenn das Format 29.2.23 lautet.
Trägt jemand 29.2.2023 ein kommt ein Laufzeitfehler 13

Fehlerstelle: rngDate = .ListObjects(1).DataBodyRange.Cells(i, 1)
Antworten Top
#26
ändere so:

Code:
Option Explicit

Sub TerminKommentarfeld()
    Dim cell As Object
    Dim rngDate As Date
    Dim rngTermin As Range
    Dim Monat$
    Dim strgComm$
    Dim i&
    With Tabelle1
        .Unprotect 'Blattschutz aufheben
        For Each cell In Range("rng_Datum").Cells
            If Not cell.Comment Is Nothing Then cell.Comment.Delete
        Next
        For i = 1 To .ListObjects(1).DataBodyRange.Rows.Count
            If .ListObjects(1).DataBodyRange.Cells(i, 1) <> "" And .ListObjects(1).DataBodyRange.Cells(i, 2) <> "" And _
               .ListObjects(1).DataBodyRange.Cells(i, 3) <> "" And IsDate(.ListObjects(1).DataBodyRange.Cells(i, 1)) = True Then ' nur vollständig ausgefüllte Termine werden eingetragen
                With .ListObjects(1).DataBodyRange
                    strgComm = "Datum: " & .Cells(i, 1) & Chr(10) & "Wann: " & Format(.Cells(i, 2), "hh:mm") & _
                    " Uhr" & Chr(10) & "Was: " & .Cells(i, 3)
                End With
                rngDate = .ListObjects(1).DataBodyRange.Cells(i, 1)
                Monat = "rng_" & Month(.ListObjects(1).DataBodyRange.Cells(i, 1))
                If Tabelle1.Cells(2, 3) = Year(.ListObjects(1).DataBodyRange.Cells(i, 1)) Then
                    Set rngTermin = .Range(Monat).Find(Day(rngDate), LookIn:=xlValues, LookAt:=xlWhole)
                    If Not rngTermin Is Nothing Then
                        If rngTermin.Comment Is Nothing Then rngTermin.AddComment
                        If rngTermin.Comment.Text <> "" Then
                            rngTermin.Comment.Text Text:=rngTermin.Comment.Text & Chr(10) & "< nächster Termin >" & Chr(10) & strgComm
                        Else
                            rngTermin.Comment.Text Text:=strgComm
                        End If
                        rngTermin.Comment.Shape.TextFrame.AutoSize = True
                    End If
                End If
            Else
                If IsDate(.ListObjects(1).DataBodyRange.Cells(i, 1)) = False And .ListObjects(1).DataBodyRange.Cells(i, 1) <> "" Then
                    MsgBox "dieses Datum " & .ListObjects(1).DataBodyRange.Cells(i, 1) & " gibt es nicht."
                    .ListObjects(1).DataBodyRange.Cells(i, 1) = ""
                End If
            End If
            strgComm = ""
        Next i
        .Protect 'Blattschutz aktivieren
    End With
End Sub
Gruß Uwe
Antworten Top
#27
Jetzt macht er zwar die MsgBox aber auch keine Kommentare rein. 22

Selbst wenn alle Datumseingaben richtig sind macht er keine Kommentare rein.
Antworten Top
#28
Ich wollte eigendlich nur eine Möglichkeit, die prüft, ob das eingegebene Datum im eingestellten Jahr existiert.

29.2.23 = nein
29.2.24 = ja

31.4.23 = nein

und so mit allen Datumseingaben
Antworten Top
#29
(25.12.2023, 21:23)Andyle schrieb: Das funktioniert aber nur wenn das Format 29.2.23 lautet.
Trägt jemand 29.2.2023 ein kommt ein Laufzeitfehler 13

Fehlerstelle: rngDate = .ListObjects(1).DataBodyRange.Cells(i, 1)

Moin!
Mein Wort zum Dienstag:
Du musst halt ein wenig testen!
Aus der Hilfe zu IsDate:
Zitat:Gibt True zurück, wenn der Ausdruck ein Datum oder als gültige Datums- oder Uhrzeitangabe erkennbar ist; andernfalls wird False zurückgegeben.
29.2.2023 kann nur als 29.02.2023 interpretiert werden, da nur 2 gültiger Monat ist, es gibt keine Monate 2023 oder 29
Deshalb liefert IsDate("29.2.2023") false.

Jetzt zum 29.2.23:
Jetzt versucht (s.o.) IsDate(), ein Datum zu erkennen.
Es gibt ja durchaus das Datumsformat YY.MM.DD
Daher ermittelt IsDate("29.2.23") das gültige Datum 23.02.2029 und gibt true zurück!

Der Versuch einer Erklärung:
VBA wurde im letzten Jahrtausend Wink entwickelt.
Da gab es nur zweistellige aktuelle Jahreszahlen, die weit oberhalb des Tagesmaximums 31 lagen.
Seit 2001 erscheint die Pseudointelligenz widersinnig.
Und jetzt wird es wild:
9/11 ist ja ins Gedächtnis gebrannt, es handelt sich um den 11. September, weil die Amis das Datumsformat MM/DD/YYYY haben.
In einem deutschen Windows mit deutschem Datumsformat ermittelt
CDate("9/11/98") den 09.11.1998
Ich bin mir sehr sicher, dass dies den 11.09.1998 ergibt, wenn ich das Windows-Datumsformat ändere.

Wenn man unbedingt das Jahr zweistellig eingeben will hilft (als Ansatz, nicht als Lösung):
Code:
Day(CDate("29.2.23")) = CInt("29")

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#30
Hallo,
 
um für etwas Klarheit zu sorgen, wie der Umgang mit Datumsformaten in Excel funktioniert, folgende Erklärung:
 
Kurzeingaben, welche letztendlich deine sind, werden in eine Datumszahl (egal wie die Zelle formatiert ist) umgewandelt und als Datum in VBA gelesen. 
Wird ein unsinniges Kurzdatum wie 29.2.23 eingegeben wird selbiges in VBA als 23.02.2029 gelesen und stellt damit ein gültiges Datum dar.
 
Die einzige Möglichkeit dieses Problem zu umgehen ist die Zeichenkette (Datum) am Punkt zu splitten --> den 3. Splittwert (arr(2)) auf die Stringlänge 2 zu prüfen um immer eine vollständige Jahreszahl zu haben.
 
Besser wäre es natürlich sauber verarbeitbare Daten einzugeben.
 
In einer Textbox kann man solche Eingabefehler besser auffangen als in einer Zelle im Tabellenblatt. Ich habe jetzt nicht getestet ob diese Vorgehensweise zu anderen Problemen führen kann.
 
Was ich nicht nachvollziehen konnte, wieso bei dir keine Ausgaben in die Kommentarfelder der bereits vollständigen und fehlerfrei vorhandenen Datensätzen im Listobject vorhanden waren.
 
Lade ggf. diese Datei noch mal hoch.

.xlsm   Terminkalender(1).xlsm (Größe: 83,83 KB / Downloads: 8)
 
Gruß Uwe
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste