Excel - Zelle (Wert) Täglich abspeichern

@

@@@

Gast
Jo Moin

Der Wert in der Zelle aktualisiert sich selbstständig, wenn man die Excel startet.

Ich möchte gerne diesen Wert jeden Tag automatisch auf ein neues Blatt übertragen, um
damit Auswertungen zu machen. Wie könnte man das am besten umsetzen?


Unbenannt.png


Vielen Vielen Dank
 
Moin,
je nachdem, was du jetzt exakt willst, lässt sich das wahrscheinlich recht kompliziert (oder gar nicht) mit Excel-Formeln oder recht einfach mit VBA umsetzen.
Ganz billiger Pseudocode für VBA könnte sein:
Vergleiche aktuelles Datum mit letzter Änderung an Datei (oder weggeschriebenen Datum irgendwo im Excel)
Wenn aktuelles Datum neuer, dann erstelle neues Arbeitsblatt, kopiere alle Formeln (wenn gewünscht) und übertrage entsprechenden Wert.
Speichere Datei

VBA "lernen" ist ganz einfach. Makrorekorder rausholen, aufzeichnen und wenn gewünscht ein wenig anpassen. Viel googlen.
 
  • Gefällt mir
Reaktionen: @@@
CHaos.Gentle schrieb:
Moin,
je nachdem, was du jetzt exakt willst, lässt sich das wahrscheinlich recht kompliziert (oder gar nicht) mit Excel-Formeln oder recht einfach mit VBA umsetzen.
Ganz billiger Pseudocode für VBA könnte sein:
Vergleiche aktuelles Datum mit letzter Änderung an Datei (oder weggeschriebenen Datum irgendwo im Excel)
Wenn aktuelles Datum neuer, dann erstelle neues Arbeitsblatt, kopiere alle Formeln (wenn gewünscht) und übertrage entsprechenden Wert.
Speichere Datei

VBA "lernen" ist ganz einfach. Makrorekorder rausholen, aufzeichnen und wenn gewünscht ein wenig anpassen. Viel googlen.


Das wäre sogar Perfekt, könntest du mir helfen? Habe anbei nichts schlaues gefunden in Google.

Der Marko Code:

Sub Daten_zu_Übersicht()

Dim Kundenname As String
Dim Kundennr As String
Dim Rechnungsnr As String
Dim Rechnungsdatum As String
Dim Leistung As String
Dim Gesamtbetrag As String

Worksheets("test").Select
Kundenname = Range("A8")
Kundennr = Range("B15")
Rechnungsnr = Range("B16")
Rechnungsdatum = Range("F16")
Leistung = Range("A19")
Gesamtbetrag = Range("G29")

Worksheets("Auswertung").Select
Worksheets("Auswertung").Range("A6").Select
If Worksheets("Auswertung").Range("A6").Offset(1, 0) <> "" Then
Worksheets("Auswertung").Range("A6").End(xlDown).Select
End If
ActiveCell.Offset(1, 0).Select
ActiveCell.Value = Rechnungsnr
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = Kundennr
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = Kundenname
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = Leistung
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = Rechnungsdatum
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = Gesamtbetrag



End Sub


Übertragt nur immer zwei Werte und danach ist schluss.
Ergänzung ()

Habe dir schnell eine Testdatei erstellst.

Vielleicht findest du ja den Fehler, das wäre natürlich genial und wäre sehr dankbar
 

Anhänge

Zuletzt bearbeitet von einem Moderator:
Moin, sorry ganz vergessen.

Tasten wir uns einfach mal langsam heran.
Code:
Dim Kundenname As String
Dim Kundennr As String
Dim Rechnungsnr As String
Dim Rechnungsdatum As String
Dim Leistung As String
Dim Gesamtbetrag As String
Definition der Variablen: Ok! Allerdings brauchen wir die nicht wirklich.

Code:
Worksheets("test").Select
Wählen des Worksheets: Ok! Du führst die Methode Select auf das Objekt Worksheet aus. Damit "klickt" man die Zelle sozusagen an.
Aber, du kannst auch einfach aus jedem Sheet direkt auf Werte eines anderen Sheets zugreifen. Allerdings nicht mit Select, denn eine Zelle in einem nicht aktiven Sheet kann man auch nicht anklicken.

Das sieht dann so aus: Geschmacksache ist, ob man per Objekt.Range(...) oder Objekt.Cells(Zeilennummer, Spaltennummer) auf die Zellen zugreift. Wenn man zählen oder durchlaufen will, ist Zweites besser.

Beispiel:
Code:
Kundenname = Worksheets("test").Cells(14,2)
Kundennr = Worksheets("test").Cells(14,3)
Rechnungsnr = Worksheets("test").Cells(14,4)
Rechnungsdatum = Worksheets("test").Cells(14,5)
Leistung = Worksheets("test").Cells(14,6)
Gesamtbetrag = Worksheets("test").Cells(14,7)

Code:
Worksheets("Auswertung").Select
Worksheets("Auswertung").Range("A6").Select
If Worksheets("Auswertung").Range("A6").Offset(1, 0) <> "" Then
Worksheets("Auswertung").Range("A6").End(xlDown).Select
End If
So, hier wählst du im Sheets Auswertung die Zelle A6 aus und prüfst dann ob die Zelle darunter ungleich einem Leerstring ist. (Vorsicht, wenn eine Formel in der Zelle unter A6 steht, deren Ergebnis leer ist, bspw. "Wenn heute die Sonne scheint, dann Zelle leer" wird diese Auswertung immer richtig ausgeben, da die Formel in der Zelle steht, sie ist also <> "".)
Ist das Ergebnis der Prüfung wahr, dann markierst du von der Zelle A6 nach unten, nach der Methode End(xlDown). Diese arbeitet wie STRG + Pfeil unten.

Jetzt wirds ein wenig komplexer:
Code:
ActiveCell.Offset(1, 0).Select
Ausgehend von der aktiven Zelle (das ist die Zelle die ausgehend von A6 durch STRG + Pfeil unten markiert wurde), füllst du die darunter liegende Zeile mit Werten.
Code:
ActiveCell.Value = Rechnungsnr
Und so weiter. Danach endet dein Skript.

Erstmal nicht schlecht, doch wo liegt jetzt der eigentliche Fehler? Das lässt sich am einfachsten nachvollziehen, wenn man das Skript debugged. Also mit F8 im VBA Editor das Skript Zeile für Zeile durchlaufen und schauen was es tut. Lange Rede kurzer Sinn:
Code:
Worksheets("Auswertung").Range("A6").Select
If Worksheets("Auswertung").Range("A6").Offset(1, 0) <> "" Then
Worksheets("Auswertung").Range("A6").End(xlDown).Select
End If
Hier. Zelle A7 ist nicht leer. Ausgehend von A6 drücken wir STRG + Pfeil unten und landen in A7. Jedes mal. Und diese Zeile befüllst du. Du überschreibst also jedes Mal die Zeile 7. Verstanden?

Hier alles oben genannte mal neu geschrieben. Und ein wenig umgestellt:
Code:
Sub asdf()
Const StartZeileZiel = 7 'Die Zeilennummer der ersten Zeile mit Inhalt im Sheet "Auswertung", einfach als Konstante
Const StartZeileQuelle = 14 'Die Zeilennummer der ersten Zeile mit Inhalt im Sheet "Test"

Dim NeueZeile As Integer 'Variable für die neu zu schreibende Zeile

If Worksheets("Auswertung").Cells(StartZeileZiel, 1) <> "" Then 'Prüfen ob allererste Zeile
    If Worksheets("Auswertung").Cells(StartZeileZiel + 1, 1) <> "" Then 'Prüfen ob zweite Zeile
        NeueZeile = Worksheets("Auswertung").Cells(StartZeileZiel, 1).End(xlDown).Row + 1 'Ausgehend von der in der Konstanten genannten Zeile per End nach unten findet die letzte befüllte Zeile. .row gibt die Zeilennummer zurück.
    Else
        NeueZeile = StartZeileZiel + 1
    End If
Else
    NeueZeile = StartZeileZiel 'Die allererste Zeile soll bitte in Zeile 7 stehen, wie in der Konstanten genannt
End If

Worksheets("Auswertung").Cells(NeueZeile, 1).Value = Worksheets("Test").Cells(StartZeileQuelle, 2).Value 'Direkt füllen von Ziel aus Quelle
Worksheets("Auswertung").Cells(NeueZeile, 2).Value = Worksheets("Test").Cells(StartZeileQuelle, 3).Value
Worksheets("Auswertung").Cells(NeueZeile, 3).Value = Worksheets("Test").Cells(StartZeileQuelle, 4).Value
Worksheets("Auswertung").Cells(NeueZeile, 4).Value = Worksheets("Test").Cells(StartZeileQuelle, 5).Value
Worksheets("Auswertung").Cells(NeueZeile, 5).Value = Worksheets("Test").Cells(StartZeileQuelle, 6).Value

End Sub
Warum jetzt zwei if-Abfragen?
Das liegt an der zu schlauen Umsetzung von STRG + Pfeil unten. Ist nämlich die letzte gefüllte Zelle markiert und wir drücken STRG + Pfeil unten, dann springt Excel zur letzten Zeile im Sheet. Ist allerdings die vorletzte gefüllte Zelle markiert, springt man damit in die letzte gefüllte Zeile. Denn STRG + Pfeil unten wählt eben nicht brav die letzte gefüllte Zelle aus sondern reagiert auf den Kontext der aktuellen Zelle.

Fragen? Immer raus damit.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: @@@
CHaos.Gentle schrieb:
Moin, sorry ganz vergessen.

Tasten wir uns einfach mal langsam heran.
Code:
Dim Kundenname As String
Dim Kundennr As String
Dim Rechnungsnr As String
Dim Rechnungsdatum As String
Dim Leistung As String
Dim Gesamtbetrag As String
Definition der Variablen: Ok! Allerdings brauchen wir die nicht wirklich.

Code:
Worksheets("test").Select
Wählen des Worksheets: Ok! Du führst die Methode Select auf das Objekt Worksheet aus. Damit "klickt" man die Zelle sozusagen an.
Aber, du kannst auch einfach aus jedem Sheet direkt auf Werte eines anderen Sheets zugreifen. Allerdings nicht mit Select, denn eine Zelle in einem nicht aktiven Sheet kann man auch nicht anklicken.

Das sieht dann so aus: Geschmacksache ist, ob man per Objekt.Range(...) oder Objekt.Cells(Zeilennummer, Spaltennummer) auf die Zellen zugreift. Wenn man zählen oder durchlaufen will, ist Zweites besser.

Beispiel:
Code:
Kundenname = Worksheets("test").Cells(14,2)
Kundennr = Worksheets("test").Cells(14,3)
Rechnungsnr = Worksheets("test").Cells(14,4)
Rechnungsdatum = Worksheets("test").Cells(14,5)
Leistung = Worksheets("test").Cells(14,6)
Gesamtbetrag = Worksheets("test").Cells(14,7)

Code:
Worksheets("Auswertung").Select
Worksheets("Auswertung").Range("A6").Select
If Worksheets("Auswertung").Range("A6").Offset(1, 0) <> "" Then
Worksheets("Auswertung").Range("A6").End(xlDown).Select
End If
So, hier wählst du im Sheets Auswertung die Zelle A6 aus und prüfst dann ob die Zelle darunter ungleich einem Leerstring ist. (Vorsicht, wenn eine Formel in der Zelle unter A6 steht, deren Ergebnis leer ist, bspw. "Wenn heute die Sonne scheint, dann Zelle leer" wird diese Auswertung immer richtig ausgeben, da die Formel in der Zelle steht, sie ist also <> "".)
Ist das Ergebnis der Prüfung wahr, dann markierst du von der Zelle A6 nach unten, nach der Methode End(xlDown). Diese arbeitet wie STRG + Pfeil unten.

Jetzt wirds ein wenig komplexer:
Code:
ActiveCell.Offset(1, 0).Select
Ausgehend von der aktiven Zelle (das ist die Zelle die ausgehend von A6 durch STRG + Pfeil unten markiert wurde), füllst du die darunter liegende Zeile mit Werten.
Code:
ActiveCell.Value = Rechnungsnr
Und so weiter. Danach endet dein Skript.

Erstmal nicht schlecht, doch wo liegt jetzt der eigentliche Fehler? Das lässt sich am einfachsten nachvollziehen, wenn man das Skript debugged. Also mit F8 im VBA Editor das Skript Zeile für Zeile durchlaufen und schauen was es tut. Lange Rede kurzer Sinn:
Code:
Worksheets("Auswertung").Range("A6").Select
If Worksheets("Auswertung").Range("A6").Offset(1, 0) <> "" Then
Worksheets("Auswertung").Range("A6").End(xlDown).Select
End If
Hier. Zelle A7 ist nicht leer. Ausgehend von A6 drücken wir STRG + Pfeil unten und landen in A7. Jedes mal. Und diese Zeile befüllst du. Du überschreibst also jedes Mal die Zeile 7. Verstanden?

Hier alles oben genannte mal neu geschrieben. Und ein wenig umgestellt:
Code:
Sub asdf()
Const StartZeileZiel = 7 'Die Zeilennummer der ersten Zeile mit Inhalt im Sheet "Auswertung", einfach als Konstante
Const StartZeileQuelle = 14 'Die Zeilennummer der ersten Zeile mit Inhalt im Sheet "Test"

Dim NeueZeile As Integer 'Variable für die neu zu schreibende Zeile

If Worksheets("Auswertung").Cells(StartZeileZiel, 1) <> "" Then 'Prüfen ob allererste Zeile
    If Worksheets("Auswertung").Cells(StartZeileZiel + 1, 1) <> "" Then 'Prüfen ob zweite Zeile
        NeueZeile = Worksheets("Auswertung").Cells(StartZeileZiel, 1).End(xlDown).Row + 1 'Ausgehend von der in der Konstanten genannten Zeile per End nach unten findet die letzte befüllte Zeile. .row gibt die Zeilennummer zurück.
    Else
        NeueZeile = StartZeileZiel + 1
    End If
Else
    NeueZeile = StartZeileZiel 'Die allererste Zeile soll bitte in Zeile 7 stehen, wie in der Konstanten genannt
End If

Worksheets("Auswertung").Cells(NeueZeile, 1).Value = Worksheets("Test").Cells(StartZeileQuelle, 2).Value 'Direkt füllen von Ziel aus Quelle
Worksheets("Auswertung").Cells(NeueZeile, 2).Value = Worksheets("Test").Cells(StartZeileQuelle, 3).Value
Worksheets("Auswertung").Cells(NeueZeile, 3).Value = Worksheets("Test").Cells(StartZeileQuelle, 4).Value
Worksheets("Auswertung").Cells(NeueZeile, 4).Value = Worksheets("Test").Cells(StartZeileQuelle, 5).Value
Worksheets("Auswertung").Cells(NeueZeile, 5).Value = Worksheets("Test").Cells(StartZeileQuelle, 6).Value

End Sub
Warum jetzt zwei if-Abfragen?
Das liegt an der zu schlauen Umsetzung von STRG + Pfeil unten. Ist nämlich die letzte gefüllte Zelle markiert und wir drücken STRG + Pfeil unten, dann springt Excel zur letzten Zeile im Sheet. Ist allerdings die vorletzte gefüllte Zelle markiert, springt man damit in die letzte gefüllte Zeile. Denn STRG + Pfeil unten wählt eben nicht brav die letzte gefüllte Zelle aus sondern reagiert auf den Kontext der aktuellen Zelle.

Fragen? Immer raus damit.


Vielen Vielen Dank CHaos.Gentle

Für die Korrektur und die Kritik.
Es funktioniert alles Einwandfrei und bin super Happy.

Ich habe alles Verstanden, so gut erklärt.

Muss gestehen, dein Code ist viel sauberer geschrieben! Hut ab.

Danke Grazie.
 
Gern und danke
 
  • Gefällt mir
Reaktionen: @@@
Zurück
Oben