Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Unterschiedliche Ausführung von Makros auf unterschiedlichen Rechnern





Frage

Hi! ich habe eine Exceltabelle, in der nacheinander viele verschiedene Datenpaare aufgeführt sind. Diese enthalten jeweils bestimmte Zeiten. Anhand dieser Zeiten wird mittels eines Makros eine bestimmte Dauer nach verschiedenen Regeln extrahiert und in die nächste Spalte eingetragen. Die jeweiligen Datensätze werden durch markieren ausgewählt. Das funktioniert bisher auch alles prima. Allerdings habe ich jetzt folgendes Problem: Auf meinem Rechner, wo ich das ganze programmiert habe, läuft das ganze fehlerfrei. Allerdings ist das Makro nicht für mich, sondern für jemand anderen. Und bei dem funktioniert das Makro leider nur [b]teilweise[/b]. D.h., ich habe demjenigen das Makro als exportierte Datei gegeben. Er fügt es bei sich in die Exceltabelle ein, aber es klappt nicht immer. Daraufhin hat er mir diese Datei einmal mit [b]bereits eingefügtem[/b] Makro per Mail geschickt und ich habe die Berechnung bei mir durchgeführt. Und siehe da, es klappt. Der Fehler ist, dass statt der korrekten Dauer einfach ein 0 eingetragen wird. Die Excel Versionen sind auch (so gut wie) gleich: auf meinem Rechner: Excel 2002 (10.6789.6735) SP3 auf dem anderen Rechner: Excel 2002 (10.6501.6714) SP3 Ich habe leider überhaupt keine Ahnung, woran das liegen kann, da der Code offensichtlich identisch ist. Ich kann mir auch nicht vorstellen, dass es an den minimal unterschiedlichen Versionen liegt. Weiß da jemand vielleicht einen Rat?

Antwort 1 von CaroS

Hallo Medarion,

kannst Du das Makro und ein paar Beispieldaten dazu hier mal angeben? Vielleicht liegt die Ursache ja im Makro und nicht in den Excel-Versionen. Wird in dem Makro auf andere Excel-Dateien oder externe Dateien, Ordner usw. zugegriffen?

Es gibt noch einiges mehr, was man mal überprüfen könnte, aber mit einem Blick auf das Makro wüsste man wenigstens, in welche Richtung das Ganze geht. So ist es ein ziemlicher Blindflug.

Gruß,
CaroS

Antwort 2 von Medarion

Hi!

Ist okay. Ich habe jetzt eine Beispieldatei hochgeladen:

http://oemi.xail.net/publicfiles/Mappe1.xls

Die Originaldatei konnte ich nicht hochladen, da die Daten doch ein wenig zu sensibel sind. Das Makro ist in der Datei enthalten.
Ich hoffe, der Code ist nicht zu umfangreich.

Schon mal vielen Dank!

Achso: ich greife nur auf die Exceltabelle selbst zu.

Mfg
Meda

Antwort 3 von CaroS

Hallo Medarion,

ich bin jetzt an dem Punkt angekommen, wo ich die genauen Regeln für die Nachtarbeitsabschläge bräuchte, aber leider nicht kenne.

Ich weiß nicht, ob ich dem 100-prozentig vertrauen soll, was ich aus Deiner Funktion Berechnen() herauslese. Sollden denn sämtliche Arbeitszeit außerhalb des Bereichs 22:00 Ur bis 6:00 Uhr praktisch auf Null (= nicht gearbeitet) gesetzt werden?

OK, ich kenne den Zweck Deiner Berechnungen nicht im geringsten, vielleicht soll ja wirklich nur der Arbeitszeitanteil berechnet werden, der zwischen 22:00 Uhr und 6:00 Uhr liegt, aber dann hätte jemand, der von 7:00 Uhr bis 19:00 Uhr (abzüglich Pausen) gearbeitet hat, theoretisch überhaupt nicht gearbeitet.

Ja, was machen wir jetzt? Es ist kurz vor 2 Uhr, die Chancen, jetzt von Dir eine Antwort zu bekommen, sind wohl eher gering, aber ich bin die nächsten 2 Tage wahrscheinlich nicht am Rechner.

Na, ich schick das erstmal ab und mache dann noch ein bisschen weiter, wie ich mir das denke.

Bis dann!
CaroS

Antwort 4 von CaroS

Hallo Medarion,

ich habe noch ein paar kleine Fragen. Dazu erstmal die Übersicht, was es theoretisch für Arbeitszeiten (NNN=Nachtarbeitszeiten, AAA=Abschlagszeiten) geben könnte.

Ist ja klar, dass oben drüber die Uhrzeiten stehen und " ...
-24|0-
... " Mitternacht ist.
--M(1) heißt: Mitternacht liegt nicht in der Arbeitszeit - 1 Punkt
+M(0) heißt: Mitternacht liegt in der Arbeitszeit - kein Punkt
AE<NE heißt: Arbeitsende vor dem Nachtende (6:00 Uhr) - wenn ja: 1 Punkt (bei 1 u. 8)
NB<AB heißt: Nachtbeginn (22:00 Uhr) vor dem Arbeitsbeginn - wenn ja: 1 Punkt (7 u 8) = kA(2) heißt: keine Abschläge, wenn insgesamt 2 Punkte
= Ab(1) oder = Ab(0) heißt: Abschläge, wenn weniger als 2 Punkte
(Das Punktesystem brauchst Du erstmal nicht verstehen, das dient mir nur zur Vereinfachnung der Logik. Immerhin gibt es 8 oder 9 Fälle zu unterscheiden.)

 |0----6|6---22|22--24|0----6|6---22|

1|-NNNN-|------|------|------|------|
--M(1) + AE<NE(1) + NB<AB(0) = kA(2)
2|-NNNNNNAAAAA-|------|------|------|
--M(1) + AE<NE(0) + NB<AB(0) = Ab(1)
3|-NNNNNNAAAAAANNNNNN-|------|------|
--M(1) + AE<NE(0) + NB<AB(0) = Ab(1)
4|------|-AAAA-|------|------|------|
--M(1) + AE<NE(0) + NB<AB(0) = Ab(1)
5|------|-AAAAANNNNNN-|------|------|
--M(1) + AE<NE(0) + NB<AB(0) = Ab(1)
6|------|-AAAAANNNNNNNNNNNNN-|------|
+M(0) + AE<NE(0) + NB<AB(0) = Ab(0)
7|------|------|-NNNN-|------|------|
--M(1) + AE<NE(0) + NB<AB(1) = kA(2)
8|------|------|-NNNNNNNNNNN-|------|
+M(0) + AE<NE(1) + NB<AB(1) = kA(2)
9|------|------|-NNNNNNNNNNNNNAAAAA-|
+M(0) + AE<NE(0) + NB<AB(0) = Ab(0)

Und dazu noch die Erläuterungen, was im "Diagramm" mit NNNAAANNN gemeint ist

1) Arb.-Beginn liegt zw. 00:00 und 06:00 Uhr … Arb.-Ende liegt zw. 00:00 und 06:00 Uhr
2) Arb.-Beginn liegt zw. 00:00 und 06:00 Uhr … Arb.-Ende liegt zw. 06:00 und 22:00 Uhr
3) Arb.-Beginn liegt zw. 00:00 und 06:00 Uhr … Arb.-Ende liegt zw. 22:00 und 24:00 Uhr
4) Arb.-Beginn liegt zw. 06:00 und 22:00 Uhr … Arb.-Ende liegt zw. 06:00 und 22:00 Uhr
5) Arb.-Beginn liegt zw. 06:00 und 22:00 Uhr … Arb.-Ende liegt zw. 22:00 und 24:00 Uhr
6) Arb.-Beginn liegt zw. 06:00 und 22:00 Uhr … Arb.-Ende liegt zw. 00:00 und 06:00 Uhr
7) Arb.-Beginn liegt zw. 22:00 und 24:00 Uhr … Arb.-Ende liegt zw. 22:00 und 24:00 Uhr
8) Arb.-Beginn liegt zw. 22:00 und 24:00 Uhr … Arb.-Ende liegt zw. 00:00 und 06:00 Uhr
9) Arb.-Beginn liegt zw. 22:00 und 24:00 Uhr … Arb.-Ende liegt zw. 06:00 und 22:00 Uhr

Nummer 4 wäre also eine reine Tagesschicht, alle anderen haben (teilweise) irgendwelche Nachtarbeitszeiten. Das muss man in Fallunterscheidungen berücksichtigen und richtig berechnen, und dabei geht es dann darum, welche Arbeitsstunden wegfallen und welche nicht.

Ja und genau das sind meine Fragen: Welche Fälle (1 - 9) gibt es und welche nicht (Tagesschicht?). Welche Arbeitsstunden werden als Abschlag abgezogen?

Du kannst Dir ja zwecks Antwort dieses "Diagramm" (von [code ] bis [/code ]) kopieren und darin (mit NNN und AAA) eintragen, was zählt und was nicht.


[code ]
 <- Leerzeichen löschen!
_|0----6|6---22|22--24|0----6|6---22|
1|-????-|------|------|------|------|
2|-???????????-|------|------|------|
3|-??????????????????-|------|------|
4|------|-????-|------|------|------|
5|------|-???????????-|------|------|
6|------|-??????????????????-|------|
7|------|------|-????-|------|------|
8|------|------|-???????????-|------|
9|------|------|-??????????????????-|
[/code ] <- Leerzeichen löschen!

Schönes Wochenende!
CaroS

Antwort 5 von CaroS

Hallo Medarion,

kurz noch zu der ursprünglichen Frage: ich habe nichts gefunden, womit man erklären könnte, warum das Makro auf verschiedenen Rechnern unterschiedliche Ergebnisse liefert. Der einzige heiße Tipp wäre, dass es an den verarbeiteten Daten liegt. Habt Ihr das mal mit genau denselben Daten probiert oder nimmt da jeder, was er gerade hat?

Ich habe jetzt also versucht rauszufinden, wann und warum es zu falschen Null-Ergebnissen kommt. Aber da in Deiner Exceldatei ja sowieso nur wenige oder gar keine Fehler auftreten, wie Du schreibst, sind die Voraussetzungen natürlich auch nicht besonders gut, einen Fehler zu finden. Wo nix is ...

Deine Datums-Akrobatik ist allerdings bemerkenswert. Da ich sie nicht völlig durch-schaue, habe ich recht schnell angefangen, sie ein wenig zu vereinfachen. Dabei muss ich natürlich aufpassen, dass ich nichts wesentliches weglasse und keine Regeln verletze, die ich aber leider nicht kenne. Deshalb geht es jetzt erstmal nicht weiter.

Da das ganze mit derzeit 86 VBA-Zeilen (bei mir) sehr überschaubar ist, bin ich aber ziemlich optimistisch, dass sich da ein (wahrscheinlich Denk-)Fehler, falls vorhanden, nicht mehr allzu lange verstecken kann.

Für den - aus meiner Sicht bedauerlichen - Fall, dass sich das ganze Problem in den nächsten 2 Tagen plötzlich in Luft auflöst, möchte ich nur sagen, dass ich trotzdem an den Abschlags- und Nachtarbeitszeit-Regeln interessiert wäre. Es ist einfach schöner, ein Problem als fertig gelöst zur Seite zu legen. Ich würde meine Version dann auf jeden Fall auch hochladen.

Gruß,
CaroS

Antwort 6 von fürLau

Hallo

Geb´ ´mal meinen Senf dazu:
Excel an Sich hat ja ungezählte Einstellungsmöglichkeiten, angefangen bei den Datums-Optionen, geladene AddInns bis hin zur Fehlerabarbeitung. Denkbar wäre auch noch eine Winzigweiche(M$) Fehlerbeseitigung (Servicepack) die durch die unterschiedlichen Releasestände auftritt.
Letztendlich könnte auch noch eine Windows Einstellung dafür verantwortlich sein.

Ich rate daher immer
vba | Extras | Optionen | Editor
  • Variablen deklaration erforderlich!

    vba | Extras | Optionen | Allgemein
  • Bei jedem Fehler unterbrechen

    und auf dem Zielsystem debuggen....
    Gruß[h3]{[h1]Ó¤[sup...fürLau
    Signatur wurde ganz und gar ohne SNTool erstellt.

  • Antwort 7 von Medarion

    So. Jetzt komme ich endlich mal wieder dazu, zu antworten. Sry, aber ich war am Wochenende nicht da und heute hatte ich Schule, na ja.

    @CaroS:
    Ok, ich muss zugeben, dass die Regeln vielleicht ein wenig verwirrend sind. Allerdings hast du schon ganz richtiig vermutet: es geht in den Tabellen lediglich darum, herauszufinden, wie viel Nachtarbeits-Zuschläge der Person gezahlt werden müssen(zumindest ist das die einzige Aufgabe für das Makro).

    Es geht also darum:
    Der Zeitkorridor für Nachtarbeit geht von 22:00 abends bis morgens 6:00.
    Nach 6h Arbeit wird zwangsläufig eine Pause gemacht, die immer abgezogen werden muss.
    Die gesamte Arbeitszeit, die sich nicht innerhalb des Zeitkorridors befindet, wird nicht berücksichtigt, auch nicht bei den Pausen.

    Ich glaub soweit war das ja schon alles klar.

    Nun muss ich zugeben, dass ich noch immer nicht ganz durch deine Fromeln, Funktionen oder was auch immer durchblicke, was du in Antwort 4 gepostet hast.
    Die Grafik war allerdings vollkommen richtig. Allerdings kann ich leider nicht sagen, welcher der Fälle, die du aufgeführt hast, auftreten können. Mir fehlen dafür die Informationen, d.h. ich muss damit rechnen, dass jeder einzelne Fall auftreten kann. Nur kann ich leider nicht den Sinn in der Fallunterscheidung erkennen, da es doch eigentlich nicht von Belang ist, wie die Arbeitszeit verteilt ist, da doch sowieso nur die Zeit innerhalb des Nachtarbeitskorridors interessiert, oder nicht?

    Außerdem ergibt sich durch die gegebenen Daten noch ein weiteres mehr oder weniger großes Problem:
    ich kann nicht voraussetzen, dass in den Zeitangaben auch Datumsangaben enthalten sind. Daher kann man nicht wissen, ob 6:00 nicht vielleicht später ist als 17:00, weil sich die 17:00 auf den Vortag bezieht. Daher habe ich den Kompromiss eingehen müssen, dass ich alle Zeiten, die später sind als 16:00, um einen Tag verringere. Das ist zwar keine optimale Lösung und es wäre sicher besser diese Änderung erst nach einem Vergleich mit der zweiten dazugehörigen Zeit vorzunehmen, aber bei den vorliegenden Daten schien es immer zu funktionieren. Ok, an dieser Stelle wird die Fallunterscheidung natürlich wieder sinnvoll.
    Eng damit zusammen hängt auch meine „Datumsakrobatik“ ^^ .
    Wen man die gegeben Zeiten in dezimale Werte umrechnet, kommt man zu dem Ergebnis, dass 00:00 genau der ’0’ entspricht. Wenn ich nun die Zeit von beispielsweise 17:00, die ungefähr der Zahl 0,7083 entspricht, um einen Tag verringere, erreiche ich den negativen Zahlenbereich. Das bringt aber ein Problem mit sich: Ab der 0 werden die Stunden in umgekehrter Reihenfolge verringert.
    D.h.: 0,7083 ist zwar -0,29167, aber die resultierende Zeit ist nicht etwa 17:00 des vorherigen Tages, sondern 07:00.
    Daher erhöhe ich vorsorglich alle Zeiten um einen Tag.
    Noch ein Wort zu den Exceptions: sie geben an, dass der jeweilige Tag nicht gezählt wird. Daher werden die Zeiten einfach auf 0 gesetzt.

    @fürLau:
    Ja das könnte sein. Allerdings, wird das mit dem Debuggen auf den Zielsystem schwierig, weil ich da keinen Zugriff habe. Leider könnte es auch schwierig werden, die Updates nachzuinstallieren, da das Konto beschränkt ist und ursprünglich nicht einmal Makros zuließ.
    Im Übrigen habe ich vorher noch eine wesentlich ältere Version von Excel gehabt. Noch nicht mal SP3. Nach den Updates hat sich bei mir allerdings nichts geändert.


    So. Ich danke euch erstmal für eure Antworten und hoffe ich hab alle offenen Fragen soweit beantwortet. Vielleicht fällt euch ja noch eine Lösung ein!

    Mit freundlichen Grüßen
    Medarion

    Antwort 8 von CaroS

    Hallo Medarion,

    hier sind erstmal meine Änderungsvorschläge, enthalten in Modul2:

    http://www.netupload.de/detail.php?img=23a4c40a499ec9152aee37bbb2ed...

    Modul2 enthält einen kompletten Makrosatz (Sub Arbeitszeit2() und zugehörige Funk-tionen). Alles ist ähnlich strukturiert wie bei Dir und sollte leicht nachzuvollziehen sein.

    2 Kleinigkeiten, die sich u. U. negativ auswirken könnten, habe ich noch gefunden:
    1. Du deklarierst und verwendest eine Private Function Round(...) As Double, obwohl es eine gleichnamige (System-)Funktion in VBA gibt. Reservierte Namen sollte man nicht benutzen.
    2. In einem Fall (Zeile 32: 23:30 - 6:30) hat Excel mehrmals einen Rechenfehler gemacht. Der Date-Wert 5:30, der ja intern als Dezimalbruch 11/48 dargestellt wird, ergab nach der Multiplikation mit 24 nicht genau 5,5, sondern 5,500000...001 und das führte in der Rundungsfunktion zu einem unerwünschten Aufrunden auf 6,0.

    Ansonsten habe ich den Code nach meinem eigenen Ermessen mehr oder weniger stark vereinfacht und dabei auch Berechnungsschritte verändert. Es wäre nun ganz interessant, ob dieser Code auf dem anderen Rechner auch zu falschen Ergebnissen führt.

    Z. B. habe ich die Berechnung der Anzahl der Pausen weggelassen, da ich davon ausgegangen bin, dass in einer Arbeitsschicht maximal 8 Nachtstunden anfallen und es daher höchstens eine 30-min-Pause in dieser Zeit geben kann. Wenn als Ausgangswert eine Dauer > 6 Stunden vorliegt, dann nehme ich als abrechenbare Nachtarbeitszeit - hier mal vereinfacht ausgedrückt - MAX(Dauer - 30 Minuten; 6 Stunden).

    Ich habe außerdem angenommen - und im Code kommentiert -, dass bei einer Nachtschicht vom Abend des ersten Tages über Mitternacht bis zum Morgen/Vormittag des Folgetages der Arbeitsbeginn am ersten Tag nicht vor 6:00 Uhr liegt und daher in dieser Zeit auch keine Nachtstunden anfallen.

    Insgesamt ist aber festzustellen, dass Dein und mein Makro für alle vorhandenen Beispiele (Spalten 1 und 2) jeweils übereinstimmende Ergebnisse liefern und ich daher nicht behaupten kann, dass Dein Makro in irgendeiner Weise falsch wäre. Ob man das, was ich als "Datums-Akrobatik" bezeichnet habe, als (unnötig) kompliziert empfindet, ist eine Frage des persönlichen Geschmacks und daher zweitrangig, solange man darin keinen Fehler nachweisen kann.

    Um möglicherweise doch noch irgendwelche Unterschiede und Fehler zu finden, die sich aus ungünstigen Daten bzw. aus dann doch falscher Verarbeitung dieser ungünstigen Daten ergeben, müsste man noch viel intensiver mit verschiedenen Beispieldaten testen als ich das bisher machen konnte. Allerdings wäre das zu tun vor allem da sinnvoll, wo bisher schon abweichende Ergebnisse aufgetreten sind, und nicht, dass wir beide uns hier ´nen Wolf testen und in alle Ewigkeit feststellen, dass unsere beiden Rechner doch immer nur dieselben Ergebnisse liefern.

    Bleiben ansonsten nur noch die Feinheiten in der Installation, den Versionen, Servicepacks und in den Einstellungen, auf die fürLau hingewiesen hat. Da kenne ich mich aber doch nicht so gut aus, so dass ich hier nur (bestensfalls zum Vergleich) meine Excel/Office-Version angeben kann: Excel 2002 (10.6789.6735) SP3.

    Gruß,
    CaroS

    Antwort 9 von Medarion

    Hi,

    ja, ich glaube, das ist um einiges effizienter. Ich werde das neue Makro bei Gelegenheit und so schnell wie möglich ausprobieren.
    Ich schreibe dann, obs klappt.

    Ich habe noch eine andere Theorie: es könnte doch sein, dass in genau der Version, die derzeit auf dem betreffenden Rechner ist, ein klitzekleiner Fehler in der Makroausführung ist, der in folgenden Versionen behoben wurde. Das heißt, wenn dort Excel wieder einmal geupdatet werde würde, könnte es sein, dass das ganze wieder funktioniert. Leider habe ich keinen Einfluss auf die Updates :(

    Ok, dann erst mal vielen Dank für die Mühe. Mal sehen, was weitere Tests ergeben.

    Bis dahin

    Medarion

    Antwort 10 von Medarion

    Juhu!
    Dein Makro funktioniert auch auf dem Zielrechner!

    Ich konnte das Makro jetzt auch auf dem anderen Rechner testen und es geht einwandfrei. Dabei ist mir allerdings etwas aufgefallen: mein Makro hat immer dann versagt, wenn der Arbeitsbeginn genau 16:00 war. Eigentlich war die Bedingung in meinem Code, dafür, dass eine Uhrzeit um einen Tag zurückgestuft wird, x >= 16:00. Aber aus irgend einem Grund, vielleicht durch irgendeine Einstellung ausgelöst, wird diese Anweisung auf dem Zielrechner als x > 16:00 interpretiert. Denn an einem Tag waren mehrere 16:00 Anfangszeiten, außer in inem Fall, wo erst 20:00 angefangen wurde. In allen Fällen versagte mein Makro, nur bei dem 20:00 Eintrag arbeitete es.
    Das heißt der Fehler ist jetzt erstmal gefunden.
    Mich würde noch interessieren: wie hast du das mit den Zeiten gelöst? Dein Makro versteh ich mämlich an dieser Stelle nicht wirklich.

    Medarion

    Antwort 11 von CaroS

    Hallo Medarion,

    erstmal freut es mich natürlich, wenn meine Änderungen geholfen haben. Dass ich dabei an manchen Stellen sehr "nah" an Deinem Code geblieben bin und an anderen Stellen auch mal einen ganz anderen Denkansatz gewählt habe, hast Du ja auch mitbekommen.

    [Fortsetzung im Pager, das interessiert hier wahrscheinlich wirklich niemanden.]

    Ich melde mich.

    Schönes Wochenende!
    CaroS

    Ich möchte kostenlos eine Frage an die Mitglieder stellen:


    Ähnliche Themen:


    Suche in allen vorhandenen Beiträgen: