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

Werte/Daten einfügen unter letztem Eintrag

Werte/Daten einfügen unter letztem Eintrag
06.10.2019 14:52:55
Berger
Hallo,
ich bin neu hier und auch sehr neu bei der VBA Programmierung.
Ich habe das Forum gerade durchsucht, aber bisher nichts gefunden was mir hierbei helfen könnte.
Ich habe eine Tabelle (Tabelle 1) mit mehreren Spalten. Die Zeilenanzahl kann immer unterschiedlich sein, sie wird wöchentlich aktualisiert.
Aufgabe 1)
Jetzt sollen weitere Daten (Tabelle 2) geladen werden und unter die bereits bestehende Tabelle eingefügt werden. Die Spalten sind bereits die gleichen, aber ich weiss nicht wie ich es angeben kann wo die neue Tabelle (ohne Überschrift) eingefügt werden soll, da sich eben die Anzahl der Zeilen der ursprünglichen Datei immer ändert.
Aufgabe 2)
Es sollen nur Eintrage der Tabelle 2 eingefügt, wenn der einzutragende Artikel noch nicht in Tabelle 1 vorhanden war. Wenn er bereits vorhanden ist, soll nur das Datum des Artikels aus Tabelle 2 mit dem Datum des Artikels in Tabelle 1 ersetzt werden.
Ich habe es versucht in der angehangenen Datei zu verdeutlichen.
https://www.herber.de/bbs/user/132360.xlsx
Ich würde versuchen in Tabelle 1 die Zeilen zu löschen die keinen Eintrag in der Datum-Spalte besitzen. Das hatte ich schon einmal hingekriegt.
Dann würde ich wahrscheinlich anfangen den ersten Artikel in TAbelle 2 mit den Artikeln aus Tabelle 1, Spalte 1, zu vergleichen. Wahrscheinlich mit einer Schleife oder Loop. DAnn wenn dieser Artikel bereits vorhanden, das neue DAtum in die DAtumszelle eintragen. Ich habe Schwierigkeiten mir vorzustellen wie die Datumszelle angesprochen werden kann, die ersetzt werden kann, da ich ja die Zeilennummer nicht kenne.
Wenn es bei einem Artikel keine Übereinstimmung in Tabelle 1 gibt soll dieser einfach mit unten hingeschrieben werden.
Für jeden Hinweis bin ich sehr dankbar. Vielleicht auch einen groben Aufbau? Ich weiß nicht, wie ich mehrere Befehle /Subs nacheinander ausführen lassen kann. Also erst die zeilen löschen, dann vergleichen etc.
Vielen DANK!!
Beste Grüße
Hannah

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Werte/Daten einfügen unter letztem Eintrag
06.10.2019 15:15:04
Regina
Hallo Hannah,
ich habe mal eine Idee in Deine mappe eingebaut. Im Modul1 befindet sich eine Prozedur Uebertrag, die arbeitet mit der Find-Methode, das sollte schneller laufen, als mit einem Do...Loop nach jedem Wert zu suchen.
https://www.herber.de/bbs/user/132361.xlsm
Was mich irritiert hat: In deiner Tabelle1 final, stehen andere ISBN-Nummern als in Tabelle1 bzw. 2.
VG Regina
AW: Werte/Daten einfügen unter letztem Eintrag
06.10.2019 23:37:18
Berger
Hallo Regina!
Vielen, vielen Dank für deinen Beispiel-code, ich bin begeistert. Und auch vielen Dank für den Hinweis mit den ISBN. Das war ein Versehen, als ich versucht habe es übersichtlicher zu machen. Gleiche Artikel sollen jeweils die gleiche ISBN besitzen.
Ich habe gerade einige Zeit druch deinen Code geschaut und dies und das nachgeschlagen, aber so ganz versteh ich die Vorgehensweise ehrlich gesagt noch nicht. Ich habe hier in den KOmmentaren mimmer nach einer Befehlszeile notiert wie ich diese verstehe.. ich denke da sind ein paar Verständnisfehler drin..

Option Explicit
Public Sub Uebertrag()
Dim obj_wks_ziel As Worksheet
Dim obj_wks_quelle As Worksheet
Dim rng_gefunden As Range
Dim lng_letzte_zeile As Long
Dim lng_zeile As Long
Set obj_wks_ziel = Worksheets("Tabelle1")  ' Hier Zieltabellenblatt benennen
Set obj_wks_quelle = Worksheets("Tabelle2")  ' Hier Quelltabellenblatt benennen
lng_letzte_zeile = obj_wks_ziel.Cells(Rows.Count, 1).End(xlUp).Row + 1 ' Letzte zeile im  _
Zielblatt ermitteln
lng_zeile = 2       ' Startzeile im Quellblatt
With obj_wks_quelle
Do Until .Cells(lng_zeile, 1) = ""  ' Quellblatt ab Zeile 2 bis zur ersten leeren Zelle in  _
A durchlaufen
Set rng_gefunden = obj_wks_ziel.Range("B:B").Find(.Cells(lng_zeile, 2)) ' der Variablen  _
rng_gefunden wird die Zelle aus der RAnge - hier die Spalte B aus Tabelle 1 - zugeordnet welcher der Zelle (2,2) also B2 hier also die ISBN 222 entspricht.
If Not rng_gefunden Is Nothing Then 'wenn die Zelle B2 nicht leer ist dann
If obj_wks_ziel.Cells(rng_gefunden.Row, 3)  .Cells(lng_zeile, 3) Then 'wenn Wert  _
aus ( 2.Zeile, 3.Spalte) der Tabelle 1 nicht gleich  Wert der (2.Zeile, 3.Spalte) aus welcher Datei? Aus Tabelle 2 da am anfang"With obj_wks_quelle" stand?
obj_wks_ziel.Cells(rng_gefunden.Row, 5) = obj_wks_ziel.Cells(rng_gefunden.Row,  _
3)'dann wird die Zielzelle (2.Zeile, 5.Spalte) in Tabelle 1 gleich der Zelle (2.ZEile, 3. SPalte) der TAbelle 1 gesetzt (altesDatum in Spalte 5 notieren)
obj_wks_ziel.Cells(rng_gefunden.Row, 3) = .Cells(lng_zeile, 3) 'dann wird die  _
Zielzelle (2.Zeile, 3.Spalte) in Tabelle 1 gleich der Zelle (2.ZEile, 3. SPalte) der TAbelle 2 gesetzt
End If
Else 'wenn die zelle B2 leer war dann
obj_wks_ziel.Cells(lng_letzte_zeile, 1) = .Cells(lng_zeile, 1) ' Daten von Quelle  _
auf Ziel übertragen, zelle(letzte zeile, 1.Spalte) in Tabelle1 wird Zelleninhalt (2.Zeile,1.Spalte) ? von Tabelle 2 wegen "With" statement?
obj_wks_ziel.Cells(lng_letzte_zeile, 2) = .Cells(lng_zeile, 2) 'zelle(letzte zeile,  _
2.Spalte) in Tabelle1 wird Zelleninhalt (2.Zeile,1.Spalte) von welcher Datei?
obj_wks_ziel.Cells(lng_letzte_zeile, 3) = .Cells(lng_zeile, 3)
obj_wks_ziel.Cells(lng_letzte_zeile, 4) = .Cells(lng_zeile, 4)
lng_letzte_zeile = lng_letzte_zeile + 1' letzte Zeile wird leerzeile?
End If
lng_zeile = lng_zeile + 1
Loop
End With
End Sub
Nach EndIf hab ich glaube irgendetwas nicht verstanden, denn so wie ich es verstehe würde dann der Eintrag von Mütze, also der letzte, in der 2. Zeile stehen müssen,..? Ich weiss leider nicht was mein Denkfehler ist.. könntest du mir das vielleicht noch einmal erklären?
Dankeschön!!
Anzeige
AW: Werte/Daten einfügen unter letztem Eintrag
07.10.2019 07:26:40
Regina
Hi,
hier nochmal durch KOmmentare von mir ergänzt:

Public Sub Uebertrag()
Dim obj_wks_ziel As Worksheet
Dim obj_wks_quelle As Worksheet
Dim rng_gefunden As Range
Dim lng_letzte_zeile As Long
Dim lng_zeile As Long
Set obj_wks_ziel = Worksheets("Tabelle1")  ' Hier Zieltabellenblatt benennen
Set obj_wks_quelle = Worksheets("Tabelle2")  ' Hier Quelltabellenblatt benennen
lng_letzte_zeile = obj_wks_ziel.Cells(Rows.Count, 1).End(xlUp).Row + 1 ' Letzte zeile im _
Zielblatt ermitteln
lng_zeile = 2       ' Startzeile im Quellblatt
With obj_wks_quelle
Do Until .Cells(lng_zeile, 1) = ""  ' Quellblatt ab Zeile 2 bis zur ersten leeren Zelle in  _
_
A durchlaufen
Set rng_gefunden = obj_wks_ziel.Range("B:B").Find(.Cells(lng_zeile, 2)) ' der Variablen  _
_
rng_gefunden wird die Zelle aus der RAnge - hier die Spalte B aus Tabelle 1 - zugeordnet  _
welcher der Zelle (2,2) also B2 hier also die ISBN 222 entspricht.
If Not rng_gefunden Is Nothing Then 'wenn die ISBN aus Tabelle 2 in Tabelle 1 nicht  _
gefunden wurde
If obj_wks_ziel.Cells(rng_gefunden.Row, 3)  .Cells(lng_zeile, 3) Then 'wenn Wert  _
_
aus ( 2.Zeile, 3.Spalte) der Tabelle 1 nicht gleich  Wert der (2.Zeile, 3.Spalte) aus welcher  _
Datei? Aus Tabelle 2 da am anfang"With obj_wks_quelle" stand? GENAU!!
' Heißt wenn das Datum abweicht
obj_wks_ziel.Cells(rng_gefunden.Row, 5) = obj_wks_ziel.Cells(rng_gefunden.Row,  _
_
3) 'dann wird die Zielzelle (2.Zeile, 5.Spalte) in Tabelle 1 gleich der Zelle (2.ZEile, 3.  _
SPalte) der TAbelle 1 gesetzt (altesDatum in Spalte 5 notieren)
obj_wks_ziel.Cells(rng_gefunden.Row, 3) = .Cells(lng_zeile, 3) 'dann wird die _
Zielzelle (2.Zeile, 3.Spalte) in Tabelle 1 gleich der Zelle (2.ZEile, 3. SPalte) der TAbelle 2  _
gesetzt
End If
Else 'wenn die ISBN nicht gefunden wurde, wird der Artikel in Tabelle 1 hinten angefügt
obj_wks_ziel.Cells(lng_letzte_zeile, 1) = .Cells(lng_zeile, 1) ' Daten von Quelle _
auf Ziel übertragen, zelle(letzte zeile, 1.Spalte) in Tabelle1 wird Zelleninhalt (jeweilige  _
zeile die in Quell erreicht wird,1.Spalte) ? von Tabelle 2 wegen "With" statement? GENAU!
obj_wks_ziel.Cells(lng_letzte_zeile, 2) = .Cells(lng_zeile, 2) 'zelle(letzte zeile,  _
_
2.Spalte) in Tabelle1 wird Zelleninhalt (2.Zeile,1.Spalte) von welcher Datei?
obj_wks_ziel.Cells(lng_letzte_zeile, 3) = .Cells(lng_zeile, 3)
obj_wks_ziel.Cells(lng_letzte_zeile, 4) = .Cells(lng_zeile, 4)
lng_letzte_zeile = lng_letzte_zeile + 1 ' letzte Zeile wird leerzeile?  _
lng_letzte_zeile wird hochgezählt, weil eine neue Zeile in tabelle 1 angefügt wurde und somit die nächste neue Zeile eine Zeile drunter eingetragen werden muss
End If
lng_zeile = lng_zeile + 1 ' "Sprung in die nächste zeile vom Quellblatt
Loop
End With
End Sub
Grundsätzlich alles was zwischen With und End With steht und nur mit einem "." beginnt, bezieht sichauf das Objekt hinter dem With, in diesem Fall das Quellblatt (Tabelle2). In der Do...Loop wird jedesmal vor dem Loop lng_zeile um einen hochgezählt und so das Quellblatt Zeile für Zeile abgearbeitet.
Der zweite Zeilenzähler (lng_letzte_zeile) wird zuerst auf die erste leere Zeile von tabelle 1 gesetzt. Jedesmal, wenn ein neuer Artikel von Tabelle 2 auf Tabelle 1 übertragen wird, muss dieser Zähler anschließeden um einen hochgezählt werden, weil die erste leere Zeile dann "eine Zeile nach unten rutscht".
Gruß
Regina
Anzeige
AW: Werte/Daten einfügen unter letztem Eintrag
07.10.2019 15:47:19
Berger
Hallo Regina,
vielen DAnk für deine Antwort. Ich bin mir nicht sicher, ob ich es nicht finde, aber ich habe keine Find-Methode in der DAtei finden können, die hier als link angegeben ist.
Ansonsten noch einmal vielen Dank für die Erklärungen in den Kommentaren. Ich habe es fast verstanden, denke ich ;).. ich muss es mir noch einmal durch den Kopf gehen lassen.. ich lasse das Topic deshalb noch einmal offen..
ich werde versuchen es selber hinzubekommen, wenn ich beliebig große Tabellen habe..
AW: Werte/Daten einfügen unter letztem Eintrag
07.10.2019 15:51:28
Regina
Hi,
die FIND-Methode steckt in dieser Zeile:
Set rng_gefunden = obj_wks_ziel.Range("B:B").Find(.Cells(lng_zeile, 2))
Es wird im Zielblatt (Tabelle 1) in der Spalte B nach dem Wert gesucht, der im Quellblatt (Tabelle 2, hier durch das Withobjekt hinterlegt) in der Spalte B (das ist die 2 hinter dem Komma) der gerade aktuellen Zeile steht.
Sollte Find erforlgreich sein, steht in rng_gefunden die Zelladresse der Zelle, in die der Treffer war. Sollte nichts gefunden werden, enthält rng_gefunden Nothing.
Gruß
Regina
Anzeige
AW: Werte/Daten einfügen unter letztem Eintrag
07.10.2019 09:37:38
Piet
Hallo Hannah
wie ich sehe interessierst du dich für VBA. - Hier mal mein Code, den ich nicht abgeschickt habe, als die Lösung von Regina vorlag.
Ich schicke ihn dir trotzdem, damit du siehst das man die gleiche Aufgabe auf vewrschiedene Art lösen kann. z.B. mit For Next mit Each.
Bei vielen Daten dürfte die Lösung von Regina über Find Methode günstiger sein. Die Laufzeit ist dann kürzer! Beides funktioniert.
mfg Piet
Sub Artikel_aktualisieren()
Dim AC As Range, lz1 As Long
Dim AJ As Range, lz2 As Long
Dim Tb2 As Worksheet, z2 As Long
Set Tb2 = Worksheets("Tabelle2")
With Worksheets("Tabelle1")
'LastZell in Tabelle1 + 2 suchen
lz1 = .Cells(Rows.Count, 2).End(xlUp).Row
lz2 = Tb2.Cells(Rows.Count, 2).End(xlUp).Row
'zwei Schleifen zum Tabelle1 + 2 vergleichen
For Each AC In .Range("A2:A" & lz1)
For Each AJ In Tb2.Range("A2:A" & lz2)
If AC.Value = Empty Or AC.Value = "Artikel" Then GoTo nx
If AC.Value = AJ.Value Then    'Artikelname vergleichen
If AC.Cells(1, 2) = AJ.Cells(1, 2) Then  'ISBN vergleichen
If CDate(AC.Cells(1, 3))  CDate(AJ.Cells(1, 3)) Then _
AJ.Cells(1, 3).Value = AC.Cells(1, 3).Value  'akt. Datum
AJ.Cells(1, 4).Value = AC.Cells(1, 4).Value  'Einf. Datum
GoTo nx  'restliche Artikel überspringen
End If
End If
Next AJ
'Neue Daten in Liste unten anhaengen
z2 = Tb2.Cells(Rows.Count, 2).End(xlUp).Row
AC.Resize(1, 3).Copy
Tb2.Cells(z2 + 1, 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
nx:  'restliche Artikel überspringen
Next AC
End With
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige