Negative Zeiten in Excel via vba in ein anderes Tabellenblatt übertragen?
Hallo! Ich habe folgendes Problem: Ich habe eine Zeiterfassungsübersicht erstellt, die so aufgebaut ist, dass es für jedes Monat ein Tabellenblatt gibt. Über ein eigenes Administrationsblatt kann ich über ein Makro einen Vorgang anstoßen, der die Datei für das Folgejahr als neue Datei aufbereitet und auch die Endsalden als Anfangssaldo in das neue Jahr übertragen soll.
Das funktioniert alles so weit gut bis auf ein Problem: zum Jahresende ergeben sich oft negative Zeitenstände. Versucht man nun, diese mittels VBA zu übertragen, werden die Werte willkürlich verändert und stimmen damit nicht mehr überein. Wie kann ich das ändern?
Mit anderen Worten, ich würde ein Skript benötigen, mit dem man den Wert aus einer Zelle (= Endstand per 31.12) mittels Makro als Anfangsbestand per 01.01. einträgt.
Worksheets("Einstellungen").Range("E24") = Worksheets("Dezember").Range("R46")
Wert per 31.12. ==> -670:40 wird zu -16:25 per 01.01.
funktioniert leider nicht wie gewünscht.
Für jeden Tipp bin ich dankbar! 🙂
2 Antworten
Ich kann den Fehler bei mir leider nicht rekonstruieren. Wenn ich über VBA die -670:40 Stunden von einem Tabellenblatt ins andere kopiere, kommen da auch die -670:40 Stunden an (bzw. -27,944444 Tage, wenn man das Format noch nicht eingestellt hat)
Was ich mir vorstellen kann ist, dass Excel sich beim Kompilieren des Codes irgendwo verschluckt hat. Ich hab damals ziemlich viel in Access VBA programmiert und da gab es die Option, dass man die Datenbank mit dem Befehlszeilenparameter /decompile öffnen konnte. Dadurch hat VBA den ganzen kompilierten Code gelöscht und alles neu kompiliert. Das hat meistens geholfen. Bei Excel gibt es die Option leider nicht.
Probiere mal, ob es über den manuellen Weg geht. Also du nimmst dir eine neue Excel-Datei und kopierst die Tabellenblätter und die Quellcodes da rüber. Dann wird der Code einmal frisch kompiliert und es könnte sein, dass es danach wieder wie gewohnt funktioniert.
Sheets("Tabelle2").Range("A1") = Sheets("Tabelle1").Range("B1")
Im Direktbereich. Also vom Code im Prinzip das, was du auch gemacht hast, nur eben ohne eine umfangreiche Tabelle zu haben.
Ich hatte in A1 die 670:40 Stunden stehen und in B1 die Formel =-A1
Hab vorher auch versucht in A1 direkt die -670:40 einzugeben, aber da hat Excel dann versucht, die Zeilen 40 bis 670 zu negieren und als Matrixformel auszugeben, was aber zu einem Überlauf-Fehler geführt hat, weil das Ergebnis natürlich nicht in 40 Zeilen gepasst hätte.
Ja, genau das hatte ich auch. Ich habe das Szenario in einer anderen Datei nachgestellt, da hat es problemlos funktioniert. Ich wollte auch die Tabellenblätter in eine neue Datei kopieren, aber das wäre relativ kompliziert, weil ich da ziemlich viele Formatierungen, unterschiedliche Spaltenbreiten usw. habe. Ich bekomme leider auch keine wirklich aussagekräftige Fehlermeldung. Kann ich Dir ev. per PN schreiben?
Dank Deiner Hilfe habe ich es schlußendlich geschafft! Das Problem war nicht die Codezeile mit dem Kopieren, sondern die Reihenfolge im Code! Jetzt funktioniert es! Vielen Dank nochmals! 🙂👍
Moin,
(Nein, ich kann dir eher nicht helfen, VBA ist weniger mein Fall!)
nur so als Neugier: Wie machst du deine Negativen Zeiten denn ?
Über 1904 Datumsformat oder über Text und Rechentricks (Also über Formeln ?
Grüße
Moin,
dann muss die neue Tabelle natürlich auch 1904 Datumsformat haben und auch die Variable in VBA mit der du das überträgst muss das auch können! ..
Grüße
So schlau war ich auch, aber ich wüsste nicht, was das 1904 Format mit der Deklaration einer Variable zu tun haben sollte.
Moin,
dann weist du bestimmt das folgende auch:
Excel speichert alle Datumswerte als Zahlen. Im Normaler Format werden sie von 1900 an gerechnet und im 1904 Format halt von 1904 an. (Neben den möglichen Zusatzfunktionen) Diese Zahl muss genauso in eine Variabel übertragen werden und dann genauso in die neue Excel-Tabelle kommen um dort wieder genauso interpretiert zu werden. Wird die Zahl auf den Weg irgendwie umgewandelt und dann bei der nächsten Umwandlung falsch umgewandelt, kommt etwas anderes raus. (Das müsstest du vielleicht überprüfen, z.B. in dem du dir in allen Schritten deines Script ein dir bekanntes Ergebnis per MSGBox ausgeben lässt!) ...
Grüße
Wie hast Du den Befehl va VBA programmiert?