VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
d'r Bastler
Beiträge: 884
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 241 Mal
Danksagung erhalten: 127 Mal

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#11

Beitrag von d'r Bastler »

Moin Mr.K.

die Schaltjahres funktioniert nach 1900 einigermaßen sicher mit: Wenn 29.02. des gesuchten Jahres (anno), dann Schaltjahr.

Die tatsächliche Regel ist etwas komplexer:
wenn anno durch 100 und/oder 400 restlos teilbar, dann nicht. 1900 und 2000 also Fehlanzeige
wenn anno/4 mit Rest, dann auch nicht. Alle ungeraden und nur durch 2 teilbaren also ebenfalls R(he)einfall.
sonst gerne... und das glaubwürdig seit der gregorianische Kalenderreform in 1582

Dieses Jahr ...? Also wieder nix ;)

Schöne Grüße

p.s.: ich habe mal 'ne Select Case dafür geschrieben, die muss ich aber erst suchen.
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
xlKing
Beiträge: 67
Registriert: 30. Mai 2024, 19:42
Hat sich bedankt: 9 Mal
Danksagung erhalten: 57 Mal
Kontaktdaten:

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#12

Beitrag von xlKing »

Ich hab noch mal in meinen Kalendertools gekramt und geprüft wie ich das damals mit den Kalenderwochen gelöst habe. Denn wie gesagt, das Problem ist bisher nicht aufgetaucht. Muss mir aber damals beim Entwickeln doch mal untergekommen sein, denn ich habe zu Berechnen der Kalenderwoche einfach die Woche des auf das Datum folgenden Sonntags herangezogen, außer es ist selbst ein Sonntag. Damit war ich auf Nummer sicher und hatte immer die korrekte Woche. Falls das mal jemand braucht hier die entsprechende Zeile für Deutschland.

Code: Alles auswählen

kw = CLng(Format(dt - Weekday(dt, vbMonday) + 7, "ww", vbMonday, vbFirstFourDays))
PS: Danke für den Hinweis @bastler bezüglich der Schaltjahre. Aber ich kann mich dunkel erinnern mal gelesen zu haben dass 1900 eine Besonderheit war und somit kein Schaltjahr. Und ja alle 100 Jahre sollte die sich wiederholen. 2000 war aber dann die Ausnahme von der Ausnahme und doch wieder ein Schaltjahr. Bin gespannt wie sich die Wissenschaftler für 2100 entscheiden werden.

Gruß Mr. K.
RPP63

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#13

Beitrag von RPP63 »

Moin!
Die Schaltjahres-Regelung des gregorianischen Kalenders ist doch recht einfach:
• 1. Die durch 4 ganzzahlig teilbaren Jahre sind, abgesehen von den folgenden Ausnahmen, Schaltjahre.
• 2. Säkularjahre, also die Jahre, die ein Jahrhundert abschließen (z. B. 1800, 1900, 2100 und 2200), sind, abgesehen von der folgenden Ausnahme, keine Schaltjahre.
• 3. Die durch 400 ganzzahlig teilbaren Säkularjahre, zum Beispiel das Jahr 2000, sind jedoch Schaltjahre.
2000 galt Regel 3, deshalb war es ein Schaltjahr.
Für 1900 und 2100 greift Regel 2, deshalb kein Schaltjahr.

Gruß Ralf
Benutzeravatar
d'r Bastler
Beiträge: 884
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 241 Mal
Danksagung erhalten: 127 Mal

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#14

Beitrag von d'r Bastler »

Moin Mr. K.

Asche auf mein Haupt! (Fällt zum Glück nicht, ist schon grau ;-)) Meine Schaltjahreslogik krankt ja schon in der ersten wenn-Zeile! Also nochmal:

Bedingungen:
1.) seit 1582 durch vier restlos teilbar
2.) alle vollen Hunderter fallen raus, also eigentlich: 1600, 1700 1800, 1900, 2000, 2100, usw. Nein
3.) es sei denn, sie sind durch 400 teilbar, dann sind 'se wieder dabei. Also ohne 1600, 2000, 2400 usw.

Damit wäre dann 1900: nein und 2000: ja auch gelöst.

Sorry für meinen Fehler. Und natürlich Grüße an RPP, der deutlich früher besser war :)

Grüße
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Gast

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#15

Beitrag von Gast »

Moin!
Dann will ich auch mal basteln … ;)
Wenn man den gregorianischen Kalender betrachtet, so wiederholen sich alle 400 Jahre die Bedingungen.
Dies führt (auch) dazu, dass man in Excel auch mit Daten zwischen 1582 und 1900 (einschließlich!) korrekt rechnen kann, wenn man zu den Daten jeweils 400 Jahre addiert.

Beispiel: Zeitraum zwischen dem 17.8.1787 und dem 18.4.1899:
• VBA Direktfenster:

Code: Alles auswählen

?DateSerial(1899, 4, 18) - DateSerial(1787, 8, 17) + 1
 40787
• In Excel addiere ich jeweils 400 Jahre (17.8.2187 und 18.4.2299) und erhalte die gleichen 40.787 Tage

Kommen wir jetzt zu den Schalttagen.:)
Ein Durchschnittsjahr im gregorianischen Kalender dauert 365,2425 Tage.
Betrachten wir einen Zeitraum von 800 Jahren (1600 bis 2399) und schauen, ob der Kalender in VBA korrekt ist:
(DateSerial(1755, 1, 0) ist der 31.12.1754)

Code: Alles auswählen

Sub Jahrestage()
Dim j&, t&, Tage&
Dim Durchschnittsjahr#
For j = 1600 To 2399
  Tage = DateSerial(j, 12, 31) - DateSerial(j, 1, 0)
  t = t + Tage
Next
Durchschnittsjahr = t / (2399 - 1600 + 1)
MsgBox "Ein Durchschnittsjahr dauert " & Durchschnittsjahr & " Tage!"
End Sub
Obwohl wir jetzt wissen, VBA korrekt rechnet, kann man ja mit obigen 3 Regeln arbeiten.
Dazu brauchen wir die Modulooperatoren mod 4, mod 100 und mod 400:

Code: Alles auswählen

Sub Modulo()
Dim j&, Tage&
Dim Durchschnittsjahr#
For j = 1600 To 2399
  Tage = Tage + 365
  If j Mod 4 = 0 Then Tage = Tage + 1
  If j Mod 100 = 0 Then Tage = Tage - 1
  If j Mod 400 = 0 Then Tage = Tage + 1
Next
Durchschnittsjahr = Tage / (2399 - 1600 + 1)
MsgBox "Ein Durchschnittsjahr dauert " & Durchschnittsjahr & " Tage!"
End Sub
q.e.d.
Ralf
Benutzeravatar
theos
Beiträge: 59
Registriert: 15. Sep 2022, 21:48
Hat sich bedankt: 5 Mal
Danksagung erhalten: 31 Mal
Kontaktdaten:

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#16

Beitrag von theos »

Das Thema ist ein wenig vom Thema abgekommen. :)
Aber ich musste dran denken, dass die damals, als die Excel eingeführt haben, einen kleinen Murks eingebaut haben, der bis heute nachwirkt.
Die haben einfach das Jahr 1900 als Schaltjahr genommen, obwohls keines ist.
https://learn.microsoft.com/de-de/offic ... -leap-year
Also nicht wundern, wenn da plötzlich ein Tag fehlt.
Benutzeravatar
d'r Bastler
Beiträge: 884
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 241 Mal
Danksagung erhalten: 127 Mal

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#17

Beitrag von d'r Bastler »

Moin allerseits,

um nach dem Nebensatz: Das ist alles der Kompatibilität zu Lotus 1-2-3 (am Markt 1983-2008, weiß hier noch jemand was das ist?) geschuldet, noch mal zum Thema Zeilen und Code zu kommen:

Lange Code-Zeile kann man wie beschrieben mit einem Leerzeichen & Unterstrich & Zeilenumbruch umbrechen.

Anders herum gibt es ebenfalls einen wenig dokumentierten Trick: Mehrere Zeilen in eine zusammenfassen.

Hier hilft der Doppelpunkt. Während man bei der Var-Deklaration mehrere Vars per Komma trennt, kann man sie dann leicht und kompakt so füllen:

Code: Alles auswählen

iAnzahl = 100: iMinimum = 20: iMaximum = 2000
Fröhliches Coden ;)
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Gast

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#18

Beitrag von Gast »

Übrigens kann man damit auch gut die If-Anw. knackiger schreiben :mrgreen: ( viell nicht übertreiben... :twisted: )

Code: Alles auswählen

Dim blnBastlerIsTop As Boolean
 blnBastlerIsTop = True
 If blnBastlerIsTop Then _
    MsgBox "Der Bastler hat's drauf!"
oder auch mit else Zweig:

Code: Alles auswählen

Dim blnBastlerIsTop As Boolean
 If blnBastlerIsTop Then _
    MsgBox "Der Bastler hat's drauf!" _
 Else: MsgBox "Das kann nich der Bastler sein ;-)"
Gruß, :D
knobbi38
Beiträge: 62
Registriert: 20. Okt 2024, 14:15
Hat sich bedankt: 4 Mal
Danksagung erhalten: 36 Mal
Kontaktdaten:

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#19

Beitrag von knobbi38 »

Hallo

Code: Alles auswählen

...
Else: MsgBox "Das kann nich der Bastler sein ;-)"
:shock:

So etwas wie "else:" gleich wieder schnell vergessen. Hinter ELSE gehört kein Doppelpunkt - niemals!!!
Ich weiß gar nicht, wie man auf so einen Quatsch kommen kann und außerdem ist die Verwechslungsgefahr mit einem Label viel zu groß.

Knobbi38
Folgende Benutzer bedankten sich beim Autor knobbi38 für den Beitrag:
d'r Bastler
Benutzeravatar
d'r Bastler
Beiträge: 884
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 241 Mal
Danksagung erhalten: 127 Mal

Re: VBE Trick: Wie kann man z.B. lange Array-Definitionen in eine Zeile packen?

#20

Beitrag von d'r Bastler »

Vielleicht hat unser "Gast" den Doppelpunkt als Trick zum Aneinanderhängen von Befehlen gemeint ... :lol:
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 2 Gäste