Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1504to1508
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

Vergleich von Terminen

Vergleich von Terminen
20.07.2016 12:41:29
Terminen
Hallo an alle,
Ich habe ein Problem bezüglich der Rechenperformance meiner VBA-Berechnung in Excel
Es geht dabei um die Verteilung von Stunden zwischen einem Start- und einem Endtermin.
Da ich relativ viele Daten habe und der folgende Code oft durchlaufen werden muss, wollte ich mal fragen ob ihr Ideen habt den Code effizienter zu machen sodass die Rechendauer eingeschränkt werden kann.
Ich denke es ist sehr aufwendig das jeder Tag(aktuellesDatum) des Jahres mit dem Start und Endtermin verglichen wird, aber mir fällt leider noch nichts besseres ein.
Ich hatte überlegt erst die entsprechenden Monate zu selektieren über "Month(Datum)", aber da bin ich noch nicht weitergekommen.
Ich hoffe mir kann hier jemand helfen und bin dankbar über jede Idee
Gruß
Code:

Sub Stundeberechnung()
'Gesamtstundenzahl der einzelenen Bereiche
weeks = ws4.Cells(4, "C")
'wda = 7 * weeks
x = 0
iEnd = rowstart(0) + 5
For row = rowstart(0) + 1 To iEnd
'wda = ws4.Cells(row, 12).Value - 1
'zur Verfügung stehende Stunden je Terminblock
ABChoursamount = 0
ABChoursamount = wsk.Cells(row, "V").Value
DEFhoursamount = 0
DEFhoursamount = wsk.Cells(row, "W").Value
'Für die Bewältigung verfügbare Tage
ABCdays = wsk.Cells(row, "H")
DEFdays = wsk.Cells(row, "K")
'Start- und Endtermine
ABCDateS = wsk.Cells(row, "F").Value        'Startdatum ABC
ABCDateE = wsk.Cells(row, "G").Value        'Enddatum ABC
DEFDateS = wsk.Cells(row, "I").Value        'Startdatum DEF
DEFDateE = wsk.Cells(row, "J").Value        'Enddatum DEF
For col = 0 To 365 '+ 365
aktuellesDatum(col) = wsk.Cells(2, col + 33).Value
Next col
For col = 0 To 365
dayhours(row - rowstart(0), col) = 0
'Daten-Vergleich Jedes Datum jedes Tages wird mit dem der vorgegebenen Termine verglichen
''Beschreiben der ABC Daten wenn Datum im ABC Zeitraum (linear)
If aktuellesDatum(col) >= ABCDateS And aktuellesDatum(col) = DEFDateS And aktuellesDatum(col) 

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Vergleich von Terminen
20.07.2016 13:03:12
Terminen
Hi Elke,
die DIMensionierung von aktuellesDatum (und allen anderen Variablen) ist im Schnipsel nicht sichtbar: ist das außerhalb der Sub global definiert oder (teilweise) gar nicht?
Es wäre einfacher zu bearbeiten, wenn Du eine Beispieldatei mit anonymisierten Werten hochlädst (bitte gib Acht, daß keine Bezüge auf andere Datein enthalten sind).
Schöne Grüße,
Michael
AW: Vergleich von Terminen
20.07.2016 14:05:27
Terminen
Hi Michael
Schon einmal danke für deine Hilfe.
Habe eine Beispiel Datei erstellt und hochgeladen.
Sub ...()
ws1.Application.ScreenUpdating = False
'code...
ws1.Application.ScreenUpdating = True
End Sub

Habe ich in der Beispieldatei vergessen.
Damit habe ich schon eine enorme Leistungsverbesserung erzielen können.
Wenn der Code aber öfter durchläuft, ist er aber immer noch sehr langsam (40 sec-60sec).
Da der Code aber ca. 40 mal aufgerufen wird, wäre die Tabelle für den Nutzer schon ehr nervig.
Schönen Gruß
Anzeige
kleine Kritik ...
20.07.2016 14:41:12
Michael
Hi Eike,
... zuerst an mir, weil ich aus Eike Elke gemacht hatte - sorry!
Es gibt einige Punkte, die Dich nicht glücklich machen werden, völlig unabhängig von der Performance:
1. Datumsdifferenzen: aus A5: 01.01.2016 und B5: 10.01.2016 berechnest Du in C5 schlicht =B5-A5=9
Hier mußt Du Dir vorstellen, daß diese Berechnung von zwei GLEICHEN UHRZEITEN der beiden Tage ausgeht: von (z.B.) 1.1. 0:00 bis 10.01. 0:00 sind es tatsächlich nur 9 Tage, wobei hier keine einzige Minute des 10.1. "vorhanden" ist.
Datumsdifferenzen, die sowohl den 1. als auch den letzten Tag des Zeitraums einschließen sollen, muß man also immer mit + 1 berechnen, also = B5-A5 +1 = 10, das bedeutet dann 1.1. 0:00 bis 10.1. 24:00
2. Ihr arbeitet offensichtlich nicht an Wochenenden, woraus ich mal frech schließe, daß Ihr auch an Feiertagen nicht arbeitet: der 1.1. IST ein Feiertag!
3. Deine Art, Sa/So herauszurechnen, führt dazu, daß nicht die komplette Zeit (aus G5/H5) berücksichtigt wird. G5 ist 3,22, und in den Spalten 1.1. bis 10.1. stehen nur 2,1566667, weil die "Wochenendlöcher" nicht aufgefüllt werden.
Abhilfe wäre, eine "bessere" Formel in C5 bzw. F5 einzusetzen, die Wochenenden und (wenn man schon dabei ist) Feiertage rausrechnet - oder zusätzlich je eine Hilfsspalte.
Dann muß G5 nicht durch die kalendarische Anzahl der Tage, sondern durch die ARBEITStage in dem Zeitraum geteilt werden...
Ohne den 1.1. wären das dann 4 (die Hl. 3 Kieni gibt's ja auch noch), also pro ARBEITStag 3,22:4=0,805
4. Das ist nur ein Tippfehler im Makro, aber womöglich folgenschwer:
'        DEFDateE = ws1.Cells(row, "F").Value        'Enddatum DEF
DEFDateE = ws1.Cells(row, "E").Value        'Enddatum DEF *****
'                                 ***
Ich bau Dir mal was ein und melde mich nachher noch mal,
Michael
Anzeige
Arbeitstage ohne Feiertage
20.07.2016 17:17:20
Michael
Hallo Eike,
ich habe zwei neue Module angelegt. Das "Michael" enthält alles, was für Berechnung in J5:NK9 nötig ist (und zwar in einer einigermaßen verständlichen und einer optimierten Version), das "Michael_UDF" eine UserDefinedFunction auf Basis von Franz' (fcs) Code (link im VBA), die die effektiven Arbeitstage innerhalb eines Zeitraums ermittelt: aufgerufen wird sie z.B. in C5.
Ich mußte mich zwischenzeitlich belehren lassen, daß die 3 Könige kein bundesweiter Feitertag sind; die Zeile kannst Du ggf. entfernen.
Die Datei: https://www.herber.de/bbs/user/107123.xlsm
Das Durchgehen aller Tage ist überflüssig, da ausgehend vom 1. Datum (in J2) und dem jeweiligen Anfangsdatum die Differenz errechnet wird: plus 10 (bzw. "+0" in der optim. Version) ist dann die Spalte, ab der das Ergebnis geschrieben wird.
Laß mich bitte wissen, wie es läuft...
Schöne Grüße,
Michael
Anzeige
AW: Arbeitstage ohne Feiertage
20.07.2016 19:31:16
Eike
Hallo Michael, vielen Dank für deine Hilfe.
Das mit den Feiertagen war mir bekannt wollte es nur erst zum laufen bringen und dann die Feiertage einbauen.
Vielleicht ein wenig laienhaft von mir;)
Ich werde es leider erst nächsten Montag (25.7.) einbauen können und werde dann Rückmeldung geben.
Viele Grüße
Eike
ok, dann bis dann,
20.07.2016 21:11:24
Michael
Eike,
und schöne Grüße zurück,
Michael
AW: Arbeitstage ohne Feiertage
20.07.2016 19:31:17
Eike
Hallo Michael, vielen Dank für deine Hilfe.
Das mit den Feiertagen war mir bekannt wollte es nur erst zum laufen bringen und dann die Feiertage einbauen.
Vielleicht ein wenig laienhaft von mir;)
Ich werde es leider erst nächsten Montag (25.7.) einbauen können und werde dann Rückmeldung geben.
Viele Grüße
Eike
Anzeige
AW: Arbeitstage ohne Feiertage
26.07.2016 11:06:37
Eike
Hallo nochmal:
Hier die Rückmeldung.
Ich habe den Code soweit angepasst und es funktioniert soweit erstmal.
Dennoch sind ein paar Probleme die noch auftreten sind.
Da die Termine aus einer Datenbank gezogen werden und manchmal auch außerhalb von 2016 liegen musste ich noch eine kleine if-Bedingung einbauen um die Berechnung zu überspringen. sonst gibt es einen Indexüberlauf.

If spD 
Des Weiteren habe ich noch ein Problem, wenn sich Termine überschneiden. War so nicht im Beispiel angegeben, aber es fehlen Stunden beim manuellen Abgleich.
Vielleicht hast du ja noch ein schnelle Idee, ich schau auch gerade wo ich das noch unterbringe.
Trotzdem erstmal vielen Dank.
War eine Leistungsverbesserung von 10000% ;-)
Gruß
Anzeige
AW: Arbeitstage ohne Feiertage
26.07.2016 11:28:26
Eike
Habe schon ein Lösung für das Problem gefunden. Hoffe das ist zulässig aber sieht ganz gut aus:
If IsDate(aF_Z(z, 4)) And IsDate(aF_Z(z, 5)) And _
aF_Z(z, 18)  0 Then
spD = aF_Z(z, 4) - Datum1
If spD aAG_OH(z, s + spD - 1) _
 + aAus(1, s): Next
End If
End If

ich denke, das paßt
26.07.2016 23:53:51
Michael
Hi Eike,
genau, Du addierst einfach dazu: das sollte so hinhauen.
Weiterhin viel Spaß & Grüße,
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige