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

Zelleninhalt fortführend in 2te Tabelle kopieren

Zelleninhalt fortführend in 2te Tabelle kopieren
11.05.2015 11:42:06
Berlin030
Sehr geehrte Quellcodemeister,
ich habe ein Problem bzw. zu wenig Wissen um ein Problem in VBA lösen zu können und bitte um eure Hilfe.
In einer Liste zur Errechnung des BMI müssen Regelmäßig Körpergewichte eingetragen werden. Immer wenn in der Zelle für das Körpergewicht, auf der ersten Tabelle (Erfassung) ein neuer Wert eingetragen wird, soll der alte Wert inkl. aktuellen Datum in eine zweite Tabelle (Archiv) übertragen werden. Beide Tabellen befinden sich in derselben Mappe.
Die erste Tabelle (Erfassung):
B5,6,7… = Name
C5,6,7… = Vorname
F5,6,7… = Gewicht
Die zweite Tabelle (Archiv)
A3,5,7… = Name
B3,5,7 … = Vorname
C3,5,7… = Gewicht ( D,3,5,7….E3,5,7….F3,5,7….)
C4,6,8… = Datum (D4,6,8….E4,6,8….F4,6,8…..)
Da die zweite Tabelle (Archiv) eine Historie darstellen soll, dürfen die Einträge für „Gewicht“ & „Datum“, die dort hin kopiert werden sollen, nicht die bereits vorhandenen Einträge überschreiben. Stattdessen sollen sie fortlaufend in die Nachbarspalten übertragen werden.
Beispiel:
Im Januar wird in der ersten Tabelle erfasst das Max Mustermann 80 kg wiegt. Im Februar wird er erneut gemessen und das neue Gewicht wird in der ersten Tabelle geändert. Nun soll ein Code im Hintergrund dafür sorgen dass der Name „Max Mustermann“, sowie sein altes Gewicht von 80 kg und das Datum des damaligen Eintrages (z.B. 01.01.2015) in der zweiten Tabelle „Archiv“ abgespeichert werden.
Im März erfolgt eine weitere Messung. Wieder wird das aktuelle Gewicht und das Datum der Messung in die erste Tabelle „Erfassung“ eingetragen. Erneut soll der Code im Hintergrund dafür sorgen dass die Gewichtsangabe und das Datum vom Februar nun in der zweiten Tabelle „Archiv“ hinterlegt werden. Dabei darf jedoch nicht der archivierte Wert vom Januar überschrieben werden! Der Code soll stattdessen die neu zu archivierenden Werte in die Zellen neben den archivierten Werten vom Januar eintragen. Und dann Monat für Monat immer so weiter (bzw immer wenn in Tabelle „Erfassung“ eine Gewichtsänderung erfolgt)
Nun bin ich leider noch sehr unerfahren in VBA. Das der Code aus mehreren Schleifen besteht die immer wieder die Zelleninhalte vergleichen müssen, ist mir bekannt. Doch wie dir dazugehörige Code aussehen können weis ich leider absolut nicht. Ich habe versucht im Internet ein paar nützliche Codezeilen zu finden. Doch entweder klappen sie nicht oder sie sind nicht kommentiert so dass es mir sehr schwerfällt den Funktionen dahinter zuerkennen.
Ich hoffe daher das mir hier in diesem Forum ein wohlwollender Quellcodemeister weiter helfen kann. Im Voraus bereits besten Dank für eure Mühen.
Mfg
Berlin030

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zelleninhalt fortführend in 2te Tabelle kopieren
11.05.2015 13:48:17
fcs
Hallo Berlin030,
die Art wie du die Daten im Archiv erfassen willst ist nicht optimal für zukünftige Auswertungen.
Erfasse sie in der Form in einem Tabellen-Objekt als Endlos-Liste, wobei sich Name und Vorname dann ggf. zu jedem Datum wiederholen.

Spalte A|Spalte B|Spalte C|Spalte D
Name    |Vorname |Gewicht |Datum
Meier   |Else    |87,1    |01.04.2015
Meier   |Hans    |94,1    |01.04.2015
Meier   |Else    |86,0    |01.05.2015
Meier   |Hans    |92,5    |01.05.2015

Alle weiteren Auswertungen erfolgen dann per Autofilter, Sortieren oder auch Pivot-Tabellenbericht.
Für die weiteren Eingaben stellt sich dann die Frage, ob man unbedingt eine separates Eingabeblatt benötigt, oder ob man einfach die neuen Daten jeweils am Ende der Liste nachträgt/ergänzt.
Wenn du unbedingt ein getrenntes Eingabeblatt beibehalten willst, dann dann solltest du eine kleine Beispieldatei hier hochladen mit anonymisierten Beispieldaten. Denn warum sollen die Helfer deine Datei nachbauen, wenn du sie schon hast.
Gruß
Franz

Anzeige
AW: Zelleninhalt fortführend in 2te Tabelle kopieren
11.05.2015 14:11:30
Berlin030
Hallo fcs,
danke für deine Antwort. Sehr gerne würde ich Dir eine anonymisierte Beispieldatei zusenden. Doch irgendwie nimmt dieses Forum keine *.xlsm bzw *.zip Datein an. Ich werde immer auf eine Seite mit Fehlermeldung weitergeleitet welche beschreibt das nur Datein mit bestimmten Ändungen wie *.xl or *.zip (die ich ja verwendte) verwendet werden dürfen. Keine Ahnung warum das nicht klappt. Mache ich was falsch?
Was Deinen Vorschlag angeht werde ich die Tabellenstruktur wie von Dir vorgeschlagen übernehmen. Sicherlich hast Du es recht das ich später die zusammenhängenden Datensätze über einen Filter in der Tabelle anzeigen lassen kann.

Anzeige
AW: Zelleninhalt fortführend in 2te Tabelle kopieren
12.05.2015 07:10:04
fcs
Hallo,
Die Dateiformate funktionieren schon, allerdings muss du auch die Dateigröße beachten (kleienr 300 kB) und im Dateinamen dürfen keine Leerzeichen oder andere Sonderzeichen (ä,ö ü etc) vorhanden sein.
Das Verzeichnis, von dem aus du versuchst die Datei hochzuladen sollte auch nicht zu tief im Pfad stecken.
C:\Users\Public\Test\TestDatei01.xlsm
funktioniert einwandfrei.
Gruß
Franz

AW: Zelleninhalt fortführend in 2te Tabelle kopieren
12.05.2015 09:17:04
Berlin030
So jetzts hats geklappt. Hatte tatsächlich noch einen Umlaut drinne. Die Datei steht aber nun unter https://www.herber.de/bbs/user/97591.zip zur Verfügung. Hoffe Du bzw die Entwickler in diesem Forum können mir beim Quellcode weiterhelfen.
Gruß
Berlin030

Anzeige
AW: Zelleninhalt fortführend in 2te Tabelle kopieren
12.05.2015 13:49:12
Berlin030
Von der Logik wie das Programm ablaufen müsste, habe ich es jetzt glaube ich grob (siehe 'Möchtegerncode'). Aber wie der VBA Code dazu lautet weis ich absolut nicht und hoffe da weiterhin auf Eure Hilfe.
Möchtegerncode
Sub GewichtArchivierung()
Dim Archivierung As Variant
Dim Datum As Variant
' For-Schleife Überwachung der Spalte "F" auf der Tabelle 'Erfassung' auf Bearbeitung der  _
Zellen
'If Bearbeitung einer Zelle in Spalte F....
'...DANN speichere aktuelles Datum in Variable 'Datum'...
'...UND kopiere aus dieser Zeile den alten Zelleninhalt der Spalten B & C & F in  _
die Variable 'Archivierung'....
'...UND kopiere den Wert der Variable 'Archivierung' in die Zellen unter der  _
zuletzt befüllten Zellen der Spalten A&B&C der Tabelle 'Archiv...
'...UND trage in die selbe Zeile, in Spalte D, das Datum ein wann die bearbeitete  _
Zelle in Spalte F auf der Tabelle 'Erfassung' das letztemal bearbeitet wurde.
'...UND kopiere den alten Wert aus der Zelle in Spalte F der Tabelle 'Erfassung' in  _
die Spalte G der selben Zeile.
'If in Spalte G der selben Zeile ein Wert vorhanden, ....
'...DANN kopiere den Wert der Spalte G in der selben Zeile in doe Spalte H
' Else Tu garnichts
'Else Tu garnichts
'For-Schleife endet
End Sub
Hoffe Ihr könnt mir weiter Helfen.
Gruß,
Berlin030

Anzeige
AW: Zelleninhalt fortführend in 2te Tabelle kopieren
12.05.2015 16:07:36
fcs
Hallo Berlin,
man kann es so umsetzen wie du es dir ausgedacht hast.
Ich war davon ausgegangen, dass du einmal im Monat die Werte ins Archiv schreibst.
Bei deinem Vorschlag besteht die Gefahr, dass Werte zu einer Person evtl mehrmal im Monat geändert werden. Das müßte man dann ggf. erst kompliziert prüfen und Änderungen ggf. wieder rückgängig machen.
Nachfolgend dein Code umgesetzt als Ereignis-Makro, das im VBA-Editor unter dem Tabellenblatt "Erfassung" eingefügt werden muss.
Gruß
Franz
'Code unter dem Blatt "Erfassung"
Option Explicit
Private varWertAlt
Private Sub Worksheet_Change(ByVal Target As Range)
Dim varGewichtNeu, varGewMonatLetzter, varGewMonatvor3
Dim datDatum As Date
Dim wksArchiv As Worksheet
Dim Zeile As Long, strName As String, strVorname As String
Dim strJahrMonat As String
Dim StatusCalc As Long
Dim Zeile_Archiv As Long
If Target.Cells.Count = 1 Then
Select Case Target.Column
Case 6 'Spalte F
Select Case Target.Row
Case Is >= 5
With Application
.ScreenUpdating = False
StatusCalc = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
End With
Zeile = Target.Row
If Cells(Zeile, 2) = "" Or Cells(Zeile, 3) = "" Then 'Name oder Vorname fehlt
MsgBox "Name und/oder Vorname fehlt in Zeile " & Zeile, _
vbOKOnly, "Eingaben prüfen"
Target.ClearContents
ElseIf Cells(Zeile, 6) = "" Then  'Gewicht wurde gelöscht
MsgBox "Gewicht wurde gelöscht in " & Zeile & vbLf & _
"Bitte ggf. neu eingeben", _
vbOKOnly, "Eingaben prüfen"
Target.Value = varWertAlt
ElseIf Not IsNumeric(Cells(Zeile, 6)) Then
MsgBox "Gewichtseingabe in Zeile " & Zeile & " ist kein nummerischer Wert!" & vbLf & _
_
"Bitte ggf. neu eingeben", _
vbOKOnly, "Eingaben prüfen"
Target.Value = varWertAlt
ElseIf Cells(Zeile, 6)  0 Then
.Cells(Zeile, 8).Value = varGewMonatLetzter
Else
.Cells(Zeile, 8).ClearContents
End If
.Cells(Zeile, 7).Value = varWertAlt
End With
End If
With Application
.ScreenUpdating = True
.Calculation = StatusCalc
.EnableEvents = True
End With
End Select
End Select
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then
Select Case Target.Column
Case 6 'Spalte F
Select Case Target.Row
Case Is >= 5
varWertAlt = Target.Value 'alten Wert in Zelle merken
Case Else
varWertAlt = vbEmpty
End Select
End Select
End If
End Sub

Anzeige
AW: Zelleninhalt fortführend in 2te Tabelle kopieren
12.05.2015 14:57:39
fcs
Hallo Berlin,
ich hab in deine Datei mal ein entsprechendes Makro eingebaut.
https://www.herber.de/bbs/user/97600.xlsm
Für Auswertungen (Diagramme,Pivotberichte, Formeln im Erfassungsblatt werden noch ein paar weitere Spalten mit Werten ausgefüllt. Kannst du natürlich alles weglassen. Ist im Code immer jeweils eine Zeile. Bei den eingebauten Pivot-Auswertungen muss jeweils nach einer Aktualisierun des Archivs der Bericht aktualisiert werden.
Gruß
Franz

AW: Zelleninhalt fortführend in 2te Tabelle kopieren
13.05.2015 09:39:30
Berlin030
Oh wow...
Ich weis erstmal garnicht was ich sagen soll....vielen vielen Dank. Das ist ja nun viel mehr als ich erwartet hätte. Bin gerade nochdabei mich etwas in den Code einzulesen um ihn besser zu verstehen, aber 1-2 Fragen habe ich bereits:
- Du schreibst:
"Bei den eingebauten Pivot-Auswertungen muss jeweils nach einer Aktualisierun des Archivs der Bericht aktualisiert werden." Das habe ich versucht, scheint aber nicht ganz zu klappen. Habe versucht im Code die Zeilen für diese zwei extra Tabellen zu finden wo die Werte eingetragen werden. Blicke das im Moment aber noch nicht ganz. Könntest Du mir dazu noch kurz ein paar erklärende Worte schreiben?
- "Keine Rückmeldung"
So bald ich etwas unter "Erfassung" in die Tabelle eintrage und Enter Drücke, denkt Excel erstmal ziemlich lange nach (keine Rückmeldung für ein paar sek). Liegt das nun an dem Code der im Hintergrund arbeitet oder muss ich etwas anderes beachten um das zu verhindern?
Generell kann ich mich garnicht oft genung Bedanken für die Hilfe und verbleinb mit freundlichen und dankbaren Grüßen,
Berlin030

Anzeige
AW: Zelleninhalt fortführend in 2te Tabelle kopieren
13.05.2015 11:36:32
fcs
Hallo Berlin,
wenn du mit der Datei arbeitest, die ich hochgeladen hab, dann laufen keine Makros im Hintergrund.
Das Makro wird nur aktiv, wenn man es per Schaltfläche startet.
Rechenintensiv sind ggf. die von mir erstellten Formeln in den Spalten G und H des Blatts "Erfassung".
Auf meinem Rechner (nicht unbedingt allerneuste Bauart) läuft die Ausführung des Makros und die Aktualisierung der Formeln in unter 1 Sekunde. Bei der Eingabe von Daten gibt es 0 Verzögerung.
Mir ist nur aufgefallen, dass Aktionen wie Zeilen- oder SpaltenEinfügen im Blatt "Archiv" extrem lange Zeiten benötigen und "keine Rückmeldung" verursachen. Deshalb hab ich auch im Makro darauf verzichtet und es werden vom Makro keine solchen Aktionen ausgeführt.
Auch mit der anderen Makro-Variante (Ereignis-Makro in der Antwort zu deiner eigenen Idee) hatte ich keine Laufzeitprobleme. Diese hat dann in den Spalten G und H keine Formeln, da das Makro die Werte einträgt.
Pivot-Auswertungen:
Die zugehörigen Tabellen sind im Makro nicht drin. Die Aktualisierung muss manuell erfolgen. Klick in die Tabelle, Rechte-Mausklick und Aktualisieren.
Ich hab jetzt aber festgestellt, dass es ungünstig ist im Drop-Down-Filter für "Jahr-Monat" den Werte "(Leer)" abzuwählen - neue Werte bleiben dann beim Aktualiseren auch erst einmal abgewählt. Besser ist es unter "Name, Vorname" den Wert "(Leer)" abzuwählen.
Man könnte das Makro auch erweitern, so dass die Pivot-Auswertung auch nach der Aktualisierung der Archivdaten aufgefrischt wird. Nachfolgende die entsprechende Ergänzung am Ende des Makros.
    'nächsten Stichtag für Archivierung eintragen
.Range("U3") = DateSerial(Year:=Year(datDatum), Month:=Month(datDatum) + 2, Day:=1)
End With
'Neu--Neu - Anfang
'Pivot-Auswertung aktualisieren
With Worksheets("Pivot-Auswertung")
.PivotTables(1).RefreshTable
End With
'Neu--Neu - Ende
With Application
.ScreenUpdating = True
.Calculation = StatusCalc
End With
End Sub

Anzeige

322 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige