Excel - Auslesen von Daten und Einfügen in anderes Arbeitsblatt
Hallo,
bin neu hier und habe ein Problem bezüglich einer Automation für Excel. Wäre euch für jede Hilfe dankbar, bin eigentlich einigermaßen IT-erfahren habe nur die letzten Jahre wenig in der Richtung gemacht.
Problem ist folgendes:
Es sollen aus 2 sich von der Zeilenanzahl verändernden Excelblättern die immer selben Daten ausgelesen werden und in ein drittes Datenblatt eingefügt werden.
Dabei geht es um einen Lieferantenvergleich, Problem dabei ist, da es sich um Gemüse/Obst handelt, das immer mal wieder Artikel dazu kommen und auch wieder rausfallen, ausgelesen soll aber nur der Stammkern, der immer in den beiden Tabellen vorkommt, werden. Dieser ist auch anhand sich nicht verändernder Artikelnummern identifizierbar, ich weiß leider nur nicht wie ich Excel beibringe auf die Artikelnummern, also den Wert und nicht auf Zelle/Spalte einzugehen, weil sonst würde ja der Sverweis gehen.
Natürlich soll auch der zur Artikelnummer gehörende Preis übertragen werden.
Hoffe ich habe mich verständlich ausgedrückt.
Danke für jede Hilfe
Stephan
bin neu hier und habe ein Problem bezüglich einer Automation für Excel. Wäre euch für jede Hilfe dankbar, bin eigentlich einigermaßen IT-erfahren habe nur die letzten Jahre wenig in der Richtung gemacht.
Problem ist folgendes:
Es sollen aus 2 sich von der Zeilenanzahl verändernden Excelblättern die immer selben Daten ausgelesen werden und in ein drittes Datenblatt eingefügt werden.
Dabei geht es um einen Lieferantenvergleich, Problem dabei ist, da es sich um Gemüse/Obst handelt, das immer mal wieder Artikel dazu kommen und auch wieder rausfallen, ausgelesen soll aber nur der Stammkern, der immer in den beiden Tabellen vorkommt, werden. Dieser ist auch anhand sich nicht verändernder Artikelnummern identifizierbar, ich weiß leider nur nicht wie ich Excel beibringe auf die Artikelnummern, also den Wert und nicht auf Zelle/Spalte einzugehen, weil sonst würde ja der Sverweis gehen.
Natürlich soll auch der zur Artikelnummer gehörende Preis übertragen werden.
Hoffe ich habe mich verständlich ausgedrückt.
Danke für jede Hilfe
Stephan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 137371
Url: https://administrator.de/forum/excel-auslesen-von-daten-und-einfuegen-in-anderes-arbeitsblatt-137371.html
Ausgedruckt am: 23.12.2024 um 20:12 Uhr
21 Kommentare
Neuester Kommentar
Hallo StephanAmount!
Probiers mal damit:
Wobei die Konstanten entsprechend angepasst werden müssen.
Den Quellcode im VB-Editor in ein Modul kopieren und mit <Extras><Makro><Makros><InitTabelleNeu> Makro starten.
Das Makro vergleicht die Namen der beiden Tabellen und bei Übereinstimmung, werden die entsprechenden Werte in die neue Tabelle geschrieben.
Gruß Dieter
[edit] geändert [/edit]
Probiers mal damit:
Option Explicit
Option Compare Text
Const SheetNeu = "Tabelle1" 'Tabellenname Neu
Const SheetAn1 = "Tabelle2" 'Tabellenname Artikel 1
Const SheetAn2 = "Tabelle3" 'Tabellenname Artikel 2
Const StartZeile = 2 'Startzeile Tabelle1
Const SpalteArtNr = 1 'Spalte Tabelle2/3 Artikel-Nummer
Const SpalteNamen = 2 'Spalte Tabelle2/3 Artikel-Bezeichnung
Const SpaltePreis = 3 'Spalte Tabelle2/3 Preis
Const SpalteN1 = 1 'Spalte Tabelle2 Namen
Const SpalteA1 = 2 'Spalte Tabelle2 ArtNr
Const SpalteP1 = 3 'Spalte Tabelle2 Preis
Const SpalteA2 = 4 'Spalte Tabelle3 ArtNr
Const SpalteP2 = 5 'Spalte Tabelle3 Preis
Sub InitTabelleNeu()
Dim Wks0 As Worksheet, Wks1 As Worksheet, Wks2 As Worksheet
Dim NextLine As Long, c As Range, i As Long
Set Wks0 = Sheets(SheetNeu)
Set Wks1 = Sheets(SheetAn1)
Set Wks2 = Sheets(SheetAn2)
NextLine = StartZeile
For i = StartZeile To Wks1.Cells(Rows.Count, SpalteNamen).End(xlUp).Row
Set c = Wks2.Columns(SpalteNamen).Find(Wks1.Cells(i, SpalteNamen), LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
With Wks0
.Cells(NextLine, SpalteN1) = Wks1.Cells(i, SpalteNamen)
.Cells(NextLine, SpalteA1) = Wks1.Cells(i, SpalteArtNr)
.Cells(NextLine, SpalteP1) = Wks1.Cells(i, SpaltePreis)
.Cells(NextLine, SpalteA2) = Wks2.Cells(c.Row, SpalteArtNr)
.Cells(NextLine, SpalteP2) = Wks2.Cells(c.Row, SpaltePreis)
NextLine = NextLine + 1
End With
End If
Next
End Sub
Den Quellcode im VB-Editor in ein Modul kopieren und mit <Extras><Makro><Makros><InitTabelleNeu> Makro starten.
Das Makro vergleicht die Namen der beiden Tabellen und bei Übereinstimmung, werden die entsprechenden Werte in die neue Tabelle geschrieben.
Gruß Dieter
[edit] geändert [/edit]
Hallo StephanAmount!
Wie jetzt? Oben hast Du geschrieben, die Artikel wären anhand der Artikelnummer indentifizierbar?
Ich bin bei meinem Beispiel davon ausgegangen, das es zwei Tabellen gibt, in denen sich in den gleichen Spalten die Artikel-Nr. und der Preis befindet und wenn in beiden Tabellen die gleiche Artikenummer vorkommt, dann sollen diese in das neue Tabellenblatt übernommen werden. Wie auch immer, am sinnvollsten wäre es, wenn Du mal ein explizites Ist/Soll-Beispiel postest.
Grüße aus Mannheim
Dieter
Wie jetzt? Oben hast Du geschrieben, die Artikel wären anhand der Artikelnummer indentifizierbar?
Ich bin bei meinem Beispiel davon ausgegangen, das es zwei Tabellen gibt, in denen sich in den gleichen Spalten die Artikel-Nr. und der Preis befindet und wenn in beiden Tabellen die gleiche Artikenummer vorkommt, dann sollen diese in das neue Tabellenblatt übernommen werden. Wie auch immer, am sinnvollsten wäre es, wenn Du mal ein explizites Ist/Soll-Beispiel postest.
Grüße aus Mannheim
Dieter
Hallo StephanAmount!
Aja, jetzt hab ich's auch verstanden, wobei mir nicht ganz klar ist, warum bei einem Lieferanten Tomaten die Bezeichnung Wassermelonen tragen
Code oben geändert.
Gruß Dieter
Aja, jetzt hab ich's auch verstanden, wobei mir nicht ganz klar ist, warum bei einem Lieferanten Tomaten die Bezeichnung Wassermelonen tragen
Code oben geändert.
Gruß Dieter
Hallo Stephan!
Wenn ich das richtig verstehe, dann meinst Du eine Art Zeilenumbruch. D.h. nur bis zu einer festgelegten Zeile und dann wieder oben ein paar Spalten weiter beginnen.
Mit ein paar zusätzlichen Codezeilen läßt sich das auch machen
Das Problem mit den unterschiedlichen Artikelbezeichnungen könnte man auch lösen und je nach Größenordnung eine Extra-Tabelle oder ein einfaches Text-Array verwenden. Oder eine komplette Liste in einer Extra-Tabelle?
Beispiel Tabelle:
Beispiel Array (pärchenweise):
Machen kann man fast alles, die Frage ist dann immer nur DAS WIE
Wünsche auch ein schönes WE und Grüße aus Mannheim
Dieter
Wenn ich das richtig verstehe, dann meinst Du eine Art Zeilenumbruch. D.h. nur bis zu einer festgelegten Zeile und dann wieder oben ein paar Spalten weiter beginnen.
Mit ein paar zusätzlichen Codezeilen läßt sich das auch machen
Das Problem mit den unterschiedlichen Artikelbezeichnungen könnte man auch lösen und je nach Größenordnung eine Extra-Tabelle oder ein einfaches Text-Array verwenden. Oder eine komplette Liste in einer Extra-Tabelle?
Beispiel Tabelle:
A | B | |
18 | Tomaten | Wassermelonen |
Beispiel Array (pärchenweise):
GleicheArtikel = Array("Tomaten", "Wassermelonen", "Salat", "Grüne Blätter") |
Machen kann man fast alles, die Frage ist dann immer nur DAS WIE
Wünsche auch ein schönes WE und Grüße aus Mannheim
Dieter
Hallo Stephan!
Hier der neue Code mit Zeilenumbruch:
Die neuen Konstanten entsprechend anpassen:
Codezeile 09 = Bis zu dieser Zeile schreiben, danach wieder ab StartZeile
Codezeile 10 = Anzahl freie Spalten zwischen den einzelnen Blöcken (A:E|Anzahl Leer|X:Y...)
Gruß Dieter
Hier der neue Code mit Zeilenumbruch:
Option Explicit
Option Compare Text
Const SheetNeu = "Tabelle1" 'Tabellenname Neu
Const SheetAn1 = "Tabelle2" 'Tabellenname Artikel 1
Const SheetAn2 = "Tabelle3" 'Tabellenname Artikel 2
Const StartZeile = 2 'Zeile Starten Tabelle1
Const BreakZeile = 40 'Zeile Umbruch Tabelle1
Const FreiSpalte = 1 'Spalte Anzahl Spalten freilassen Tabelle1
Const SpalteArtNr = 1 'Spalte Tabelle2/3 Artikel-Nummer
Const SpalteNamen = 2 'Spalte Tabelle2/3 Artikel-Bezeichnung
Const SpaltePreis = 3 'Spalte Tabelle2/3 Preis
Const SpalteN1 = 1 'Spalte Tabelle2 Name
Const SpalteA1 = 2 'Spalte Tabelle2 ArtNr
Const SpalteP1 = 3 'Spalte Tabelle2 Preis
Const SpalteA2 = 4 'Spalte Tabelle3 ArtNr
Const SpalteP2 = 5 'Spalte Tabelle3 Preis
Sub InitTabelleNeu()
Dim Wks0 As Worksheet, Wks1 As Worksheet, Wks2 As Worksheet
Dim NextLine As Long, NextCols As Long, c As Range, i As Long
Set Wks0 = Sheets(SheetNeu)
Set Wks1 = Sheets(SheetAn1)
Set Wks2 = Sheets(SheetAn2)
Wks0.Rows(StartZeile & ":" & Wks0.Cells(Rows.Count, SpalteN1).End(xlUp).Row).ClearContents
NextLine = StartZeile: NextCols = 0
For i = StartZeile To Wks1.Cells(Rows.Count, SpalteNamen).End(xlUp).Row
Set c = Wks2.Columns(SpalteNamen).Find(Wks1.Cells(i, SpalteNamen), LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
With Wks0
.Cells(NextLine, SpalteN1 + NextCols) = Wks1.Cells(i, SpalteNamen)
.Cells(NextLine, SpalteA1 + NextCols) = Wks1.Cells(i, SpalteArtNr)
.Cells(NextLine, SpalteP1 + NextCols) = Wks1.Cells(i, SpaltePreis)
.Cells(NextLine, SpalteA2 + NextCols) = Wks2.Cells(c.Row, SpalteArtNr)
.Cells(NextLine, SpalteP2 + NextCols) = Wks2.Cells(c.Row, SpaltePreis)
NextLine = NextLine + 1
If NextLine > BreakZeile Then
NextLine = StartZeile
NextCols = NextCols + SpalteP2 + FreiSpalte
End If
End With
End If
Next
End Sub
Codezeile 09 = Bis zu dieser Zeile schreiben, danach wieder ab StartZeile
Codezeile 10 = Anzahl freie Spalten zwischen den einzelnen Blöcken (A:E|Anzahl Leer|X:Y...)
Gruß Dieter
Hallo Stephan!
Irgendwie blicke ich da jetzt nicht mehr so richtig durch.
Von daher erst nochmal die Funktion des Makros:
Schritt 1: Löschen des aktuellen Inhalts ab der StartZeile in Tabelle1
Schritt 2: Alle Zeilen in Tabelle 2 Spalte B (Namen) durchlaufen und Namen in Tabelle 3 Spalte B suchen:
Schritt 3: Wenn gefunden, dann in Tabelle1 eintragen:
Das ist der aktuelle Ablauf
Jetzt sehe ich anhand Deiner Aufstellung sowas: 4200 Aprikose kg 1,00 5,000 10,80
Wobei sich mir zuerst mal die Frage stellt, wie steht das jetzt in der Tabelle?
Und sieht die Tabelle des anderen Lieferanten genauso aus?
Bei der aktuellen Suche, wird explizit nach dem ganzen Zellinhalt in Namen gesucht.
D.h. "Aprikose" findet nicht "Aprikosen" sondern nur "Aprikose"
Beim ändern des Parameters xlWhole in xlPart, wäre diese Ergebnis zu erwarten:
"Aprikose" findet "Aprikosen" aber "Aprikosen" findet nicht "Aprikose"
Möglich wäre dann noch, nur nach einer bestimmten Anzahl von Buchstaben zu suchen z.B.:
Left("Aprikosen", 5), das würde dann nach "Aprik" suchen
Gruß Dieter
Irgendwie blicke ich da jetzt nicht mehr so richtig durch.
Von daher erst nochmal die Funktion des Makros:
Schritt 1: Löschen des aktuellen Inhalts ab der StartZeile in Tabelle1
Schritt 2: Alle Zeilen in Tabelle 2 Spalte B (Namen) durchlaufen und Namen in Tabelle 3 Spalte B suchen:
A | B | C | ... | A | B | C | |
1 | Art-Nr. | Namen | Preis | ... | Art-Nr. | Namen | Preis |
X | 12345 | Aprikose | 10,80 | ... | 98765 | Aprikose | 11,90 |
A | B | C | D | E | |
1 | Namen | Art-Nr. | Preis | Art-Nr. | Preis |
X | Aprikose | 12345 | 10,80 | 98765 | 11,90 |
Jetzt sehe ich anhand Deiner Aufstellung sowas: 4200 Aprikose kg 1,00 5,000 10,80
Wobei sich mir zuerst mal die Frage stellt, wie steht das jetzt in der Tabelle?
4200 | Aprikose | ? | ? | ? | ? |
Bei der aktuellen Suche, wird explizit nach dem ganzen Zellinhalt in Namen gesucht.
D.h. "Aprikose" findet nicht "Aprikosen" sondern nur "Aprikose"
Beim ändern des Parameters xlWhole in xlPart, wäre diese Ergebnis zu erwarten:
"Aprikose" findet "Aprikosen" aber "Aprikosen" findet nicht "Aprikose"
Möglich wäre dann noch, nur nach einer bestimmten Anzahl von Buchstaben zu suchen z.B.:
Left("Aprikosen", 5), das würde dann nach "Aprik" suchen
Gruß Dieter
Hallo Stephan!
Da haben wir aber ganz schön aneinander vorbeigeredet. Ich hatte das irgendwie so verstanden, dass eine Tabelle erstellt werden soll, die alle Artikel aufführt, die in beiden Lieferanten-Tabellen mit gleicher Bezeichnung (Namen) zu finden sind.
Dann bleibt die Frage, weil Du es erwähnt hattest, ob in Deiner Tabelle jetzt alles untereinander oder über mehrere Spalten verteilt ist?
Gruß Dieter
Zitat von @StephanAmount:
hoffe ich hab´s gut ausgedrückt um was es geht und du bist noch net sauer auf mich
Ja mei. Sauer bin ich noch net, awwer dess konn noch kumme, wenn Du mich nochmal so hinters Licht führsthoffe ich hab´s gut ausgedrückt um was es geht und du bist noch net sauer auf mich
Da haben wir aber ganz schön aneinander vorbeigeredet. Ich hatte das irgendwie so verstanden, dass eine Tabelle erstellt werden soll, die alle Artikel aufführt, die in beiden Lieferanten-Tabellen mit gleicher Bezeichnung (Namen) zu finden sind.
Dann bleibt die Frage, weil Du es erwähnt hattest, ob in Deiner Tabelle jetzt alles untereinander oder über mehrere Spalten verteilt ist?
Gruß Dieter
Hallo Stephan!
Auf ein Neues:
Gruß Dieter
Auf ein Neues:
Option Explicit
Option Compare Text
Const SheetNeu = "Tabelle1" 'Tabellenname Neu
Const SheetAn1 = "Tabelle2" 'Tabellenname Lieferant1
Const SheetAn2 = "Tabelle3" 'Tabellenname Lieferant2
Const StartZeile = 2 'Zeile Starten Tabelle1
Const SpalteArtNr = 1 'Spalte Tabelle2/3 Artikel-Nummer
Const SpalteNamen = 2 'Spalte Tabelle2/3 Artikel-Bezeichnung
Const SpaltePreis = 3 'Spalte Tabelle2/3 Preis
Const SpalteN1 = 1 'Spalte Tabelle2 Name
Const SpalteA1 = 2 'Spalte Tabelle2 ArtNr
Const SpalteP1 = 3 'Spalte Tabelle2 Preis
Const SpalteA2 = 4 'Spalte Tabelle3 ArtNr
Const SpalteP2 = 5 'Spalte Tabelle3 Preis
Sub InitTabelleNeu3()
Dim Wks0 As Worksheet, Wks1 As Worksheet, Wks2 As Worksheet, c As Range, i As Long
Set Wks0 = Sheets(SheetNeu)
Set Wks1 = Sheets(SheetAn1)
Set Wks2 = Sheets(SheetAn2)
For i = StartZeile To Wks0.Cells(Rows.Count, SpalteA1).End(xlUp).Row
Set c = Wks1.Columns(SpalteArtNr).Find(Wks0.Cells(i, SpalteA1), LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then Wks0.Cells(i, SpalteP1) = Wks1.Cells(c.Row, SpaltePreis)
Next
For i = StartZeile To Wks0.Cells(Rows.Count, SpalteA2).End(xlUp).Row
Set c = Wks2.Columns(SpalteArtNr).Find(Wks0.Cells(i, SpalteA2), LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then Wks0.Cells(i, SpalteP2) = Wks2.Cells(c.Row, SpaltePreis)
Next
End Sub
Gruß Dieter
Hallo Stephan!
Auch einen schönen guten Morgen!
Sorry, da hatte sich doch tatsächlich ein Fehler in Zeile 28 und 32 eingeschlichen (i anstatt c.Row) Hab's oben korrigiert.
Hoffe der Preis vom Thai-Spargel stimmt jetzt
Gruß Dieter
PS. Nja, muc is äh bissl weit, ca 350Km bis Schwabing und glaube nochmal ca 30Km nach Oberföhring. Ist schon ne Weile her, als ich das letztemal in der Gegend war Trotzdem Danke für das Angebot
Auch einen schönen guten Morgen!
Sorry, da hatte sich doch tatsächlich ein Fehler in Zeile 28 und 32 eingeschlichen (i anstatt c.Row) Hab's oben korrigiert.
Hoffe der Preis vom Thai-Spargel stimmt jetzt
Gruß Dieter
PS. Nja, muc is äh bissl weit, ca 350Km bis Schwabing und glaube nochmal ca 30Km nach Oberföhring. Ist schon ne Weile her, als ich das letztemal in der Gegend war Trotzdem Danke für das Angebot
Hallo Stephan!
Gern geschehen
Ja, dann bis demnächst
Gruß Dieter
Gern geschehen
wünsche dir noch eine gute Woche und vielleicht schaffst es ja doch mal wieder nach MUC, ansonsten sieht man sich bestimmt
noch öfter hier.
Danke, wünsche Dir auch ne angenehme Woche.noch öfter hier.
Ja, dann bis demnächst
Gruß Dieter