Registriert seit: 08.02.2017
Version(en): 2016
Hallo!
Ich würde gerne zwei Datums mittels VBA vergleichen, ob das Monat und das Jahr gleich ist. Der Tag soll nicht überprüft werden. Ich könnte es natürlich auch so lösen:
If Month(.Range("H3").Value) = Month(.Range("EN5").Value) and Year(.Range("H3").Value) = Year(.Range("EN5").Value)
Beispiel:
31.07.2025 01.07.2025
Hier müsste raus kommen, dass es gleich ist.
Aber gibt es vielleicht auch eine andere Möglichkeit?
Excel Version 2016
Registriert seit: 12.08.2019
Version(en): Office 365
Hallo,
du wirst immer Jahr und Monat vergleichen müssen. Wie du den Vergleich machst, ist egal.
Bsp. mit Variable:
varGleich = Year(Range("H3")) = Year(Range("EN5")) And Month(Range("H3")) = Month(Range("EN5")) MsgBox varGleich
Gruß Sigi
Registriert seit: 13.04.2014
Version(en): 365
01.08.2025, 10:22
(Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2025, 10:22 von BoskoBiati.)
Hi, Code: if Format( .Range("EN5"),"YYMM")= Format( .Range("H3"),"YYMM") then machwas
Gruß Edgar
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr! Über Rückmeldungen würde ich mich freuen.
Registriert seit: 08.02.2017
Version(en): 2016
danke Edgar, ich werde mich für deine Lösung entscheiden, weil sie kürzer ist
Excel Version 2016
Registriert seit: 28.08.2022
Version(en): 365
Hi, aber nimm besser "YYYYMM" statt "YYMM" sonst sind die Jahre 1925, 2025 und 2125 gleich.
Gruß, Helmut
Win10 - Office365 / MacOS - Office365
Registriert seit: 12.07.2025
Version(en): 2021
(01.08.2025, 11:01)dertommy schrieb: danke Edgar, ich werde mich für deine Lösung entscheiden, weil sie kürzer ist Keine gute Idee, der VBA-Code ist vom Text her kürzer, dauert jedoch in der Ausführung länger. Andreas.
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
01.08.2025, 17:09
(Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2025, 17:11 von RPP63.)
Moin! Das hatte ich auch geahnt und gleich mal überprüft.  In ein leeres Tabellenblatt werden 100.000 zufällige Daten in Spalte A geschrieben. In Spalte B werden 15 (Tage) addiert. Konstruktionsmakro: Code: Sub FillIt() Cells.Delete Range("A:B").NumberFormat = "m/d/yyyy" Range("A1:A100000").Formula = "=DATE(2000,1,RANDBETWEEN(1,20000))" Range("B1:B100000").Formula = "=A1+15" With Range("A1:B100000") .Copy .PasteSpecial xlPasteValues End With With Application .Goto Cells(1) .CutCopyMode = False End With End Sub
Und nun kommt der Test: Code: Sub TestIt() Dim Start#, i&, k& Dim arr arr = Cells(1).CurrentRegion Start = Timer For i = 1 To 100000 If Month(arr(i, 1)) = Month(arr(i, 2)) And _ Year(arr(i, 1)) = Year(arr(i, 2)) Then k = k + 1 Next Debug.Print "And-Vergleich: " & Timer - Start & vbTab & "Übereinstimmungen: " & k k = 0 Start = Timer For i = 1 To 100000 If Format(arr(i, 1), "yyyymm") = Format(arr(i, 2), "yyyymm") Then k = k + 1 Next Debug.Print "Format-Vergleich: " & Timer - Start & vbTab & "Übereinstimmungen: " & k End Sub
Ergebnis: Code: And-Vergleich: 0,0546875 Übereinstimmungen: 50596 Format-Vergleich: 0,1015625 Übereinstimmungen: 50596
Ja! And ist doppelt so schnell! Schnell sind sie aber durchaus beide. Und wenn das Jahr auch 2-stellig sein darf, verringert sich der Abstand weiter: Code: And-Vergleich: 0,046875 Übereinstimmungen: 50596 Format-Vergleich: 0,0625 Übereinstimmungen: 50596
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)
Registriert seit: 12.07.2025
Version(en): 2021
Hallo Ralf, Schau Dir mal den Code hier an, Microtimer ist besser für Messungen. https://learn.microsoft.com/de-de/office...erformanceBTW, zum Testen von Formeln ist der RangeTimer hilfreich. Andreas.
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
01.08.2025, 20:09
(Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2025, 20:11 von RPP63.)
Moin Andreas! • Dein Link bezieht sich auf die Geschwindigkeit von Excel, mir bekannt, hier aber fehl am Platz. • Ich teste keine Formeln, denn im Arbeitsblatt (besser: im Array) befinden sich keine Formeln. • Seit geraumer Zeit besitzt der Microtimer keinerlei Vorzüge ggü. Timer, zumindest unter Windows Ich wollte mit meinem Code lediglich demonstrieren, dass die Typumwandlung in einen String nebst Prüfung für einen Durchlauf mit 0,0000008 Sekunden doch erheblich langsamer als der Vergleich mittels And mit 0,0000006 Sekunden ist. Und ja! Bei 100.000 Schleifendurchläufen summiert sich diese Trägheit schon mal auf 3 Hundertstel Sekunden. Im olympischen Finale über 100 m ist das sogar auf dem Zielfoto sichtbar!  Two cents 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)
Registriert seit: 22.09.2024
Version(en): 2010, 2021
01.08.2025, 21:55
(Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2025, 21:55 von knobbi38.)
Hallo, es gibt noch eine Variante, die evtl. auch interessant sein könnte. VBA ist eigentlich ganz gut mit Stringvergleichen und da das Datum in einer Zelle bereits in der Text-Eigenschaft als String vorliegt, liegt es nahe, dieses auch mal zu testen. Dafür einfach mal den Code ergänzen: Code: ... ' Variant-Array mit Strings For i = 1 To UBound(arr) arr(i, 1) = FormatDateTime(arr(i, 1), vbShortDate) arr(i, 2) = FormatDateTime(arr(i, 2), vbShortDate) Next k = 0 Start = Timer For i = 1 To 100000 If Mid$(arr(i, 1), 4) = Mid$(arr(i, 2), 4) Then k = k + 1 Next Debug.Print "String-Vergleich (Variant/String): " & Timer - Start & vbTab & "Übereinstimmungen: " & k ' String-Array Dim astr() As String ReDim astr(1 To UBound(arr), 1 To 2)
For i = 1 To UBound(arr) astr(i, 1) = arr(i, 1) astr(i, 2) = arr(i, 2) Next k = 0 Start = Timer For i = 1 To 100000 If Mid$(astr(i, 1), 4) = Mid$(astr(i, 2), 4) Then k = k + 1 Next Debug.Print "String-Vergleich (String): " & Timer - Start & vbTab & "Übereinstimmungen: " & k
Man beachte den Unterschied bei Verwendung eines String-Array zum Variant-Array mit Strings. Trotzdem glaube ich, daß das alles nur "Peanuts" sind. Wenn man aber auf der sicheren Seite sein möchte, sollten immer die Date-Funktionen verwendet werden, hier in Verbindung mit 'AND' und nicht auf Textformatierungen setzen. Gruß Knobbi38
|