Live-Forum - Die aktuellen Beiträge
Datum
Titel
23.04.2024 14:59:21
23.04.2024 14:47:39
23.04.2024 14:23:45
Anzeige
Archiv - Navigation
1472to1476
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

Zeiten berechnen, Datum abfragen, Spalten füllen

Zeiten berechnen, Datum abfragen, Spalten füllen
11.02.2016 14:46:58
Erik
Hallo Alle,
Hallo Michael,
Trotz Häckchen wollte meine letzte Beitrag nicht in die Offenheit. Hier aber den Link mit der Fragestellung und meine hochgeladene Datei:
https://www.herber.de/forum/archiv/1472to1476/t1472457.htm
Beste Grüße
Erik

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeiten berechnen, Datum abfragen, Spalten füllen
12.02.2016 11:06:54
Michael
Hallo Erik,
ich habe mir Deine Tabelle mal angesehen und denke, der einfachste (und für Dich übersichtlichste) Weg ist, je eine UDF für jede Spalte zu schreiben, also rechC, rechD usw. bis rechH.
Bevor ich mich aber dransetze, eine Frage: Fr, Sa und Feiertage sollen eine Sonderbehandlung bekommen, der So wohl nicht?!
Und: es wäre vielleicht nett, direkt neben dem Datum eine weitere Spalte einzufügen, die ein entsprechendes Kennzeichen enthält, ob es sich a) um einen "normalen" Wochentag, b) Fr/Sa/So oder c) um einen Feiertag handelt - das würde die bedingte Formatierung nämlich vereinfachen, mit denen Du die Wochenenden kennzeichnest, d.h. Du würdest dann dort nicht die Wochentag-Formel verwenden, sondern nur besagtes Kennzeichen abfragen.
Die simpelste Methode, einen Feiertag zu finden, ist z.B. in J11 (um nur irgendeine Spalte zu nehmen) die Formel: =ZÄHLENWENN(Feiertage!$B$2:$D$12;Kalender!A11)
Wenn Du sie runterkopierst, wird bei einem Feiertag jeweils eine 1 ausgegeben, sonst 0.
Also, bitte nochmal: was ist mit SO?
Schöne Grüße,
Michael

Anzeige
AW: Zeiten berechnen, Datum abfragen, Spalten füllen
12.02.2016 11:27:13
Erik
Hallo Michael,
Ja, es ist wirklich so, dass die Nacht von So auf Mo nur mit 2 berechnet wird.
Für den Feiertag wird die Nacht davor vergütet mit 2,5 , die Nacht von dem Feiertag auf dem darauf folgende „Nicht-Feiertag“ ebenso nur mit 2.
Mit der extra Spalte finde ich gut, vereinfacht die Sache!
Beste Grüße
Erik

Teillösung
12.02.2016 21:12:35
Michael
Hallo Erik,
ich habe die Hilfsspalte ganz links eingefügt, und die Formel ist analog zur Datumsanzeige kurzer Monate nicht durchgängig identisch (d.h. ab 29. anders).
Berücksichtigt werden Feiertage zum 1. des Folgemonats, nicht jedoch Feiertage zum Letzten des Vormonats (a) gibt es die nicht und b) interessiert ja nur die Zeit in der Nacht ZUM Feiertag).
Die Funktionen für die Spalten (die haben sich ja jetzt um eine nach rechts verschoben) D, E, G und I habe ich erledigt, aber F und H lasse ich mal.
Für F müßte man evtl. eine weitere Hilfsspalte einführen, denn in der neuen A sind nur die Nächte ZUM Feiertag markiert, nicht die Feiertage selbst. Man könnte auch die Formeln in A verfeinern, damit sie je nach Fall unterschiedliche, evlt. auch mehrere Buchstaben ausgeben.
Ich mache an diesem Punkt erst mal Schluß, weil das eine Geschichte ist, die Du mit etwas Phantasie anhand der vorhandenen Funktionen sicher selbst anpassen kannst und sollst - das ist freiwillige Forumsarbeit und kein Programmierauftrag.
Ein ganz anderer Fall ist die Spalte H mit der Arbeitszeitbeschränkung von 13-21, denn das richtig zu machen, würde denn doch erfordern, daß man die eingegebenen Zeiten händisch auseinanderdröselt und hinterher wieder zusammenrechnet: das "elegante" evaluate kann das so nicht.
Das ist machbar, überstrapaziert aber auch meinen guten Willen.
Ich würde vorschlagen, Du schnappst Dir mal die Datei: https://www.herber.de/bbs/user/103518.xlsm
Dann
- versuchst Du Dich mal daran, die Formel für F selbst hinzubekommen und
- fügst die Zahlen eines kompletten Monats ein, um zu sehen, ob das Vorhandene erst Mal paßt
- sehen wir weiter.
Schöne Grüße,
Michael

Anzeige
annähernd alles
13.02.2016 18:29:19
Michael
Hi Erik,
ich muß echt gestört sein, daß ich mir das "Bitgepfriemel" antue, aber gut, es ist interessanter als Sudokus...
Für die Spalte H sieht es nun so aus:
Function vonbisH(a1#, a2#, b1#, b2#) As Variant
' Formel aus
' http:// _
www.herber.de/forum/archiv/636to640/639927_Zeitueberschneidungen.html
vonbisH = WorksheetFunction.Max(0, WorksheetFunction.Min(b1, b2) - _
WorksheetFunction.Min(WorksheetFunction.Max(a1, a2), b1))
End Function
Function rechH(s As Variant, istSa As Variant) As Variant
Dim zarr#(1 To 10), znr&, z$, b$, w#, w2#
Dim p&
Const SaVon = 13, SaBis = 21
If InStr(istSa.Text, "Sa") > 0 And Len(s) > 3 Then
s = Replace(s, " ", "+")
s = Replace(s, ",", ".") & "!"
znr = 0
For p = 1 To Len(s)
b = Mid(s, p, 1)
If (b >= "0" And b  0 Then
znr = znr + 1
zarr(znr) = Val(z)
z = ""
End If
End If
Next
If (znr And 1) = 1 Then rechH = "#UNG": Exit Function
' falls Anzahl der Zeiten ungerade, Fehlermeldung "#UNG" und Ende
w2 = 0
For p = 1 To znr - 1 Step 2
w2 = w2 + vonbisH(zarr(p), SaVon, zarr(p + 1), SaBis)
Next
rechH = w2
Else
rechH = ""
End If
End Function
SaVon und SaBis wurden als Konstanten "zentral" definiert, das erleichtert etwaige Änderungen.
Allerdings kommt in G22 nicht 9, sondern richtig: 21 - 13 = 8 raus...
Die Datei: https://www.herber.de/bbs/user/103529.xlsm
(auf "März" stellen nicht vergessen)
Die verbleibende Spalte F machste nun aber wirklich selbst: im Prinzip brauchst Du ja nur die Differenz aus I und D zu nehmen, in einem geeigneten WENN.
Schöne Grüße,
Michael
P.S.: man könnte mal mit 10000 Datensätzen vergleichen, ob die "händische" Berechnung (in der Datei enthält rechH auskommentierte Teile, die die selbe Berechnung wie das evaluate machen und in Variable w stecken) schneller ist als das evaluate...

Anzeige
AW: annähernd alles
13.02.2016 21:09:53
Erik
Bester Michael!
würde Dich gerne auf mehr als nur eine Tasse Kaffee einladen wollen!
Ein herzlichen Dank für die handverlesene Version, werde mich jetzt gleich dran machen das Letzte dran zu häkeln!
Vielen, vielen Dank!
Erik

AW: annähernd alles
13.02.2016 21:35:57
Erik
Hi Michael,
habe sie grade aufgemacht und da waren die Feiertagen in März nicht mehr rot eingefärbt ...
Habe auch versucht die Weihnachtsfeiertage rot zu sehen, aber auch hier war nichts davon zu sehen ...
Was könnte vorliegen?
Schönen Abend, Michael!
Erik

mein Fehler!
14.02.2016 16:02:59
Michael
Hi Erik,
irgendwie waren in der Tabelle ein paar "graue" Felder, wo sie nicht hingehört haben, dann habe ich mir die Formatierung angesehen und einen Rattenschwanz von 10 Bed. Form. gesehen.
Ich habe gedacht, die sind als Nebeneffekt durchs Kopieren der Formeln entstanden und habe sie alle rausgelöscht und durch eine einzige ersetzt, die aber nur das Wochenende abfragt - sorry!
Daß da welche für Feiertage drinwaren, ist mir schlicht entgangen...
Beim Verformeln der Spalte A ist mir denn aufgegangen, daß da ja nicht die Feiertage direkt, sondern die Tage vor den Feiertagen reinmüssen, man kann aus dieser Spalte also nicht direkt die Feiertage ablesen...
Ich weiß jetzt auch nicht; kannst Du die Feiertags-Formatierung nicht ohne großen Aufwand aus einer alten Datei übernehmen?
Schöne Grüße,
Michael

Anzeige
AW: mein Fehler!
14.02.2016 21:49:02
Erik
Hi Michael,
glaube schon, dass ich das hinkriege!
Versuche es gleich!
Schönen Abendgruß
Erik

AW: mein Fehler!
17.02.2016 15:33:31
Erik
Hallo Michael,
das klappt alles wunderschön, die Feiertage habe ich auch wieder farblich zurückholen können!
Jetzt geht es noch um ein Paar Feinheiten:
Habe eine Spalte für Feiertage erstellt und belegt mit den Formel =WENN(ZÄHLENWENN(Feiertage!$B$2:$D$12;Kalender!B11)*1>0;"F";"")
Die Funktion wäre dann gleich rechG:
Function rechF(s As Variant, istF As Variant) As Variant
rechF = ""
If InStr(istF.Text, "F") > 0 Then rechF = rechD(s, "")
End Function
Damit habe ich aber in Spalte F und G die gleiche Ergebnisse stehen! Will natürlich, dass nur in Spalte F, und nicht in der Spalte G geschrieben wird, wenn es um ein Feiertag handelt, der auf einem Sonntag fällt. Wie könnte das bewerkstelligt werden?
Ein zweites Problem:
Samstag wird auch wunderschön berechnet! Hier ist es aber so, wenn ich zB. 9-12 herein schreibe, dass es mit 0,00 quittiert wird. Kannst Du mir das herausholen, sowie Du das auch gemacht hast in D, wenn die Zeichen weniger als 3 sind? WENN(Endzahl Das letzte Problem gilt die bedingte Formatierung: Obwohl Ostern auf einem Sonntag fällt, färbt sich der Tag nicht Rot, sondern Grau.
Die Wochenenden Sa/So werden in die bedingte Formatierung Grau hinterlegt durch den Formel =WOCHENTAG($B3;2)>5, für die Einfärbung der Feiertage gilt =ISTZAHL(VERGLEICH($B3;BEREICH.VERSCHIEBEN(Feiertage!$B$2:$B$17;0;$C$2-2015);0))
Wie kann ich hier die Anweisung geben, dass, wenn der Feiertag auf einem Sonntag fällt, dann färbe ihn bitte auch rot!
Für Deine Hilfe bedanke ich mich von Herzen!
Erik

Anzeige
AW: mein Fehler!
17.02.2016 16:04:52
Michael
Hallo Erik,
freut mich, daß Du die Formatierung hinbekommen hast. Es kommt wohl auf die Reihenfolge der dort hinterlegten Formeln an: wenn "oben" grau gefärbt wird und "unten" rot, hat das grau die höhere Priorität.
Nachdem Du aber schon die Feiertage in einer extra Spalte ermittelst, kannst Du die Formel für die Formatierung der Feiertage gleich "auf diese Spalte setzen", also etwa, wenn das die Spalte "X" wäre, dann so: =X3="F". (warum eigentlich 3? in meiner Beispieldatei beginnen die Tage in Zeile 11)
Man könnte auch beide Formatierung explizit ausformulieren mit UND:
1. Wochenende ohne Feiertag: ~f~=UND(WOCHENTAG($B3;2)>5;X3"F")~f~
2. Wochenende mit Feiertag: ~f~=UND(WOCHENTAG($B3;2)>5;X3="F")~f~
usw.
Das mit dem Samstag verstehe ich nicht: das ist doch, was Du wolltest, daß NUR Stunden gerechnet werden, die zwischen 13 und 21 Uhr liegen, und 9-12 liegt eben NICHT in diesem Bereich?!
Wenn es bei Feiertagen nicht in G stehen soll, kannst Du die dortige Funktion ändern und zusätzlich die Spalte mit dem "F" abfragen:
Function rechG(s As Variant, istSo As Variant, istF as variant) As Variant
rechG = ""
If InStr(istSo.Text, "So") > 0 And istF  "F" Then rechG = rechD(s, "")
' warum nicht vorhandene Funktionen mehrmals benutzen?
End Function
und natürlich im Tabellenblatt den weiteren Parameter für die Spalte mit den Feiertagen eingeben.
Mir stand jetzt keine aktuelle Datei zur Verfügung, also hoffe ich, daß ich Dir helfen konnte.
Schöne Grüße,
Michael

Anzeige
AW: mein Fehler!
17.02.2016 17:50:07
Erik
Das mit dem Samstag verstehe ich nicht: das ist doch, was Du wolltest, daß NUR Stunden gerechnet werden, die zwischen 13 und 21 Uhr liegen, und 9-12 liegt eben NICHT in diesem Bereich?!
Und weil es nicht in diesem Bereich liegt, soll in H auch nichts, also kein 0,00, geschrieben werden. Hier liegt der Hasen im Pfeffer!
Wenn ich also am Samstag von 9-12 arbeite kommt logischerweise nur in Spalte D 3,00. Wenn also die letzte Zahl von der Eingabe zB. 9-12, hier also 12, also kleiner als 13 ist, soll in H eben nichts, also auch kein 0,00 eingeschrieben werden. Habe ich mich jetzt verständlicher ausgedruckt?
Jetzt habe ich die Spalte "Feiertage" hinter die Spalte I gesetzt, also in J um alles erstmal auszuprobieren. Jetzt würde ich aber gerne sicher gehen und diese Spalte hinter A setzen wollen. Damit würde wiederum alle Spalten eine Spalte weiter rücken, sowie wir es schon hatten. Könnte ich dass ohne Konflikte machen, also die Funktionsnamen alle um eine Buchstabe erhöhen?
Du hast die Spalte A mit den J-Einträge mit #.##0,00 ; - #.##0,00 ; @ formatiert, ist das richtig, sollte die nicht als Text formatiert sein?
Vielen Grüße!
Erik
PS. Ein ganz andere Frage: Meine Beiträge werden alle von meinen Vor- und Nachname begleitet, ist es auch möglich, dass nur mein Vornamen erscheint?

Anzeige
ach so,
17.02.2016 20:47:12
Michael
jetzt hab ich's verstanden.
Da ersetzt Du am Ende von RechH
 ' die nächste Zeile...
rechH = w2
Else
rechH = ""
End If
End Function

' durch die hier:
If Round(w2 * 100, 0) = 0 Then rechH = "" Else rechH = w2
Else
rechH = ""
End If
End Function

If w2=0 würde auch reichen, aber bei Berechnungen mit Dezimalzahlen weiß man ja nie.
Die Spalte A habe ich nicht "aktiv" formatiert, das muß ein Relikt von ich weiß nicht sein, vielleicht durch das Einfügen der neuen Spalte aus der nach rechts verschobenen automatisch übernommen. Ich würde sie (und die noch neu einzufügende mit "F") schlicht als Standard lassen.
Das Einfügen der Spalte sollte eigentlich gar keine Änderungen erfordern, da sich unsere Funktionen immer nur auf die Zelle beziehen, in der sie stehen, und Werte verarbeiten, die sie übergeben bekommen - letztere werden ja von Excel beim Einfügen automatisch angepaßt.
Klar, nach dem Einfügen steht dann z.B. =rechE(...) in Spalte F, aber die Namen sind eigentlich egal, ich habe sie nur so gewählt, weil es während der Programmierung übersichtlicher ist. Soll heißen, wenn bis auf das Einfügen der Spalte so gut wie alles erledigt ist, würde ich mir die Arbeit sparen.
Also, dann viel Spaß weiterhin,
Grüße,
Michael
P.S.: Den Namen kannste doch hier eingeben:
Userbild

Anzeige
Noch was Kleines?
18.02.2016 07:48:18
Erik
Guten Morgen Michael!
Es ist wie vom Zauberhand ... kaum hat man ein Eintrag mit Enter bestätigt und schon sitz alles auf seinem Platz!
Danke!
Noch ein Kleinigkeit, ich hoffe zumindest, dass es eine ist: die Formel in Spalte A haben wir für jeden Monat, egal ob es 28, 30 oder 31 Tage hat ganz nach unten gezogen. Damit gibt sie, wenn eine Monat zB. nur 30 Tage hat, dem nicht existierende 31. ein #WERT zurück. Könntest Du diese Formel mit den Monaten entsprechend wachsen, bzw. schrumpfen lassen, sodass sie kein #WERT mehr ausgibt?
Fröhlichen Tag!
Erik

Noch was Kleines?
18.02.2016 08:04:43
Erik
PS. Bei den andere Funktionen macht es nichts aus, da, wenn sie nicht betätigt werden auch nichts herausgeben, da muss ich nur die kleine Häckchen entfernen.
grüß
Erik
Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige