Mein Problem: Ich habe auf dem Tabellenblatt 1 in Spalte A Nummern stehen, und in Spalte B die dazugehörigen Werte. Jetzt sollen diese Werte auf das Tabellenblatt 2 in die Spalte B entsprechend zu den dortigen Nummern der Spalte A einsortiert werden. Die Tabellen sind sowohl in Tabelle 1 und auch in Tabelle 2 dynamisch, sind jeweils von vorherigen Eingaben abhängig.
Beispiel: Auf Tabellenblatt 1 ist zur „Nummer 7“ der „Wert 391“ zugewiesen. Dieser Wert soll per Makro auf das Tabellenblatt 2 zur der dortigen „Nummer 7“ als in das Feld „E4“ eingetragen werden „Nummer 13“ mit „Wert 390“ auf Feld „E16“, „Nummer 5“ mit „Wert 379“ auf Feld „E17“ usw.
Auf dem Tabellenblatt 1 unter Spalte „G-H (Ziel)“ ist das für mich angestrebte Ziel, so soll es dann aussehen.
Ich habe bisher noch keine Idee oder kenne noch keinen Befehl, der mir diese erlaubt, da meine VBA-Kenntnisse noch nicht so weit sind. Jetzt benötige ich Eure Hilfe, wie kann ich das realisieren?
Ich hoffe, mich mit meinem Problem verständlich ausgedrückt zu haben.
Eine Testdatei habe ich mal angefertigt und ist angehängt. In meiner Testdatei habe ich auch schon mal etwas vorbereitet. Über den blauen Button werden die Werte von der Spalte B (Tabellenblatt 1) auf die Spalte B (Tabellenblatt 2) leider nur „kopiert ohne Einsortierung“. Und damit man nicht ständig die Tabellenblätter hin und her wechseln muss, als Kontrolle in die Spalte E (Tabellenblatt 1), zurückkopiert.
ja, das funktioniert, jedoch für mich nur bedingt. Die Tabelle ist dynamisch, das heißt auch, die Anzahl der Zeilen kann von 5 bis 100 sein. Und ich möchte das gerne in mein Makro einbauen. Bei deiner Antwort, muss ich den Sverweis ja in die einzelnen Zellen reinschreiben.
Kann man das nicht über eine For-Next-Schleife oder anders realisieren?
06.11.2020, 14:14 (Dieser Beitrag wurde zuletzt bearbeitet: 06.11.2020, 14:15 von ralf_b.)
Code:
Sub Übertragen() Dim i As Long, i1 As Long, i2 As Long, x As Long Dim rFund As Range, rBereich2 As Range
i2 = Worksheets("Tabelle2").Cells(Rows.Count, 1).End(xlUp).Row Set rBereich2 = Worksheets("Tabelle2").Range("A3:A" & i2)
With Worksheets("Tabelle1")
i1 = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 3 To i1
Set rFund = rBereich2.Find(.Cells(i, 1).Value, LookIn:=xlValues, Lookat:=xlWhole) If Not rFund Is Nothing Then rFund.Offset(, 4).Value = .Cells(i, 1).Offset(, 1).Value End If
06.11.2020, 14:15 (Dieser Beitrag wurde zuletzt bearbeitet: 06.11.2020, 14:16 von Klaus-Dieter.)
Hallo,
dynamisch im Sinne von Daten die dazukommen, ist ja (fast) jede Excelliste. Bestimmt gehöre ich nicht zu den Leuten, die von der Verwendung von Makros abraten. Aber für so ein kleine Liste macht das nun wirklich keinen Sinn. Zumal es eine Standardfunktion gibt, die beim Fortschreiben von Listen automatisch auch die Formel aus den voran gegangenen Zeilen übernimmt.
Zitat aus der Excelhilfe:
[b]Erweiterung der Listenformatierung und -formeln.[/b] Wenn Sie neue Zeilen mit Daten am Ende einer Liste hinzufügen, werden von Excel auf die neuen Zeilen konsistente Formatierungen und Formeln übertragen. Damit ein Format erweitert wird, müssen drei von fünf vorangegangenen Zellen dasselbe Format verwenden. Damit eine Formel erweitert wird, müssen alle vorangegangenen Formeln konsistent sein.
Viele Grüße Klaus-Dieter Der Erfolg hat viele Väter, der Misserfolg ist ein Waisenkind Richard Cobden
erstmal vielen Dank, das du mir hilfst. Ich habe versucht deinen Code zu verstehen, da er bei mir nicht funktioniert und somit nicht das macht, was ich möchte. Die einzelnen Zeilen habe ich mal für mich auskommentiert, was diese Zeilen machen sollen. Bei einigen fehlt mir aber noch einiges an Wissen. Wäre schön, wenn du mir die fehlenden Erklärungen ergänzen könntest und mich weiter unterstützen kannst.
Code:
Sub Übertragen1() Dim i As Long, i1 As Long, i2 As Long, x As Long 'Deklaration der Variablen i, i1, i2, x Dim rFund As Range, rBereich2 As Range 'Deklaration Bereiche rFund, rBereich2 als Range
i2 = Worksheets("Tabelle2").Cells(Rows.Count, 1).End(xlUp).Row 'i2 = letzte Zeile Tabelle 2 Set rBereich2 = Worksheets("Tabelle2").Range("A3:A" & i2) 'rBereich2 (A3-A mit letzter Zeile)
With Worksheets("Tabelle1") 'mit Tabellenblatt 1 i1 = .Cells(Rows.Count, 1).End(xlUp).Row 'i1 = Anzahl letzte Zelle in Spalte A For i = 3 To i1 'Schleife i Beginn Zeile 3 bis Anzahl letzte Zeile Spalte A Set rFund = rBereich2.Find(.Cells(i, 1).Value, LookIn:=xlValues, Lookat:=xlWhole) '? If Not rFund Is Nothing Then '? rFund.Offset(, 4).Value = .Cells(i, 1).Offset(, 1).Value '? End If 'Ende von If Next i 'Schleife next i End With 'Ende von With
wenn der code nicht funktioniert bei dir, dann stimmen deine Angaben wohl nicht.
Code:
Set rFund = rBereich2.Find(.Cells(i, 1).Value, LookIn:=xlValues, Lookat:=xlWhole) 'Sucht den wert aus zelle(i,1) in rBereich2 (in Tabelle 2) If Not rFund Is Nothing Then ' wenn es ein Ergebnis gibt,dann hat rfund einen Wert bzw, ist nicht nothing rFund.Offset(, 4).Value = .Cells(i, 1).Offset(, 1).Value ' rfund ist ein Range , offset(zeile,spalten) geht um 4 Spalten nach rechts vom fund ' cells(i,1) .offest(0,1) nimmt den Wert von einer spalte rechts von cells(i,1)
set bla = nothing löscht objekte, damit sie keine Speicherleichen werden