Prüfen ob Monat und Jahr gleich ist
#1
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
Antworten Top
#2
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
Antworten Top
#3
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.
Antworten Top
#4
danke Edgar, ich werde mich für deine Lösung entscheiden, weil sie kürzer ist
Excel Version 2016
Antworten Top
#5
Hi,
aber nimm besser "YYYYMM" statt "YYMM" sonst sind die Jahre 1925, 2025 und 2125 gleich.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#6
(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.
[-] Folgende(r) 1 Nutzer sagt Danke an Andreas Killer für diesen Beitrag:
  • knobbi38
Antworten Top
#7
Moin!
Das hatte ich auch geahnt und gleich mal überprüft. Wink
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)
Antworten Top
#8
Hallo Ralf,

Schau Dir mal den Code hier an, Microtimer ist besser für Messungen.
https://learn.microsoft.com/de-de/office...erformance

BTW, zum Testen von Formeln ist der RangeTimer hilfreich.

Andreas.
Antworten Top
#9
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!  21

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)
Antworten Top
#10
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
Antworten Top


Gehe zu:


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