Wert in Referenztabelle suchen und Datenbereich/Zeile kopieren

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Wert in Referenztabelle suchen und Datenbereich/Zeile kopieren

    Liebe Forums-Mitglieder, hoffentlich kann mir zu folgender Aufgabe jemand kompetent helfen.
    Im Voraus schon einmal vielen Dank!

    Aus einer Textdatei (z.B. Artikel.txt) werden alle Datensätze (Anzahl variabel, nicht bekannt) gelesen, jeder Datensatz besteht aus 4 Text- oder Zahlenwerten.
    Die Werte werden über ein Makro automatisch in eine geöffnete Excel-Arbeitsmappe (z.B. Mappe1) in die Spalten A-D geschrieben. Dieser Teil funktioniert bereits ganz gut mit beliebiger Textdateiauswahl und
    Auswahl des linken oberen Einfügestartpunktes für Array aus Textdatei in Arbeitsmappe.
    Beispiel: Die Textdatei hat 9 Datensätze (= Zeilen) und der Einfügepunkt ist in der Arbeitsmappe A2, dann werden die Daten im Bereich A2 bis D10 eingetragen.

    Nun die Aufgabe:

    Die Werte in Spalte B sind die Bezeichnung von Artikeln (Artikel-ID). Die Artikel sind in einer anderen Master- oder Referenztabelle Master.xls mit zusätzlichen Informationen abgelegt.
    Die Mastertabelle trägt in Spalte A die Artikel-ID und in weiteren z.B. 10 Spalten (also von B bis K) die benötigten Informationen.
    Die Mastertabelle hat keine vordefinierte Endzeile, da sie ggf. weiter aufgefüllt wird.
    Nun sollen nacheinander in einem Arbeitsschritt für alle Artikel-ID's aus Mappe1 (im Beispiel die Zellen A2 bis A10) die zusätzlichen Informationen des passenden Artikels aus den Spalten B-K der Mastertabelle ausgelesen werden und ab einschl. Spalte E eingetragen werden.
    Neben den Werten sollen auch alle Formate (z.B. Spaltenbreite, Zeilenhöhe, Rahmen) aus der Mastertabelle mitkopiert werden. Wenn das die Aufgabe unnötig erschwert, kann man das auch weglassen.

    Wichtig sind nochmals folgende Features:
    1) Die Zahl der eingelesenen Datensätze aus der Textdatei (Artikelt.txt) ist nicht bekannt.
    Frage: kann man die Zahl der Datensätze vor dem Einlesen (mit Makro Textkonvertierungsassistent) ermitteln? Da hat nämlich Einfluss auf das layout der Tabelle.
    2) Die Mastertabelle (.xls oder xlsx) soll der Anwender durch eine Dialogbox mit GetOpenFileName selbst wählen dürfen
    3) Mastertabelle soll im Hintergrund, für den Anwender nicht sichtbar geöffnet werden.
    4) Die Formate sollten nach Möglichkeit aus der Mastertabelle für die übertragenen Werte nach Möglichkeit mitkopiert werden. Um das problem einfach zu halten, kann man diesen Teil zunächst auch weglassen. Die Daten sind zunächst das Wichtigste.

    Danke!!!!!!

    Genauere Beschreibung der Aufgabe und was noch fehlt

    Hallo Peterfido,

    vielen Dank für deine Bereitschaft mir zu helfen.

    Funktionieren tut bereits der Teil des Einlesens der Textdatei an die richtige Stelle und das Ermitteln der letzten Zeile des eingefügten Bereiches aus der Textdaiei durch Ermitteln des letzten Elementes einer markanten Spalte asu den Daten der Textdatei.
    D.h. die Zeilennummer kann eine Variable übergeben werden.
    Im von mir genannten Beisipel kann ein Schleifenindex der Einfachheit halber bis 9 laufen (= z.B. 9 Datensätze).
    Die Referenztabelle (z.B. Master.xls) existiert natürlich auch und das freie Auswählen dieser Tabelle durch den Bediener über GetOpenFilenam funktioniert auch.
    Die zu lösende Aufgabe beinhaltet
    - das Öffnen der Referenztabelle im Hintergrund
    - als Schleife das Suchen der Artikel aus Mappe 1 (aus Textdatei) in Zelle A2 : A10 in der Referenztabelle in deren Spalte A
    - das Kopieren der Zelleninhalte aus Mastertabelle für den jeweils gefundenen Artikel (also die Zeile, in der die Artikel-ID zusammen passt mit der in Mappe1) von Spalte B-K
    Beispiel: in Mappe1!A2 steht der Artikel "XYZ",
    in der Referenztabelle wird in Zeile 23 der Artikel "XYZ" gefunden, aus dieser Zeile sollen dann die Zellen B23:K23 zurück kopiert werden in Mappe1!E2:N2
    - usw. bis einschl. letztes Element aus Textdatei/Artikel in Mappe 2 in Spalte A (Bsp. bis A10) erreicht ist.
    Das ist die Aufgabe.

    Das Drucken der Mappe1 ist insofern nicht unproblematisch, weil die Tabelle nach Einlesen der Textdatei eine nicht vordefinierte Länge erreicht. Die Tabelle muss im DINA4 Format ausgedruckt werden und darf im Druck nicht weiter verkleinert werden, sie hat am unteren Ende immer einen Projektkopf mit Summenbildung und Übertrag der Summer der vorhegehenden Seite. So ist nach einer gewissen Zeilenanzahl der Seitenwechsel mit Projektkopf-zeilen einzubauen. Das war das Problem in meinem letzten Thema. Das habe ich aber bereits mit autom. Einfügen von Leerzeilen und Kopieren der Projektkopfzeilen gelöst. Zwar noch keine optimale Lösung, weil es in der Programmausführung etwas lange dauert und man das Einfügen bei aktivem Sheet regelrecht einzeln sieht, aber das kann man vielleicht später optimieren.
    Klingt für mich fast nach "klassischem" SVerweis. Automatisches Öffnen sollte kein Problem darstellen. Ich prüfe bei sowas immer vorher, ob die Datei nicht schon geöffnet ist. In diesem Falle weise ich dem Objekt einfach die offene Datei zu.

    Das mit der Textdatei habe ich nicht verstanden. Liest Du die Textdatei zu Fuß zeilenweise aus, oder ist es gar keine mehr, weil die Daten schon in einem Tabellenblatt eingelesen wurden? Klingt dann bald nach Deinem anderen Thema hier im Forum.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Ja, sorry, wenn die zwei Themen etwas verwirrend sind.
    Thema 1 Eingefügter Bereich aus Textdatei zählen/manipulieren/teilen mittlerweile hinbekommen.
    Das mache ich ja durch 1) das Ermitteln der Zeilenanzahl des eingefügten Bereiches, 2) das Einfügen von Leerzeilen und 3) das Hineinkopieren vom Projekt/Summenteil unten auf jeder Druckseite der Tabelle.
    Durch deinen Tipp, die Aktualisierung der Anzeige währenddessen auszuschalten, geht das auch schnell genug. Thema also erledigt.

    Thema 2 setzt da fort, wo Thema 1 endet. Die eingelesenen Daten aus der Textdatei liegen vor. Sie müssen aber zeilenweise mit weiteren zusätzlichen Informationen aus einem Katalog (der Referenztabelle) ergänzt werden.

    Auf deine Frage:
    Die Textdatei ist mit Thema 1 schon eingelesen, es geht also nur noch um die konvertierten Werte in der Mappe1.
    Ich glaube nicht, dass sverweis die richtige Methode ist. Ich suche zwar Werte, die in der Referenztabelle in der ersten Spalte liegen, will aber aus dieser Tabelle sehr viele Daten zurückschreiben, also einen ganzen Array (in Wirklichkeit nicht wie im genannten Beispiel 10 Spalten von B:K sondern ca. 50 Spalten). Und der SVerweis steht nicht als Formel/Funktion schon vorbereitet in den Zellen der Mappe1, da ich ja nicht grundsätzlich kein statisches Problem, sondern ein dynamisches habe (ich weiß von Anfang an nicht, wieviele Zeilen (Artikel) in der Mappe1 stehen (im Beispiel 9, können aber auch 100 sein), die ich mit Infos aus der Refenztabelle ergänzen muss.
    Kann ich die Formel/Funktion sverweis in VBA anwenden?
    Man müsste dann für jede Zelle der 50 Spalten über eine Schleife den Sverweis wiederholen.
    Vielleicht nicht die eleganteste Möglichkeit.
    Oder doch? Wie würde der Code mit sverweis aussehen? Bzw. wie kann man den kompletten Spaltenbereich einer Zeilen aus dem Referenztabelle einlesen und in die entsprechenden Spalten der Mappe1 ausgeben?
    Und wie würde man die Referentabelle im Hintergrund öffnen (unbemerkt für den benutzer)?
    Danke! :rolleyes:
    Wozu unbemerkt für den Nutzer?

    Um Excel-Tabellenblattfunktionen per Makro zu setzen, hilft der Makrorecorder ungemein um den passenden englischen Befehl herauszubekommen. Diesen kannst Du zur Laufzeit dynamisch in das Tabellenblatt einfügen. Select und son Zeugs dabei wegoptimieren. Ob der SVerweis bei einer ausgeblendeten Excelmappe funktioniert, weiß ich nicht.

    Im Zweifel ist eine Datenbank besser geeignet. Da wird dann keine zusätzliche Exceldatei wie beim Verweis geöffnet.

    Ab einem bestimmten Punkt (bzw. Anzahl von Daten) geht es bei mir oft schneller, die Quelldaten komplett in Variablen einzulesen und dann mit den Variablen zu arbeiten, anstatt mit mehreren tausend Schleifendurchläufen immer wieder die selben Zellinhalte zu lesen und dann zu vergleichen. Da sollten dann aber ausreichend Ressourcen zur Verfügung stehen, nicht dass mittendrin die Auslagerungsdatei vergrößert werden muss ;)
    Gruß
    Peterfido

    Keine Unterstützung per PN!