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

Wie bekommt man Werte autom. aus Tab1 nach Tab2?

Wie bekommt man Werte autom. aus Tab1 nach Tab2?
12.01.2016 11:34:54
Andreas
Wie kann man dies bewerkstelligen, dass einmal am Tag abends ab 20:00 Uhr Werte aus Tabelle1 in Tabelle2 übertragen werden? Und vor allem, wie macht man es, dass es jeden Tag passiert und dann auch in Tabelle2 immer in eine neue Zelle?
Beispiel:
Tag1
Tabelle1 Werte --> A2|B2|C2 nach Tabelle2 A2|B2|C2
Tag 2
Tabelle1 Werte --> A2|B2|C2 nach Tabelle2 A3|B3|C3
Tag 3
Tabelle1 Werte --> A2|B2|C2 nach Tabelle2 A4|B4|C4
usw. Die Werte in Tabelle1 werden täglich aktualisiert.
Aktuell kann ich diese Werte zwar in Tabelle2 mit =WENN(HEUTE()>=A2;Tabelle1!$K$3;B2) aus Tabelle1 täglich übertragen, aber da sich der Wert in Tabelle1 täglich ändert, ändert sich der Wert auch in Tabelle2 am nächsten Tag auch wieder :-(. Das soll aber wegen einer Statistik nicht sein. Tabelle2 soll den Wert vom Vortag wie im Beispiel oben fortlaufend festhalten bzw. protokollieren. Da scheint doch der Ansatz mit heute() wohl falsch zu sein, oder?
Ich hatte da schon einen Thread dazu geschrieben, aber wohl komplett falsch formuliert. Es wäre nett wenn mir hier jemand behilflich sein könnte.
mfG
A. Müller

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wie bekommt man Werte autom. aus Tab1 nach Tab2?
12.01.2016 12:17:46
fcs
Hallo Andreas,
1. Die Datei rund um die Uhr geöffnet (7 Tage/24 Stunden)
Dann könnt man ein entsprechendes Makro bateln, das per OnTime in einer Endlosschleife jeweils um 20:00:00 gestarte wird.
2. Die Datei ist normaler weise geschlossen:
Dann müsste mit dem Windows-Scheduler ein Aktualisierungs-Script gestartet werden.
3. Wenn es nicht so auf den Zeitpunkt ankommt
Dann könnte auch vor dem Schliessen oder während des Öffnes der Datei die Übertragung der Werte nach Tabelle2 per Makro ausgeführt werden.
Welche der 3 Optionen kommt in Frage?
Gruß
Franz

Anzeige
AW: Wie bekommt man Werte autom. aus Tab1 nach Tab2?
12.01.2016 21:15:43
Andreas
Hi,
hmm ich dachte ich hätte die Antwort weggeschickt! Mit nichten :-(. Danke erst einmal für das schnelle Antworten und sorry fürs langsame Reply.
Grundsätzlich kommt Option 1 in Frage. Die Datei startet morgens, da Daten ab 07:30 empfangen werden. Weiterhin müsste es aber nur Tage 2-6 laufen, da Sam und Sonn nichts läuft was aktuelle Daten angeht. Aber das macht ja einem Makro nichts aus, wenn die Datei zu ist, oder? Sorry noch einmal wegen der lange Antwortzeit.
Gruß Andreas

AW: Per OnTime zeitgesteuert Werte kopieren
13.01.2016 16:04:02
fcs
Hallo Andreas,
ich musste jetzt etwas tüfteln, dass es auch funktioniert, wenn die Datei zwischenzeitlich geschlossen werden sollte.
Hier eine Beispieldatei. Weitere Infos auf Tabelle1
https://www.herber.de/bbs/user/102753.xlsm
Gruß
Franz

Anzeige
AW: Per OnTime zeitgesteuert Werte kopieren
13.01.2016 17:40:32
Andreas
HI,
wow, danke erst mal. Ich habe die Datei Sicherheitstechnisch so eingestuft, dass der Debugger nicht meckert beim Start. Ich habe das dann mal in meine Datei integriert, habe jedoch ein Verständnisproblem mit den Zellen, welche er kopiert. Im Makro steht
Sub prcOnTimeStart()
datNextStart = Tabelle1.Range("Startzeit")
Wenn ich nun nur die Zellen K1:K11;K34 aus Tabelle1 nach B3:K3 in Tabelle2 "übertragen" will, kann ich dann Tabelle1.Range mit Tabelle1.K1:K11;K34 ersetzen? Selbst wenn dem so ist, dann wird er das ganze so wohl auch in Tabelle2 einfügen, oder?
Ich sehe gerade, dass ich das wohl so in der Art nicht richtig formuliert habe :-(. Ich hatte A2, B2, C2 nach A2, BS, C2 usw. gemacht. Richtig wäre gewesen
Tag1
Tabelle1 Werte --> A2|A3|A4 nach Tabelle2 A2|B2|C2
Tag 2
Tabelle1 Werte --> A2|A3|A4 nach Tabelle2 A3|B3|C3
Tag 3
Tabelle1 Werte --> A2|A3|A4 nach Tabelle2 A4|B4|C4
Jetzt habe ich dir da wohl irgendwie unnötig Arbeit gemacht :-(. Oder ist das mit der Range und der Korrektur extrem viel Arbeit was die Korrektur angeht?
Gruß Andreas

Anzeige
AW: Per OnTime zeitgesteuert Werte kopieren
14.01.2016 09:42:22
fcs
Hallo Andreas,
das Übertragen der Werte ist hier ja das kleinste Problem.
Du musst nur rechts vom Gleichheitszeichen im entsprechenden Makro-Abschnitt anpassungen machen.
Ich hab auch noch ein Beispiel eingefügt, wenn mehrere Zellen innerhalb einer Zeile in einer Anweisung übertragen werden sollen.
Gruß
Franz
Sub prcOnTimeMakro()
Dim objListObject As ListObject
'der nachfolgende Teil muss individuell angepasst werden
Dim wksQ As Worksheet, wksZ As Worksheet
Dim Zeile As Long
'Bei der Zuweisung der Tabellenblätter zu den Variablen ggf. statt Indexnummern _
die Namen
Set wksQ = Tabelle1 'Codename der Quelltabelle
Set wksZ = Tabelle2 'Codename der Zieltabelle
If VBA.Weekday(Date, vbMonday) 

Anzeige
AW: Per OnTime zeitgesteuert Werte kopieren
14.01.2016 11:11:32
Andreas
Hallo Franz,
danke für die Anpassungen, wobei ich wahrscheinlich noch ein Verständnisproblem damit habe.
Die beiden Tabellen sind ja sinnigerweise definiert mit wksQ und wksZ. Im eigentlichen Code, was es machen soll, steht
If VBA.Weekday(Date, vbMonday) < 6 Then
'Nur Mo-Fr Werte übertragen
With wksZ
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'nächste freie Zeile
Sagt, dass er in der Zieltabelle immer neue Zeile beschreiben soll wie gewünscht. Und für die Quelltabelle ist die Definition so?
With wksZ
Zeile = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'nächste freie Zeile
.Cells(Zeile, 1).Value = wksQ.Cells(2, 1).Value 'K3 oder wksQ.Range("K3").Value
.Cells(Zeile, 2).Value = wksQ.Cells(3, 1).Value 'K4 oder wksQ.Range("K4").Value
.Cells(Zeile, 3).Value = wksQ.Cells(4, 1).Value 'K5 oder wksQ.Range("K5").Value
.Cells(Zeile, 4).Value = wksQ.Cells(4, 1).Value 'K6 oder wksQ.Range("K6").Value
.Cells(Zeile, 5).Value = wksQ.Cells(4, 1).Value 'K7 oder wksQ.Range("K7").Value
.Cells(Zeile, 6).Value = wksQ.Cells(4, 1).Value 'K8 oder wksQ.Range("K8").Value
.Cells(Zeile, 7).Value = wksQ.Cells(4, 1).Value 'K9 oder wksQ.Range("K9").Value
.Cells(Zeile, 8).Value = wksQ.Cells(4, 1).Value 'K10 oder wksQ.Range("K10").Value
.Cells(Zeile, 9).Value = wksQ.Cells(4, 1).Value 'K11 oder wksQ.Range("K11").Value
.Cells(Zeile, 10).Value = wksQ.Cells(4, 1).Value 'K34 oder wksQ.Range("K34").Value
.Cells(Zeile, 11).Value = VBA.Date 'für Kontrollzwecke
.Cells(Zeile, 12).Value = VBA.Time 'für Kontrollzwecke
Warum die beiden letzten Zeilen?
Da ist jetzt mein Haken im Kopf. Der kopiert die Werte nun in Zieltabelle in die Felder A2, B2, C2, D2 usw.
Ich habe ja in diesem Jahr schon absolute Werte in der Zieltabelle stehen, welche ich natürlich "händisch" hinterlegt habe. Weiterhin ist in der
Zieltabelle die Spalte A als Datumsspalte definiert und eben die Tage schon vordefiniert. Sprich die Werte dürfen erst
ab Spalte B geschrieben werden und nun, weil wir schon den 14.01.2016 haben eben ab Zeile 11. Wie löst man so etwas?
Im nächtsen Jahr wäre das nicht notwendig, aber aktuell muss ich ihm sagen, ab welcher Zeile er schreiben darfwannin
der Zieltabelle, oder? Und ja, ich weiss. Ich muss mich wohl "genauer" bzw. klarer ausdrücken, das muss ich mir
wohl auf die Fahne schreiben lassen, auch wenn es nicht meine Art ist und für dich in deinem Fall meine Erkenntnis wohl
zu spät kommt, sorry. :-(.
Das Beispiel mit den Zellen nebeneinander habe ich mal ausdokumentiert, aber sollte ich mal was umstellen habe ich dann
ja ein Beispiel. Danke dafür.
Gruß Andreas

Anzeige
AW: Per OnTime zeitgesteuert Werte kopieren
15.01.2016 10:24:18
fcs
Hallo Andreas,
Datum und Zeit werden wie in der Namerkung angegeben zu Kontrollzwecken eingetragen.
Dies ist zumindest in der Testphase des Makros wichtig, damit man nachvollziehen kann, wann die Aktionen ausgeführt wurden.
Eintragen der Werte in der richtigen Zeile:
Möglichkeit A:
Du löschst deine vorhandene Datumswerte und lässt das Makro in Zukunft das Datum in Spalte A eintragen.
Möglichkeit B:
Das Makro sucht in Spalte A nach dem Tagesdatum und trägt dann die Werte in den Zellen rechts danben ein.
Mit vorgegebenen Datumswerten in Spalte A muss das Makro wie folgt aussehen.
Gruß
Franz
Sub prcOnTimeMakro()
Dim wksQ As Worksheet, wksZ As Worksheet
Dim Zeile As Long
'Bei der Zuweisung der Tabellenblätter zu den Variablen ggf. statt Indexnummern _
die Namen
Set wksQ = Tabelle1 'Codename der Quelltabelle
Set wksZ = Tabelle2 'Codename der Zieltabelle
If VBA.Weekday(Date, vbMonday) 

Anzeige
AW: Per OnTime zeitgesteuert Werte kopieren
15.01.2016 11:41:14
Andreas
Hallo Franz,
bevor ich das jetzt in meine produktive Datei implementiere, habe ich eine Frage zu einem Makro-Bestand. Aktuell wird bei meiner Datei der/die Sheet/Tabelle (Daten) aktualisiert. Das passiert alle 10 Minuten. Das Makro wurde mir freundlicherweise mal von Sepp eingerichtet. Tabelle1 (Produktion) übernimmt dann diese Felddaten der Tabelle4 (Daten).
Jetzt wurde es eben erforderlich, den letzten Wert des Tages in der Tabelle2 (Archiv) festzuhalten, was durch dein Makro möglich ist. Ich habe bei einem Kurztest gesehen, dass sich dies mit der Lösung für die neue Anforderung beißt, da es auch auf dem On-Time basiert und daran wohl klemmt. Kannst du dir das mal anschauen?
Das ist im VBA Editor in "DieseArbeitsmappe" integriert:
Option Explicit
<pre>Private Sub Workbook_Open()
StartTimer
End Sub</pre>
<pre>Private Sub Workbook_BeforeClose(Cancel As Boolean)
StopTimer
End Sub</pre>
Dann kommt für den zu aktualisierenden Sheet das Modul zum Zuge:
Option Explicit
Public RunWhen As Double
Public Const cRunIntervalSeconds = 600 ' Intervall in Sekunden
Public Const cRunWhat = "updateQuery"
Sub StartTimer()
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
schedule:=True
End Sub Sub updateQuery()
ThisWorkbook.Worksheets("Daten").QueryTables(1).Refresh BackgroundQuery:=False
StartTimer
End Sub Sub StopTimer()
On Error Resume Next
Application.OnTime EarliestTime:=RunWhen, _
Procedure:=cRunWhat, schedule:=False
End Sub Kann man da deinen Code erweitern, sodass der Sheet Daten z.B. alle 600 Sekunden aktualisiert wird?
Gruß und Danke
Andreas
PS. Ja, dann kommen keine weiteren Sheets, Makros oder sonstige Überraschungen mehr dazu, versprochen!

Anzeige
AW: Per OnTime zeitgesteuert Werte kopieren
15.01.2016 14:15:16
fcs
Hallo Andreas,
soweit ich das sehe müssen nur die beden
Private Sub Workbook_Open
zu einer zusammengefasst werden. Da unterschiedliche Variablen- uns Makro-Namen verwendet werden sollte es keine Kollisionen zwischen den beien OnTime-Makros geben.
Wie sich dann die beiden Makros um 20:00 verhalten, wenn sie fast zeitgleich ausgeführt werden, kann ich nicht genau sagen. Die Aktualisierung der Abfrage in dem anderen Tabellenblatt kann ja ein paar Sekunden dauern.
Grundsätzlich ist es aber kein Problem mehrere OnTime-Ereignisse innerhalb der Datei festzulegen.
Gruß
Franz
'Startet beim Öffnen der Datei automatisch die Ausführung des OnTime-Makros
Private Sub Workbook_Open()
'Teil Sepp
StartTimer
'Teil Franz
On Error GoTo Fehler
datNextStart = Tabelle1.Range("Startzeit")
Application.OnTime EarliestTime:=datNextStart, Procedure:="prcOnTimeMakro", schedule:=False
prcOnTimeStart
Err.Clear
Fehler:
With Err
Select Case .Number
Case 0 'kein Fehler
Case Else
'OnTime-Ereignis war nicht mehr vorhanden
'Dieser Fehler kann auftreten, wenn Excel zwischenzeitlch beendet wurde
'OnTime-Makro neu Starten
prcOnTimeStart
End Select
End With
End Sub

Anzeige
AW: Per OnTime zeitgesteuert Werte kopieren
15.01.2016 16:56:05
Andreas
Hallo Franz,
ich habe jetzt mal die Optionen so gesetzt. Ich habe dann den obigen Vorschlag für das PrivateWorkbook Open übernommen. Er bringt mir dann diesen Fehler
Fehler beim kompilieren, Sub oder Function nicht definiert.
Wenn ich das bestätige, dann markiert er die Zeile Private Sub Workbook_Open() gelb und blau markiert ist prcOnTimeStart.
datNextStart = Tabelle1.Range("Startzeit") habe ich entsprechend meinem Tabellenamen angepasst und auch die beiden Zellen Startzeit und Zeitdifferenz sind mit Namen definiert.
Was meckert er an?
Gruß Andreas

AW: Per OnTime zeitgesteuert Werte kopieren
18.01.2016 09:54:15
fcs
Hallo Andreas,
ohne zu wissen, wie du jetzt alles zusammengefügt hast ist es schwierig, zu sagen was du evtl. falsch gemacht hast.
Du solltest in deiner Datei jetzt Makros in folgenden VBA-Modulen haben:
1. DieseArbeitsmappe
- Workbook_Open - wie von mir vorgeschlagen (Sepps + meins)
- Workbook_BeforeClose -wie von Sepp
2. ein allgemeines Modul mit allen Makros und Variablendeklarationne von Sepp
3. ein allgemeines Moduls mit allen Makros und Variablendeklarationen von mir.
Die Fehlermeldung deutet darauf hin, dass du nicht alle meine Makros im allgemeinen Modul eingefpügt hast oder an einer falschen Position eingefügt hast - z.B. unter einem Tabellenblatt-Modul.
Gruß
Franz

Anzeige
AW: Per OnTime zeitgesteuert Werte kopieren
18.01.2016 21:36:10
Andreas
Hi,
selbstverständlich, eine Glaskugel hast du ja nicht ich Dösboddel. Beim starten der Exceldatei startet auch der Debugger mit folgender Meldung:
Fehler beim Kompilieren: Variable nicht definiert. Wenn ich mit OK bestätige, gelb markiert <pre>Private Sub Workbook_Open() und blau hinterlegt datNextStart = Daten.Range("Startzeit")
Hier der Code aus "Dieser Arbeitsmappe".
~f~
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************
Option Explicit
'Startet beim Öffnen der Datei automatisch die Ausführung des OnTime-Makros
<pre>Private Sub Workbook_Open()
'Teil Sepp
StartTimer
'Teil Franz
On Error GoTo Fehler
datNextStart = Daten.Range("Startzeit")
Application.OnTime EarliestTime:=datNextStart, Procedure:="prcOnTimeMakro", schedule:=False
prcOnTimeStart
Err.Clear
Fehler:
With Err
Select Case .Number
Case 0 'kein Fehler
Case Else
'OnTime-Ereignis war nicht mehr vorhanden
'Dieser Fehler kann auftreten, wenn Excel zwischenzeitlch beendet wurde
'OnTime-Makro neu Starten
prcOnTimeStart
End Select
End With
End Sub</pre>
<pre>Private Sub Workbook_BeforeClose(Cancel As Boolean)
StopTimer
End Sub</pre>
Erklärend dazu ist zu sagen, dass ich aus dem ursprünglichen Code Tabelle1.Range("Startzeit") mit Daten.Range("Startzeit") ersetzt habe. In dieser Tabell Daten habe ich ja auch die beiden Zellen S1 (Startzeit) und S2 (Zeitdiffferenz) namentlich definiert und im Zeitformat formatiert. Ich habe gesehen, dass du in beiden Tabellenblättern Option Explicit drin hast. Aber selbst wenn ich diese Option in beiden Tabellen eintrage, dann ändert sich das Fehlerbild nicht. Den Code des Makro habe ich jetzt noch nicht hier abgebildet, da er sich bis auf die Änderung der Tabellennamen nicht von deinem letzten Post https://www.herber.de/forum/messages/1469029.html unterschieden hat, außer eben Tabelle1 in Daten umbenannt. Wenn ich den Code des Makros auch noch posten soll, dann sag mir Bescheid. Aber der Fehler tritt ja schon beim starten auf, da bin ich an dem Makro noch gar nicht angelangt. Also sollte das erst mal unrelevant sein, oder?
Gruß Andreas

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige