onthetop79
Goto Top

Verschiedene Spalten mittels VBA in neuer Reihenfolge in neues Excel Importieren

Hallo Zusammen

Ich bräuchte mal wieder Eure Hilfe. Ich muss auch hier zu Beginn gleich offen gestehen, dass ich mit VBA bis anhin nichts am Hut hatte. Jedoch keinen Weg sehe der für solche Problemstellungen daran vorbei führt.

Ich habe folgendes Problem:

Ich bekomme von verschiedenen Lieferanten Preislisten und Preisaktualisierungen als Excel. Da ich diese letztendlich in ein und der selben Formatierung und Reihenfolge haben muss und die Fehler Quelle bei händischen Copy/Paste Übungen relativ gross sind, möchte ich über VBA diese Daten zusammen ziehen können.

Als Vorlage habe ich ein Master aus welchem ich gerne die Quelldatei auswählen und anschliessend die Spaltenzuordnung bestimmen würde. Beim Import soll die Spalten Überschrift der Quelldatei weggelassen werden und die darunterstehenden Daten in der Masterdatei in die vorgewählte Spalte abgefüllt werden. Nach dem Import sollten die Daten in der Master Datei als neue Datei in einem definierten Pfad abgespeichert werden können.

Da die Spalten Reihenfolge in den Quelldatei immer unterschiedlich ist, müssen diese pro Importauftrag gewählt werden können. Die Masterdatei bleibt immer gleich.

Da diese Arbeiten immer öfters d.h z.Z Monatlich für ca. 10 verschiedenen Lieferantenpreislisten durchgeführt werden müssen, möchte ich so die Möglichkeit schaffen, diese Arbeiten intern delegieren zu können. Dies ist nur möglich wenn ich dies "Deppensicher" automatisieren kann.

Hat jemand von Euch schon solch ein VBA Script geschrieben oder könnte mir da jemand zur Hand gehen.

Content-Key: 183880

Url: https://administrator.de/contentid/183880

Printed on: April 23, 2024 at 12:04 o'clock

Member: mak-xxl
mak-xxl Apr 21, 2012 at 07:47:10 (UTC)
Goto Top
Moin ganzoben79,

Zitat von @onthetop79:
... Da die Spalten Reihenfolge in den Quelldatei immer unterschiedlich ist, müssen diese pro Importauftrag gewählt werden können. ...

Aber pro Lieferant haben die Tabellen immer die gleiche Struktur?

Da diese Arbeiten immer öfters d.h z.Z Monatlich für ca. 10 verschiedenen Lieferantenpreislisten durchgeführt
werden müssen, möchte ich so die Möglichkeit schaffen, diese Arbeiten intern delegieren zu können. Dies ist
nur möglich wenn ich dies "Deppensicher" automatisieren kann.

Wenn Du das per fester Verknüpfung (siehe Frage oben) realisieren kannst, reduziert sich das Ganze auf ein Öffnen der Mastertabelle -> Daten werden automatisch aktualisiert (Vorliegen aktueller Lieferantendateien vorausgesetzt) -> Makro an Schaltfläche für 'Speichern einer Kopie unter' ...

Freundliche Grüße von der Insel - Mario
Member: bastla
bastla Apr 21, 2012 at 14:24:39 (UTC)
Goto Top
Hallo onthetop79!

Eine Umsetzung Deiner Vorstellungen in VBA würde etwa so aussehen:
Sub Import()
Set Ziel = ThisWorkbook
ZielDatei = Ziel.FullName
ZielStartSpalte = 1 'Eintrag in Mastertabelle ab Spalte A  
ZielStartZeile = 2 'Eintrag in Mastertabelle ab Zeile 2  
QuellStartZeile = 2 'Daten aus Quelltabelle lesen ab Zeile 2  
QuellEndZeile = 2000 'Daten aus Quelltabelle lesen bis Zeile 2000  

For Each WB In Workbooks 'alle offenen Mappen durchgehen  
    If WB.Name <> Ziel.Name Then 'Mastertabelle nicht verarbeiten  
        'anhand der Vorgaben Import-Routine aufrufen  
        Importieren WB.Worksheets(1), QuellStartZeile, QuellEndZeile, Ziel.Worksheets(1), ZielStartSpalte, ZielStartZeile
        WB.Close False 'Mappe schließen, ohne zu speichern  
        Exit For 'nur erste Mappe verarbeiten  
    End If
Next
Dateiname = "Import"  
Eingabe = InputBox("Bitte den Namen für das Speichern der übernommenen Daten angeben!", "Speichern ...", Dateiname)  
If Eingabe <> "" Then Dateiname = Eingabe  
Ziel.SaveAs Dateiname, xlNormal
Workbooks.Open ZielDatei
'Ziel.Close 'falls die neue Datei automatisch geschlossen werden soll, ersten Apostroph entfernen  
End Sub

Sub Importieren(ByVal QT As Worksheet, ByVal QSZ As Long, ByVal QEZ As Long, ByVal ZT As Worksheet, ByVal ZS As Long, ByVal ZZ As Long)
i = 1 'mit der als 1. zu importierenden Spalte beginnen  
With QT
    Do
        Set c = .Rows(QSZ - 1).Find(i, , xlValues, xlWhole) 'nach Spalte mit Überschrift 1 suchen  
        If c Is Nothing Then Exit Do 'wenn Spaltennummer nicht gefunden wurde, ist der Import abgeschlossen  
        'Zellen aus der gefundenen Spalte von Zeile "QuellStartZeile" bis Zeile "QuellEndZeile" in die Mastertabelle kopieren  
        .Range(.Cells(QSZ, c.Column), .Cells(QEZ, c.Column)).Copy ZT.Cells(ZZ, ZS + i - 1) 'Zellen aus der gefundenen Spalte von Zeile  
        i = i + 1 'Nummer für Importspalte hochzählen  
    Loop
End With
End Sub
Dieses Makro zunächst in die Masterdatei einfügen und diese speichern (Dateityp ab Excel 2007: "Excel-Arbeitsmappe mit Makros").

Danach kann die Importdatei einfach geöffnet und bearbeitet werden. Angenommen habe ich, dass die Daten ab Zeile 2 beginnen (in Zeile 1 stehen die Spaltenüberschriften / Feldnamen) - falls nicht, Zeile 6 des Makros anpassen. In der Zeile über der ersten Datenzeile (also defaultmäßig Zeile 1) kannst Du dann ganz einfach die gewünschte Spaltenreihenfolge festlegen, indem Du die Überschriften durch die Zahlen 1, 2, 3 .. ersetzt. Spalten, die nicht übernommen werden sollen, behalten die bisherige Spaltenüberschrift.

Wenn Du dann das Makro ausführst, werden die Spalten in dieser vorgegebenen Reihenfolge in die Masterdatei (ab der in den Zeilen 4 und 5 des Makros angegebenen Position) übernommen. Danach wird nach dem neuen Dateinamen gefragt und unter diesem Namen gespeichert. Die neue Dateie (auf Wunsch - siehe Zeile 22) und die Importdatei werden geschlossen sowie die "Original"-Masterdatei wieder geöffnet.

Verarbeitet wird übrigens immer die erste gefundene offene Arbeitsmappe (aber natürlich nicht die Masterdatei) - es sollten daher nur die Masterdatei und die Importdatei beim Start des Makros geöffnet sein.

Grüße
bastla
Member: Assistenz
Assistenz Nov 14, 2019 at 12:48:05 (UTC)
Goto Top
Hallo bastla,

vielen Dank für den Input.
Meine Frage: Kann ich die Reihenfolge der Spalten (also die Spaltensortierung) auch aus der Masterdatei auslesen lassen?

Hintergrund:
Ich mache eine komplexe Planung einer komplexen Tour. Im Verlauf der Planung werden mich adnere ablösen in der Zuständigkeit und manche Spalten werden unwichtiger, andere sollten nach vorne rutschen. Wöchentlich wird es einen Import-Routine von "Anmeldedaten" aus dem Backend der Projekt-Website geben - Bewerber geben ihre Daten über's Frontend ein.
Wenn nun die Daten automatisch in der zum jeweiligen Import-Zeitpunkt gegebenen Spaltenreihenfolge sortiert und importiert werden könnten wäre das genial!

Gibt's Ideen? War es verständlich dargelegt?

Beste Grüße!
Member: mak-xxl
mak-xxl Nov 19, 2019 at 10:57:27 (UTC)
Goto Top
Hallo Guliano,

nach so vielen Jahren ...

Bastla ist möglicherweise beschäftigt, deshalb ich - bist Du sicher, dass es noch um die gleiche Sache geht? Weil - 2012 schriebst Du von Lieferanten und Preisen, jetzt von Userdaten?
Egal - mit der obigen Routine können doch jedwede Daten sortiert eingelesen werden! Was soll sich ändern?

Freundliche Grüße von der Insel - Mario
Member: Assistenz
Assistenz Nov 19, 2019 at 11:30:50 (UTC)
Goto Top
Hallo - vielen Dank!

Naja, 2012 war ja nicht ich. Aber weil ich den (laienhaften) Eindruck hatte, mit der obigen Routine könnte das - leicht angepasst - auch für meinen Bedarf passen, habe ich mich eingeklinkt anstatt ein neues Thema zu eröffnen.

Also was ich machen möchte:
- Wöchentlich "Bewerbungsdaten" von einem Online-Formular über's Backend exportieren im xls-Format, ich nenne es jetzt "Imp.xls" Imp.xls hat 1. eine andere Spaltenreihenfolge als und 2. nicht die gleiche Spaltenanzahl wie meine "Master.xls" .
- Dann sollen alle neuen (!) Einträge (Zeilen) aus Imp.xls in Master.xls importiert werden und dabei 1. die richtige Spaltenreihenfolge haben und 2. um die in Imp.xls fehlenden Spalten ergänzt werden (diese bleiben dann zunächst leer).

Hast du dazu eine Idee, wie das umgesetzt werden könnte?

Liebe Grüße!
Julian
Member: mak-xxl
mak-xxl Nov 19, 2019 at 11:55:09 (UTC)
Goto Top
Hallo Julian,

Die Datei 'imp.xls' und 'master.xls' weichen also in Spaltenzahl und -sortierung ab - wäre es eine Option, die 'master.xls' der 'imp.xls' per Sortierung etc. vorab anzugleichen oder ändert sich die 'imp.xls' immer mal wieder? Wenn ja, wäre es evtl. besser, jeden Importvorgang in der 'master.xls' auf einem neuen Blatt landen zu lassen und anschließend die Sortierung und/oder das eventuell erwünschte Umkopieren auf ein "Masterblatt" in der 'master.xls' (per Makro) vornehmen zu lassen.

Freundliche Grüße von der Insel - Mario
Member: Assistenz
Assistenz Nov 21, 2019 at 12:05:11 (UTC)
Goto Top
Hi Mario,

Zu deiner Frage:
Imp.xls ändert sich evtl. noch hin und wieder.
Master.xls würde ich gerne nicht anpassen, wenn dann andersrum: Imp.xls könnte jeweils vor dem Importvorgang angepasst werden - dann aber eben gerne automatisiert um Fehler zu vermeiden.

Zur 2. Frage:
Das könnte auch eine Option sein. Wie würde das funktionieren?

Vielen Dank und beste Grüße!
Julian
Member: Assistenz
Assistenz Nov 21, 2019 updated at 14:25:49 (UTC)
Goto Top
Bzw. die erste, grundlegendste Frage:
Wie kann ich ein Tabellenblatt automatisiert nach der Spalten-Reihenfolge und -zahl eines anderen Blattes anpassen lassen?

Beispiel:
  • Master.xls hat folgende Spalten: A: Veranstaltungsname, B: Kategorie, C: Startdatum, D: Enddatum
  • Imp. xls hat dagegen folgende Spalten (-Reihenfolge): A: Vorname, B: Name, C: Institution, D: e-Mail
  • Die Spalten von Imp.xls erscheinen in Master.xls erst später und dann in variierter Reihenfolge
  • Zu allem übel ist der Spaltenname in Imp.xls teilweise auch etwas anders als in Master.xls (Z. B. "Telefonnummer statt Telefon", oder "Kommentar" statt "Mitteilung von Bewerber*in") - gibt's dafür überhaupt eine Möglichkeit?

Ziel: Daten aus Imp.xls sollen - jeweils in einer Zeile - an der richtigen Stelle in Master.xls landen. Wenn ich etwas von Hand zu kopieren habe, wäre das kein Problem. Nur will ich es vermeiden, die Sortierung manuell vorzunehmen (fehleranfällig) und jede Zelle einzeln zu kopieren.

Ist das verständlich ausgedrückt?

Danke!
Member: mak-xxl
mak-xxl Nov 21, 2019 at 17:36:16 (UTC)
Goto Top
Hallo Julian,

verständlich ausgedrückt - trotzdem folgende Frage:

Die Datei 'imp.xls' wird, nach meinem bisherigen Verständnis, von einem Script etc. gefüllt, das die Daten aus einem Formular
etc. entnimmt und importiert bzw. einträgt? Wenn sich das Formular (also die Datenquelle) ändert, wird die 'imp.xls' also auch
diese Änderungen repräsentieren?

Die Datei 'master.xls' soll sich nicht ändern - das wäre mit einer einfachen und einer aufwendigeren Lösung machbar:

1. einfache Lösung:
Aus der Datei 'imp.xls' werden jeweils die Kopfzeile und die Datenzeilen importiert.
Das kann in der Datei 'master.xls' auf einem Blatt oder, wie bereits erwähnt, auf Einzelblättern erfolgen - die dann i.e. das
Datum des Einlesens der Daten tragen.

2.1. umfangreichere Lösung A:
Das Script/modul/Makro etc., dass die Daten in die 'imp.xls' bringt, nimmt bereits eine Vorsortierung
dergestalt vor, dass i.e. der Vorname, egal wie der Feldname im Formular heißt, immer i.e. in der ersten Spalte der 'imp.xls'
landet. Kann an diesem Script nichts verändert werden, so kann diese Zuordnung auch beim Importieren der Daten aus der
'imp.xls' in die 'master.xls' vorgenommen werden, etwa so:

2.2. umfangreichere Lösung B
- Es gibt eine Hilfstabelle (in der master.xls'), in der als Spaltenüberschrift jeweils eine Bezeichnung (= die Spaltenüberschrift)
der Mastertabelle steht - also i.e. 'Vorname'. darunter sind dann alle Bezeichnungen eingetragen, wie sie in der 'imp.xls' dazu
vorkommen können, also i.e. 'Firstname', 'Vorname', 'Callname' oder was auch immer. Dies wird für jede vorhandene Spalte
der Mastertabelle in der Hilfstabelle hinterlegt und ist auch in der Zukunft immer wieder vom User anpassbar.

- Eine Routine (Makro) in der 'master.xls' ordnet anhand dieser Hilfstabelle die aus der 'imp.xls' gelesenen Daten (= Zellinhalt)
jeweils eine Zielzelle in der Mastertabelle der 'master.xls' zu. Eine Fehlerbehandlung garantiert, dass dem User Daten mit
nicht zuordenbarer Spaltenüberschrift zur Entscheidung vorgelegt werden.

Nun bleibt noch zu sagen, dass der Weg des Importes der jeweiligen Spaltenüberschriften aus der 'imp.xls' der einfachere Weg wäre, dazu kommt, das dann der 'master.xls' zusätzlich zu entnehmen wäre, wann sich jeweils die Struktur der Quelle geändert hat.

Vielleicht noch dies: Die Daten der Hilfstabelle können auch im Quelltext des Makros (i.e. als Array) abgelegt werden, können aber dann durch den Anwender u.U. nicht oder schwer geändert werden.

Nun hoffe ich, dass es verständlich und verdaubar ist.

Freundliche Grüße von der Insel - Mario
Member: Assistenz
Assistenz Nov 22, 2019 updated at 09:48:09 (UTC)
Goto Top
Zitat von @mak-xxl:
Die Datei 'imp.xls' wird, nach meinem bisherigen Verständnis, von einem Script etc. gefüllt, das die Daten aus einem Formular
etc. entnimmt und importiert bzw. einträgt? Wenn sich das Formular (also die Datenquelle) ändert, wird die 'imp.xls' also auch
diese Änderungen repräsentieren?
Ja, wobei das nicht verändert werden kann - es ist ein fest installiertes "Feature" des Backends eines Templates, das für die Erstellung&Verwaltung der Website verwendet wurde/wird.


Zitat von @mak-xxl:
- Eine Routine (Makro) in der 'master.xls' ordnet anhand dieser Hilfstabelle die aus der 'imp.xls' gelesenen Daten (= Zellinhalt)
jeweils eine Zielzelle in der Mastertabelle der 'master.xls' zu. Eine Fehlerbehandlung garantiert, dass dem User Daten mit
nicht zuordenbarer Spaltenüberschrift zur Entscheidung vorgelegt werden.

2.2 scheint mir passend zu sein - vor allem bei dem Gedanken, dass evtl. eine andere Person ab dem neuen Jahr den Job übernimmt und noch weniger Peil hat als ich face-smile

Meine Fragen dazu:
  • Sind 1. und 2.2 (sinnvoll) kombinierbar? (Denn das mit dem Datum des Einlesens könnte wertvoll sein. Optional könnte diese Information aber auch in einer zusätzlichen Spalte in Master.xls abgelegt werden).
  • Hast du ein passendes Makro, das ich verwenden könnte? (Ich habe die nötigen Skills dazu nicht).

Vielen Dank für die Geduld und Hilfe!
Julian
Member: mak-xxl
mak-xxl Nov 22, 2019 at 12:07:34 (UTC)
Goto Top
Hallo Julian,

dazu werde ich 2 Excel-Dateien erstellen, mit ein paar Daten und dem Quelltext füllen und an Dich versenden.

Danach wird es sicher Fragen, Anpassungen und Änderungen geben.

Damit jeder der Forumleser etwas davon hat, werden wir zum Abschluss den kommentierten Quelltext hier veröffentlichen. Die Tabellenstruktur ist hier (leider) nur beschreibend darzustellen.

Es wird ein wenig dauern, aber heute noch werden.

Freundliche Grüße von der Insel - Mario