Supportnet / Forum / Tabellenkalkulation
Makro kopieren
Frage
Hi Leute!
Brauchte bei folgendem Problem eure Hilfe. Aus der Tabelle B; Spalte S; Bereich (S7:S120) werden die Daten nach Tabelle A; Spalte B; Berich (B8:B120) kopiert werden, welche folgendes Makro auch durchführt:
Sub Spalte_kopieren()
Sheets("B").Columns("S").Copy
Sheets("A").Cells(1, Sheets("A").Range("IV1").End(xlToLeft).Column + 1).PasteSpecial Paste:=xlPasteValues
End Sub
Das Problem ist jedoch das die Werte von Tabelle B, Spalte S, Bereich (S7:S120) täglich aufgrund der Formel die in S7 steht (P8-R8)*10000 und des aktuellen Datums angepasst werden. Jetzt möchte ich die heutigen Werte von der Tabelle B; Spalte S, Bereich S7:S120 in der Tabelle A, Spalte (B), Bereich(B8:B121) fixieren und die Werte die morgigen Werte aus Tabelle B; Spalte S, Bereich S7:120, danaben in Tablle A, SpalteC, Bereich (C8:C120) eingetragen werden um mir somit ein Archiv dieser Werte über einen längeren Zeitraum schaffen zu können.
Besten Dank im Voraus
AF
Antwort 1 von Saarbauer
Hallo,
ich würde an deiner Stelle die neusten Daten immer in Spalte A lassen und die von gestern lach rechts verschieben bis diese in der letzten Spalte IV sind.
Dazu müsstest du vor dem Umspeichern nur eine Neue Spalte einfügen und wenn alle Spalten voll sin die letzte Spalte vorher löschen.
Gruß
Helmut
ich würde an deiner Stelle die neusten Daten immer in Spalte A lassen und die von gestern lach rechts verschieben bis diese in der letzten Spalte IV sind.
Dazu müsstest du vor dem Umspeichern nur eine Neue Spalte einfügen und wenn alle Spalten voll sin die letzte Spalte vorher löschen.
Gruß
Helmut
Antwort 2 von JoeKe
Hallo Anfänger,
dein Code macht doch das was du möchtest! Beim ersten ausführen des Codes werden die Werte in Spalte B eingefügt anschließend in Spalte C usw.
Oder habe ich dein Problem falsch verstanden?
MfG
JöKe
dein Code macht doch das was du möchtest! Beim ersten ausführen des Codes werden die Werte in Spalte B eingefügt anschließend in Spalte C usw.
Oder habe ich dein Problem falsch verstanden?
MfG
JöKe
Antwort 3 von VBA_Anfänger
Hi!
Helmut danke für deinen Vorschlag, dass Problem ist nur das diese Excel Datei ziemlich automatisch funktionieren sollte, da sie von mehreren Leute benutzt wird.
Mein Verständnisproblem ist wen ich die Datei morgen öffne und die Werte aus Tabelle B, Spalte S sich geändert haben stehen diese wirklich automatisch in der Spalte danaben wen sas Makro wie oben eingegeben wurde?
(PS: Ja Jöke das kopieren funktioniert)
mfg
AF
Helmut danke für deinen Vorschlag, dass Problem ist nur das diese Excel Datei ziemlich automatisch funktionieren sollte, da sie von mehreren Leute benutzt wird.
Mein Verständnisproblem ist wen ich die Datei morgen öffne und die Werte aus Tabelle B, Spalte S sich geändert haben stehen diese wirklich automatisch in der Spalte danaben wen sas Makro wie oben eingegeben wurde?
(PS: Ja Jöke das kopieren funktioniert)
mfg
AF
Antwort 4 von Saarbauer
Hallo,
zeichne die Funkton "eine Zeile einfügen" als Makro auf und setze es in dein Makro an der passenden Stelle
Gruß
Helmut
zeichne die Funkton "eine Zeile einfügen" als Makro auf und setze es in dein Makro an der passenden Stelle
Gruß
Helmut
Antwort 5 von VBA_Anfänger
Hi!
Sorry, verstehe nicht wie du das meinst?
mfg
AF
Sorry, verstehe nicht wie du das meinst?
mfg
AF
Antwort 6 von Saarbauer
Hallo,
Mit "Extras" "Makro" " Aufzeichnen" da die Funktionen ausführen die zum Makro gehören und mit "Beenden" Aufzeichnung beenden. Diess Makro kannst du in dein Makro dann reinkopieren
Gruß
Helmut
Mit "Extras" "Makro" " Aufzeichnen" da die Funktionen ausführen die zum Makro gehören und mit "Beenden" Aufzeichnung beenden. Diess Makro kannst du in dein Makro dann reinkopieren
Gruß
Helmut
Antwort 7 von JoeKe
Hallo,
leider habe ich dein Problem immer noch nicht verstanden.
Aber Helmuts Vorschlag sieht umgesetzt so aus:
Option Explicit
Sub kopieren()
If Sheets("A").Range("IV1") <> "" Then
Sheets("A").Columns("IV").Delete Shift:=xlToLeft
Sheets("A").Columns("A").Insert Shift:=xlToRight
Else
Sheets("A").Columns("A").Insert Shift:=xlToRight
End If
Sheets("B").Columns("S").Copy _
Destination:=Sheets("A").Range("A1")
End Sub
Gruß
JöKe
leider habe ich dein Problem immer noch nicht verstanden.
Aber Helmuts Vorschlag sieht umgesetzt so aus:
Option Explicit
Sub kopieren()
If Sheets("A").Range("IV1") <> "" Then
Sheets("A").Columns("IV").Delete Shift:=xlToLeft
Sheets("A").Columns("A").Insert Shift:=xlToRight
Else
Sheets("A").Columns("A").Insert Shift:=xlToRight
End If
Sheets("B").Columns("S").Copy _
Destination:=Sheets("A").Range("A1")
End Sub
Gruß
JöKe
Antwort 8 von CaroS
Hallo allerseits,
es gibt da ein paar ganz kleine Problemchen. Wie wir gelesen haben, funktioniert ja das Kopieren (- oder nicht?).
Allerdings wird das Ermitteln der nächsten freien Spalte in der ersten Zeile durchgeführt:
Range("IV1").End(xlToLeft).Column + 1
Das setzt voraus, dass eine belegte Spalte in Zeile 1 nicht leer sein darf, sonst wird sie trotzdem für leer gehalten und überschrieben. Ob aber eine kopierte Spalte in Zeile 1 einen Wert hat oder nicht, hängt von den Tagesdaten in Tabelle B Spalte S ab.
Das heißt, in B!S1 muss heute irgendwas drin stehen (ein Wert oder eine Formel, mindestens =""), damit morgen das Kopieren richtig funktioniert.
Nächster Punkt: Ich möchte bezweifeln, dass der angegebene Code den Bereich B!S7:S120 nach A!B8:B120 oder nach A!B8:B121 kopiert. Das erste ist sicherlich ein Schreibfehler und würde nicht funktionieren, weil im Zielbereich eine Zelle fehlt. Das zweite dürfte allerdings auch nicht funktionieren, denn wenn eine ganze Spalte kopiert und eingefügt wird, findet kein "Zeilen-Offset" statt.
Das "Zeile einfügen" aus AW4 hat JöKe ja in AW7 schon kreativ umgesetzt. Dem habe ich nichts hinzuzufügen.
Wäre nur noch die Frage des automatischen Ablaufs zu klären.
Wenn durch das Öffnen der Datei schon bestimmte Veränderungen der Daten in B!S:S ausgelöst werden (- oder wie sonst?), dann könnte (sollte) man das Kopieren da gleich mit hinten dran hängen, damit nichts verloren geht oder vergessen wird, aber dazu fehlen hier noch die Details.
Was sind das für Änderungen und wie finden sie statt (Workbook_Open, externe Verknüpfungen aktualisieren, ...)?
Was würde passieren, wenn die Datei mehrmals an einem Tag geöffnet werden?
Würden sich jedesmal die Daten in B!S:S ändern? Wäre jedesmal eine Kopie erwünscht?
Gruß,
CaroS
es gibt da ein paar ganz kleine Problemchen. Wie wir gelesen haben, funktioniert ja das Kopieren (- oder nicht?).
Allerdings wird das Ermitteln der nächsten freien Spalte in der ersten Zeile durchgeführt:
Range("IV1").End(xlToLeft).Column + 1
Das setzt voraus, dass eine belegte Spalte in Zeile 1 nicht leer sein darf, sonst wird sie trotzdem für leer gehalten und überschrieben. Ob aber eine kopierte Spalte in Zeile 1 einen Wert hat oder nicht, hängt von den Tagesdaten in Tabelle B Spalte S ab.
Das heißt, in B!S1 muss heute irgendwas drin stehen (ein Wert oder eine Formel, mindestens =""), damit morgen das Kopieren richtig funktioniert.
Nächster Punkt: Ich möchte bezweifeln, dass der angegebene Code den Bereich B!S7:S120 nach A!B8:B120 oder nach A!B8:B121 kopiert. Das erste ist sicherlich ein Schreibfehler und würde nicht funktionieren, weil im Zielbereich eine Zelle fehlt. Das zweite dürfte allerdings auch nicht funktionieren, denn wenn eine ganze Spalte kopiert und eingefügt wird, findet kein "Zeilen-Offset" statt.
Das "Zeile einfügen" aus AW4 hat JöKe ja in AW7 schon kreativ umgesetzt. Dem habe ich nichts hinzuzufügen.
Wäre nur noch die Frage des automatischen Ablaufs zu klären.
Zitat:
... das diese Excel Datei ziemlich automatisch funktionieren sollte ... ... wen ich die Datei morgen öffne und die Werte aus Tabelle B, Spalte S sich geändert haben stehen diese wirklich automatisch ... ?
... das diese Excel Datei ziemlich automatisch funktionieren sollte ... ... wen ich die Datei morgen öffne und die Werte aus Tabelle B, Spalte S sich geändert haben stehen diese wirklich automatisch ... ?
Wenn durch das Öffnen der Datei schon bestimmte Veränderungen der Daten in B!S:S ausgelöst werden (- oder wie sonst?), dann könnte (sollte) man das Kopieren da gleich mit hinten dran hängen, damit nichts verloren geht oder vergessen wird, aber dazu fehlen hier noch die Details.
Was sind das für Änderungen und wie finden sie statt (Workbook_Open, externe Verknüpfungen aktualisieren, ...)?
Was würde passieren, wenn die Datei mehrmals an einem Tag geöffnet werden?
Würden sich jedesmal die Daten in B!S:S ändern? Wäre jedesmal eine Kopie erwünscht?
Gruß,
CaroS
Antwort 9 von VBA_Anfänger
Hi!
Danke mal an JöKe an den Makro der bis auf die Kleinigkeit das in der Tabelle A; Spalte A,Daten rinstehen die nach dem ausführen den Makros verschwunden sind funktioniert. Zu deiner Frage CaroS. Der Spaß an der Sache ist ,die Daten ändern sich nur einmal am Tag, weil die diese in Tabelle B, Spalte S ausgewiesenen Daten Marktrenditen sind deren Berechnung auch von der verbleibenden Anzahl von Tagen abhängig ist und andere zur Berechnung notwendigen Daten tätglich neu importiert werden. Kannst du (ihr) auch jetzt mehr darunter vorstellen?
mfg
AF
Danke mal an JöKe an den Makro der bis auf die Kleinigkeit das in der Tabelle A; Spalte A,Daten rinstehen die nach dem ausführen den Makros verschwunden sind funktioniert. Zu deiner Frage CaroS. Der Spaß an der Sache ist ,die Daten ändern sich nur einmal am Tag, weil die diese in Tabelle B, Spalte S ausgewiesenen Daten Marktrenditen sind deren Berechnung auch von der verbleibenden Anzahl von Tagen abhängig ist und andere zur Berechnung notwendigen Daten tätglich neu importiert werden. Kannst du (ihr) auch jetzt mehr darunter vorstellen?
mfg
AF
Antwort 10 von CaroS
Hallo VBA_Anfänger,
die Sache ist so. Man kann in jede Excel-Datei ein Makro einbauen, das direkt beim Öffnen der Datei ausgeführt wird, ohne dass man dafür noch etwas tun muss. Das findet statt, bevor Du das erste Mal in dieser Datei eine Zelle anklicken kannst. Für bestimmt Dinge kann das ganz praktisch sein.
Das bedeutet aber auch, wenn man mal für 2 Stunden außer Haus geht, seinen Rechner aus- und später wieder einschaltet und die Datei am selben Tag ein zweites Mal öffnet, dass das Makro dann noch einmal ausgeführt wird, einfach weil es Teil des Datei-Öffnens ist.
Um eine zweite und dritte Ausführung des Makros an einem Tag zu verhindern, könnte und müsste man da noch zusätzlich eine Prüfung und einen Abbruch einbauen und vielleicht auch Rücksicht auf andere Dinge nehmen, die weder von der Ausführung noch vom Abbruch des Open-Makros beeinträchtigt werden dürfen. Es könnte also etwas komplizierter werden.
Eine einfache Möglichkeit ist natürlich, das Makro täglich einmal mit der Hand (per Tastenkombination oder Klick auf einen Button oder ... ) zu starten, aber das ist dann eben nicht automatisch und man darf es nicht vergessen. Ich weiß ja nicht, was das Richtige für Dich ist.
Gruß,
CaroS
die Sache ist so. Man kann in jede Excel-Datei ein Makro einbauen, das direkt beim Öffnen der Datei ausgeführt wird, ohne dass man dafür noch etwas tun muss. Das findet statt, bevor Du das erste Mal in dieser Datei eine Zelle anklicken kannst. Für bestimmt Dinge kann das ganz praktisch sein.
Das bedeutet aber auch, wenn man mal für 2 Stunden außer Haus geht, seinen Rechner aus- und später wieder einschaltet und die Datei am selben Tag ein zweites Mal öffnet, dass das Makro dann noch einmal ausgeführt wird, einfach weil es Teil des Datei-Öffnens ist.
Um eine zweite und dritte Ausführung des Makros an einem Tag zu verhindern, könnte und müsste man da noch zusätzlich eine Prüfung und einen Abbruch einbauen und vielleicht auch Rücksicht auf andere Dinge nehmen, die weder von der Ausführung noch vom Abbruch des Open-Makros beeinträchtigt werden dürfen. Es könnte also etwas komplizierter werden.
Eine einfache Möglichkeit ist natürlich, das Makro täglich einmal mit der Hand (per Tastenkombination oder Klick auf einen Button oder ... ) zu starten, aber das ist dann eben nicht automatisch und man darf es nicht vergessen. Ich weiß ja nicht, was das Richtige für Dich ist.
Gruß,
CaroS
Antwort 11 von JoeKe
Hallo Anfänger,
ich hoffe du hast zuvor eine Sicherungskopie gemacht!
Obwohl du nicht nachgefragt hast, wenn die Daten in Spalte B eingetragen werden sollen muss die Zeile:
in:
Destination:=Sheets("A").Range("B1")
geändert werden.
Gruß
JöKe
ich hoffe du hast zuvor eine Sicherungskopie gemacht!
Obwohl du nicht nachgefragt hast, wenn die Daten in Spalte B eingetragen werden sollen muss die Zeile:
Destination:=Sheets("A").Range("A1") in:
Destination:=Sheets("A").Range("B1")
geändert werden.
Gruß
JöKe
Antwort 12 von VBA_Anfänger
Morgen!
Ja JöKe habe vorher gespeichert und die Änderung im Makro eingetragen, trotzdem wird der Inhalt der Spalte A in Sheet A beim ausführen des Makros gelöscht.
Wie könnte man dieses "automatische archivieren" statt mit einem Button mit einer Msgbox in das Makro einbauen?
mfg
AF
Ja JöKe habe vorher gespeichert und die Änderung im Makro eingetragen, trotzdem wird der Inhalt der Spalte A in Sheet A beim ausführen des Makros gelöscht.
Wie könnte man dieses "automatische archivieren" statt mit einem Button mit einer Msgbox in das Makro einbauen?
mfg
AF
Antwort 13 von JoeKe
Moin Anfänger,
hier nochmal der korriegierte Code:
Option Explicit
Sub kopieren()
If Sheets("A").Range("IV1") <> "" Then
Sheets("A").Columns("IV").Delete Shift:=xlToLeft
Sheets("A").Columns("B").Insert Shift:=xlToRight
Else
Sheets("A").Columns("B").Insert Shift:=xlToRight
End If
Sheets("B").Columns("S").Copy _
Destination:=Sheets("A").Range("B1")
End Sub
Automatisch ausführen läßt sich, wie CaroS auch schon schrieb, ein Code z.B. mit Woorkbook_Open oder mit Woorkbook_BeforeClose. Aber das würde dann eben jedesmal geschehen, wenn die Mappe geöffnet bzw. geschlossen wird.
Um dies zu verhindern, muss man einen eindeutigen Wert haben an dem man feststellt ob schon einmal etwas kopiert wurde.
Da mir zuwenig über dein Tabellenaufbau bekannt ist, hier mal eine Möglichkeit die anhand des Datums eine Überprüfung durchführt.
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Sheets("A").Range("B1") = Date Then Exit Sub
kopieren
End Sub
Der Code gehört in das VBA-Projekt "DieseArbeitsmappe". Beim schließen der Mappe wird auf Blatt "A" in Zelle B1 überprüft ob da das heutige Datum drin steht. Wenn "Ja" wurde schon einmal kopiert und der Code wird beendet. Wenn "Nein" wird das Makro "kopieren" ausgeführt.
Gruß
JöKe
hier nochmal der korriegierte Code:
Option Explicit
Sub kopieren()
If Sheets("A").Range("IV1") <> "" Then
Sheets("A").Columns("IV").Delete Shift:=xlToLeft
Sheets("A").Columns("B").Insert Shift:=xlToRight
Else
Sheets("A").Columns("B").Insert Shift:=xlToRight
End If
Sheets("B").Columns("S").Copy _
Destination:=Sheets("A").Range("B1")
End Sub
Automatisch ausführen läßt sich, wie CaroS auch schon schrieb, ein Code z.B. mit Woorkbook_Open oder mit Woorkbook_BeforeClose. Aber das würde dann eben jedesmal geschehen, wenn die Mappe geöffnet bzw. geschlossen wird.
Um dies zu verhindern, muss man einen eindeutigen Wert haben an dem man feststellt ob schon einmal etwas kopiert wurde.
Da mir zuwenig über dein Tabellenaufbau bekannt ist, hier mal eine Möglichkeit die anhand des Datums eine Überprüfung durchführt.
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Sheets("A").Range("B1") = Date Then Exit Sub
kopieren
End Sub
Der Code gehört in das VBA-Projekt "DieseArbeitsmappe". Beim schließen der Mappe wird auf Blatt "A" in Zelle B1 überprüft ob da das heutige Datum drin steht. Wenn "Ja" wurde schon einmal kopiert und der Code wird beendet. Wenn "Nein" wird das Makro "kopieren" ausgeführt.
Gruß
JöKe
Antwort 14 von VBA_Anfänger
Danke paßt alles

