Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1860to1864
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Excel cron darstellen in Datum Liste

Excel cron darstellen in Datum Liste
12.12.2021 17:09:01
falcon68
Hallo Forum,
Ich habe folgendes vor:
• Gegeben ist eine Liste von cronjobs.
• Diese sollen dargestellt werden in Excel.
• Über die Filterfunktionen von Excel soll in einer Datumstabelle dann das Datum/Stunde/Minute gefunden werden, wann welche Jobs laufen.
In meiner Tabelle habe ich exemplarisch die cron-Syntax nach Excel mit Hilfe von Formeln transformiert.
Das gelingt mir nun für EINEN Job recht zuverlässig.
Hat jemand eine Idee wie man das für eine Menge von Jobs hinbekommt, im Wesentlichen würde es reichen, wenn dann alle Jobnamen in der Zeile der Spalte „O“ stehen.
Das Problem ist, ich kann kein VBA usw. verwenden, das ganze muss mit Formeln implementiert werden.
Hat jemand einen Ansatz, wie ich weitermachen könnte?
In der hochgeladenen Datei habe ich nur ein paar Tage eingetragen, sonst wäre die Matrix zu groß (565.600 Zeilen)
Datei: https://www.herber.de/bbs/user/149767.xlsx
Viele Grüße und einen schönen 3ten Advent!!
TP

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: bei Deiner auszuwertenden Datenmenge ...
13.12.2021 11:11:06
neopa
Hallo TP,
... ist eine Formelauswertung wie von Dir angedacht wenig - bis ungeeignet. Es bedarf aber auch einer solcher auch nicht und auch kein VBA.
Eine Lösung sollte auch mit der Funktionalität realisierbar sein, die Du unter dem Menü Daten und da unter Abrufen und Transformieren findest. Mehr zu dieser Funktionalität, die als Power Query (PQ) bezeichnet wird findest Du z.B. hier https://excelhero.de/power-query/power-query-ganz-einfach-erklaert/
Allerdings ist Deine vorhandene Aufgabenstellung auch damit nicht ganz trivial umzusetzen und so wie Du es bisher beschrieben hast, vielleicht auch gar nicht so notwendig.
Gruß Werner
.. , - ...
Anzeige
AW: bei Deiner auszuwertenden Datenmenge ...
13.12.2021 23:22:50
Yal
Moin TP,
endlich mal eine harte Nuss ;-)
eine der Schwierigkeit liegt daran, dass die Parameter der Cronjob (5 Stück) können mehrere Wert beinhalten können und sogar eine Kodierung haben.
(für nicht wissend: https://de.wikipedia.org/wiki/Cron )
Ich denke, man kommt kaum darum eine UDF (User Defined Formula), also eine in VBA definierte Funktion, die man im Blatt als Excel-Formel verwenden kann.
Etwa:
=CRONTEST(Anfang;Ende;m;s;T;M;WT)
In dem VBA wird ermittelt, ob Intervall gibt und in For-Schleifen zwischen Anfang und Ende getestet, ob einen Treffer vorliegt.
Ein interessante Beschäftigung, aber ich bekomme es nicht heute vollständig gebacken.
VG
Yal
Anzeige
AW: bei Deiner auszuwertenden Datenmenge ...
14.12.2021 21:01:23
falcon68
Hallo,
ganz herzlichen Dank für die Anregungen und Kritiken ;o)!!
Powerquery sieht sehr interessant aus, könnte zum Ziel führen.
Also Danke an Euch!
VG
TP
AW: gerne, dann viel Erfolg owT
15.12.2021 08:45:42
neopa
Gruß Werner
.. , - ...
AW: bei Deiner auszuwertenden Datenmenge ...
15.12.2021 12:48:45
Yal
Moin zusammen,
ich halte weiterhin das Aufdröseln der Cron-Definition in unzähligen Zeilen für nicht führend.
Aber wenn schon, dann mit PQ.
Vielleicht schaffe es meine Lösung hier zu posten, bevor der Thread archiviert wird.
VG
Yal
Erste Version
16.12.2021 17:26:00
Yal
Moin zusammen,
ich habe ewig lang nach eine super schlaue Lösung gesucht und sie noch nicht gefunden.
Daher hier eine erste "Brute Force"-Lösung: im Grund genommen genau, was TP in seine Blatt macht, nur dass alle Kombination nicht angezeit werden, sondern nur gezählt wieviel davon treffend sind. Es ist nicht sehr schnell, aber vertretbar (ich musste die Beschlueniger wieder rausmachen. Da muss ich noch drübergehen).
Es handelt sich um eine UDF, also Formel die man in einer Zelle verwendet, und nimmt die Parameter
=CRONTEST(Anfang;Ende;CronMin;CronStd;CronTag;CronMon;CronWT)
Die Wochentag ("WT") werden in diese version noch nicht berücksichtigt.
Anfang und Ende müssen Datum mit Uhrzei sein: 16.12.2021 17:17:00
Die "Crons" sind wie aus der CronTab: *, 1, 1-5, */3, 3-22/4, usw.
eine kranke Kombination "0-59/4, 0-59/3": jede 4 Minuten + jede 3 Minuten, ist auch möglich. sollte aber selten vorkommen.
Dieses Code muss in einem Modul abgelegt werden.

'Unter Anbindung ("Extras", "Verweise...") von "Microsoft Scripting runtime"
Dim aMin As Dictionary
Dim aStd As Dictionary
Dim aTag As Dictionary
Dim aMon As Dictionary
Dim aWTg As Dictionary
Public Function CronTest(Anfang As Date, Ende As Date, Optional CronMin = "*", _
Optional CronStd = "*", Optional CronTag = "*", Optional CronMon = "*", Optional CronWTg = "*") As Variant
Dim E, Jahr, Mon, Tag, WTg, Std, Min
Dim TagTest
Dim Anz
Set aMon = New Dictionary: For Each E In Split(CronMon, ","): Call GetListe(E, 1, 12, aMon): Next
Set aTag = New Dictionary: For Each E In Split(CronTag, ","): Call GetListe(E, 1, 31, aTag): Next
'    Set aWTg = New Dictionary: For Each E In Split(CronWTg, ","): Call GetListe(E, 0, 6, aWTg): Next
Set aStd = New Dictionary: For Each E In Split(CronStd, ","): Call GetListe(E, 0, 23, aStd): Next
Set aMin = New Dictionary: For Each E In Split(CronMin, ","): Call GetListe(E, 0, 59, aMin): Next
On Error Resume Next
For Jahr = Year(Anfang) To Year(Ende)
For Each Mon In aMon
'            If DateSerial(Jahr, Mon, 1)  Ende Then Exit For 'Beschleuniger
For Each Tag In aTag
TagTest = 1
TagTest = DateSerial(Jahr, Mon, Tag)
'                If TagTest = DateValue("11.12.2021") Then Stop
If TagTest = 1 Then Exit For 'für Monat mit 28 oder 30 Tage
'                If TagTest  Ende Then Exit For 'Beschleuniger
For Each Std In aStd
'                    If (TagTest + Std / 24)  Ende Then Exit For 'Beschleuniger
For Each Min In aMin
If (TagTest + TimeSerial(Std, Min, 0)) >= Anfang _
And (TagTest + TimeSerial(Std, Min, 0))  "*" Then
B = Split(B(0), "-")
i = CInt(B(0))
If UBound(B) = 1 Then Max = CInt(B(1)) Else Max = i
End If
Do While i 
Mit der Bitte um Rückmeldung, sonst wird meine Motivation schnell abflachen.
VG
Yal
Anzeige
AW: Excel cron darstellen in Datum Liste
17.12.2021 05:57:10
falcon68
Hallo Yal,
erstmal herzlichen Dank für Deine Mühe.
Kann mir das leider erst am WE anschauen.
Ich muß erstmal verstehen wie ich das nun in eine Exceldatei einbinde, kenne mich mit VBA usw gar nicht aus.
Über alt+F11 starte ich den Editor, lege Deinen code als neues Modul an. Dann muß ich mir noch den Schritt erschließen, wie ich das starten kann.
vG TP
AW: Excel cron darstellen in Datum Liste
17.12.2021 10:14:45
Yal
Hallo TP,
Ganz einfach: nach dem den Code im Modul liegt, brauchst Du nur eine Formel im Blatt zu schreiben.
Du könntest als Aufwärmübung mit folgenden Formel versuchen:

Public Function Mal_2(ByVal Target) As Double
Mal_2 = 2 * Target
End Function
Dann schreist Du in irgendeine Zelle
=Mal_2(2)
und Du bekommst 4, oder
=mal_2(A1)
dann bekommst Du das doppelte von A1 (Falls A1 ein Zahl ist).
So sieht meine Test-Datei aus:
Userbild
Dabei habe ich einen Fehler entdeckt. Daher hier den korrigierten Code:
(es war " < Ende und jetzt ist es <= Ende )
Outch!! Achte drauf:
Im Visual Basic Editor gehe auf "Extras", "Verweise..." und klickt den "Microsoft Scripting Runtime" an (wegen den "Dictionary", die nicht im Basisumfang gibt).

'Unter Anbindung ("Extras", "Verweise...") von "Microsoft Scripting runtime"
Dim aMin As Dictionary
Dim aStd As Dictionary
Dim aTag As Dictionary
Dim aMon As Dictionary
Dim aWTg As Dictionary
Public Function CronTest(Anfang As Date, Ende As Date, Optional CronMin = "*", _
Optional CronStd = "*", Optional CronTag = "*", Optional CronMon = "*", Optional CronWTg = "*") As Variant
Dim E, Jahr, Mon, Tag, WTg, Std, Min
Dim TagTest
Dim Anz
Set aMon = New Dictionary: For Each E In Split(CronMon, ","): Call GetListe(E, 1, 12, aMon): Next
Set aTag = New Dictionary: For Each E In Split(CronTag, ","): Call GetListe(E, 1, 31, aTag): Next
Set aWTg = New Dictionary: For Each E In Split(CronWTg, ","): Call GetListe(E, 0, 6, aWTg): Next
Set aStd = New Dictionary: For Each E In Split(CronStd, ","): Call GetListe(E, 0, 23, aStd): Next
Set aMin = New Dictionary: For Each E In Split(CronMin, ","): Call GetListe(E, 0, 59, aMin): Next
On Error Resume Next
For Jahr = Year(Anfang) To Year(Ende)
For Each Mon In aMon
For Each Tag In aTag
TagTest = 1
TagTest = DateSerial(Jahr, Mon, Tag)
If TagTest = 1 Then Exit For 'für Monat mit 28 oder 30 Tage
For Each Std In aStd
For Each Min In aMin
If (TagTest + TimeSerial(Std, Min, 0)) >= Anfang _
And (TagTest + TimeSerial(Std, Min, 0))  "*" Then
B = Split(B(0), "-")
i = CInt(B(0))
If UBound(B) = 1 Then Max = CInt(B(1)) Else Max = i
End If
Do While i 
VG
Yal
Anzeige
AW: das ist so nicht (mehr) zutreffend ...
17.12.2021 15:29:00
neopa
Hallo Yal.
... abgesehen davon, dass Du Dich wahrscheinlich verschrieben hast und anstelle 9.12 den 19.12 meinst, hat Hans Herber seit geraumer Zeit die "Archivierung" dynamischer gestaltet.
Der jeweils entsprechende thread wird lediglich in der aktuellen Forumsliste 6 evtl. auch 7 Tage nach seiner Eröffnung generell nicht mehr angezeigt. Er ist aber darüber hinaus für den/die jeweilig am thread aktiven Beteiligten immer noch 6 evtl. auch 7 Tage nach dessen letzten Beitrag im thread aktiv geschaltet. Dies wird sichtbar, wenn der jeweilige Nutzer über das Menü und da unter Beitragslisten, die Liste "Deine Threads" sich darstellen lässt.
Gruß Werner
.. , - ...
Anzeige
Guter Hinweis!
17.12.2021 16:52:50
Yal
...hatte ich nicht auf dem Schirm.
Über den "Mein Thread" komme ich sogar an Beiträge von 2006!
VG
Yal
AW: ... aber nicht der gemeinte, sorry, denn ...
17.12.2021 17:14:20
neopa
Hallo Yal,
... Ich meinte eigentlich die Liste, die Du erhältst, wenn Du https://www.herber.de/cgi-bin/meinebeitraege?name=Yal aktivierst.
Diese Liste zeigt Dir alle die threads an, in denen Du aktuell (wie vorhin beschrieben) Beiträge eingestellt hast und wo Du dann auch noch aktuell antworten kannst.
In der Liste [Deine threads] dagegen werden, wie Du jetzt offensichtlich erstmals festgestellt hast, alle Deine Beiträge gelistet , die Du jemal im Forum erstellt hast. Aus denen Du heraus, kannst Du aber normalerweise nur die archivierten thread ansehen/nachlesen, aber ohne die Möglichkeit darüber neu antworten zu können.
Gruß Werner
.. , - ...
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige