Clever-Excel-Forum

Normale Version: ... fünf Montage im Monat Februar ... Übung
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo @ all, durch eine Quiz-Show, die Montag auf RTL lief, wurde ich inspiriert folgende Übung mal durch zu spielen. Es ging dort um den 5. Montag im Monat Februar. (Eine der Auswahlmöglichkeiten). Das nächste Mal, wann es 5 Montage im Februar gibt.

Meine kleine Übung: Wie oft trifft es zu, dass es 5 Montage im Februar gibt - in einem definierten Zeitraum und in welchen Jahren ist dies der Fall. Gegeben sind nur ein Start- und ein Enddatum. Siehe kleiner Tabellenausschnitt.

Mich würde interessieren, wie ihr das lösen würdet. Ich für mich habe das mit Power Query gelöst. Es würde mich freuen, wenn es den einen oder anderen gibt, der sich hier beteiligt. Ob VBA oder Formel oder Power Query ist egal...


Arbeitsblatt mit dem Namen 'Tabelle3'
ABCD
101.01.1900
231.12.2150in welchen JahrenAnzahl
3
4
5
6
7
8
9
10
11
Verwendete Systemkomponenten: [Windows (32-bit) NT 10.00] MS Excel 2016
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg
Hi Jörg,

mit VBA:
Sub AnzahlFebruareMitFuenfMontagen()
Dim lngAnzahlJahre As Long
Dim lngJahr As Long
Dim datBis As Date
Dim datVon As Date
Dim varJahre As Variant

datVon = Range("A1").Value
datBis = Range("A2").Value
ReDim varJahre(1 To Year(datBis) - Year(datVon), 1 To 1)

For lngJahr = Year(datVon) To Year(datBis)
If Day(DateSerial(lngJahr, 2, 29)) = 29 Then
If Weekday(DateSerial(lngJahr, 2, 29), 2) = 1 Then
lngAnzahlJahre = lngAnzahlJahre + 1
varJahre(lngAnzahlJahre, 1) = lngJahr
End If
End If
Next lngJahr

Range("C3").Resize(UBound(varJahre)).Value = varJahre
Range("D3").Value = lngAnzahlJahre
End Sub
Gruß Uwe
Moin Uwe, das ging ja rasant. Und ist richtig - was sonst. (^_-) toll...
Hallo, bislang habe ich zwei Varianten zur Lösung der kleinen Übung bekommen. Eine per PN. Beide mit dem richtigen Ergebnis - die eine VBA, die andere mit Power Query. Danke schon mal dafür. Ich warte noch ein wenig. Es gibt ja keine Auswertung mit Wertung und kein Preis... Trotzdem würde ich den thread am Sonntag Abend schliessen - und dann meinen Vorschlag einbringen. Mal sehen - vielleicht tut sich ja noch etwas. Eine Formelvariante vielleicht, obwohl: das glaube ich eher weniger. (Aber trotzdem) Danke fürs mitgrübeln...
ABCD
101.01.1901
231.12.2150In welchen Jahren
319049
41932
51960
61988
72016
82044
92072
102112
112140

ZelleFormel
C3=WENNFEHLER(AGGREGAT(15;6;(1900+ZEILE($A$1:$A$250))/((TAG(("1.3."&1900+ZEILE($A$1:$A$250))-1)=29)*(REST("1.2."&1900+ZEILE($A$1:$A$250);7)=2));ZEILE(A1));"")
D3=ANZAHL($C$3:$C$15)
Verwendete Systemkomponenten: [Windows (32-bit) NT 6.02] MS Excel 2010
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg
Moin Michael, danke für deinen Beitrag. Sieht auf den ersten Blick super aus. ABER: Der definierte Zeitraum soll frei definierbar sein, also auch unterjährig... Das ist jetzt unschön - von mir wegen der ungenauen Vorgabe... Beim Testen habe ich festgestellt, dass das auch Uwe's Beitrag betrifft... SORRY.... Auch die Power Query Lösung aus der PN ist betroffen... Oje... 

Bitte nicht böse sein, wegen der offensichtlich schwachen Formulierung...

Also wenn der Start nach dem Februar ist oder das Ende im Januar liegt sollte das jeweils betroffene Jahr nicht mit aufgeführt werden... 

Ja, Fragen stellen ist manchmal schwerer, als sie zu beantworten...
Hi Jörg,

(16.01.2019, 18:21)Jockel schrieb: [ -> ]Der definierte Zeitraum soll frei definierbar sein, also auch unterjährig...

auch kein Problem: Wink
Sub AnzahlFebruareMitFuenfMontagen()
 Dim lngAnzahlJahre As Long
 Dim lngJahr As Long
 Dim datBis As Date
 Dim datVon As Date
 Dim varJahre As Variant
 
 datVon = Range("A1").Value
 datBis = Range("A2").Value
 ReDim varJahre(1 To Year(datBis) - Year(datVon), 1 To 1)
 
 For lngJahr = Year(datVon) To Year(datBis)
   If DateSerial(lngJahr, 2, 1) >= datVon And DateSerial(lngJahr, 2, 29) <= datBis Then
     If Day(DateSerial(lngJahr, 2, 29)) = 29 Then
       If Weekday(DateSerial(lngJahr, 2, 29), 2) = 1 Then
         lngAnzahlJahre = lngAnzahlJahre + 1
         varJahre(lngAnzahlJahre, 1) = lngJahr
       End If
     End If
   End If
 Next lngJahr
 
 Range("C3").Resize(UBound(varJahre)).Value = varJahre
 Range("D3").Value = lngAnzahlJahre
End Sub
Gruß Uwe
Hi Uwe, für dich nicht! Passt perfekt. Toll. Da ist wohl ein Bierchen fällig beim nächsten Treffen.
Hallo, werte Mitleser. Heute möchte ich meinen Lösungsansatz zeigen. Leider wird's beim zeigen bleiben, denn: Die, die mich kennen, wissen, dass ich kein Erklär-Bär bin. Es ist ein Ansatz. Nicht mehr und nicht weniger... Es geht sicher besser - auf jeden Fall anders.  Ich habe einiges Interessante gesehen und gelernt. Wenn es Fragen gibt, versuche ich sie natürlichzu beantworten... So, bin gleich afk - es wird kulturell in Bad Arolsen...

[attachment=21989]