Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Excel VBA Makro Sammeltabelle erstellen

Frage Microsoft Microsoft Office

Mitglied: Rio1980

Rio1980 (Level 1) - Jetzt verbinden

01.09.2011 um 17:07 Uhr, 6132 Aufrufe, 14 Kommentare

Hallo zusammen,

ich stehe vor einem für meine Begriffe hochkomplexen Makroproblem. Das Makro soll Daten aus unzähligen txt-Dateien importieren, daraus eine Sammeltabelle erstellen und nach bestimmten Suchkriterien aus dieser erstellen Sammeltabelle Übereinstimmungen in 3 anderen Dateien suchen, um aus diesen weitere Daten in die erstellte Sammeltabelle (natürlich an die richtigen Positionen) zu kopieren.

In einem Ordner "Textdateien" auf der C: Platte befinden sich unzählige Unterordner wobei sich in jedem dieser Ordner unter anderem auch eine txt-Datei befindet. All dieser txt-Dateien ähneln sich im Aufbau, sodass nach dem importieren (als Spaltentrennung soll ein : gelten) einer txt-Datei in Excel (2003) die Zellen A1 - B25 mit Daten gefüllt sind. Ich benötige dann die Daten aus den Zellen B1, B2, B4, B5, B6, B7 und B11 welche in meine Sammeltabelle in die Spalten A-G (für jede txt-Datei eine Zeile, sind im mom ca 100 Unterordner und somit 100 txt-Dateien und werden immer mehr) übernommen werden sollen. Wenn all diese Daten in die nun neu entstandene Sammeltabelle aufgenommen sind, müssten sich in der Spalte B nun Teilernummern befinden. Nach diesen Teilernummern müsste das Makro nun in 3 weiteren im sich im Aufbau ähnlichen Dateien, (z. Bsp.: "Datei1","Datei2","Datei3") wobei sich die Teilenummer immer in der Spalte A befindet, suchen und bei einem Treffer die Daten aus den Zellen B - H der entsprechenden Datei und Trefferzeile in meine Sammeltabelle in die Spalten H - N in die entsprechende Zeile kopieren.

Ich hoffe ich konnte das Problem bzw die Anforderung an das Makro anschaulich genug schildern...ist nicht immer so leicht ohne Anschauungsmaterial.
Die Frage für mich ist, ob das per Makro überhaupt lösbar ist und ob es sich alles in einem einzigen Makro verwirklichen lässt, oder ob man das in 2 Makros verpacken müsste. Für eure Hilfe und über eure Anregungen würde ich mich sehr freuen.

Bis dahin verbleibe ich mit vielen Grüßen
Rio
Mitglied: Biber
01.09.2011 um 17:46 Uhr
Moin Rio1980,

Die Frage für mich ist, ob das per Makro überhaupt lösbar ist und ob es sich alles in einem einzigen Makro verwirklichen lässt, oder ob man das in 2 Makros verpacken müsste

Ich sach' mal so:
Für mich ist noch gar nicht die Phase erreicht, in der ich mir zutrauen würde zu sagen
"Nimm einen 10er Ringschlüssel und einen Kreuzschlitzschraubendreher mit Bambusgriff, der Rest ergibt sich dann von allein."

Ein, zwei Punkte an dem Gesamtplan würde ich gern noch mal etwas trennschärfer formuliert haben wollen,
i.e. von "unzähligen" Unterordnern und unzähligen Input-Textdateien wissen wir ja jetzt, aber
  • die Zieldimensionen sind EINE Exceltabelle mit EINEM Sheet ??
  • oder mit einem Sheet pro Importiere-mir-alle-Daten-Lauf?
  • oder ein Excelsheet pro Woche?
  • Ist es eine einmalige oder einer regelmäßige Aktion, passiert es täglich, stündlich oder immer zur Grammy-Verleihung?
  • Soll, muss oder darf der Import manuell gestartet werden oder jeden Freitag mittag automatisch?
  • WTAF sind denn die "bestimmten Kriterien", nach denen da irgendwas zusammengeharkt werden soll? Stehen die auch in einer CSV-Datei oder "weiss" das Makro diese Kriterien oder gibt der/die UserIn dat ein?

Diese Rahmenparameter wären für mich schon wesentlich, ehe ich mich auf die Suche nach dem richtigen Werkzeug oder Schnitzmesser mache.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
01.09.2011 um 18:32 Uhr
Hallo Rio1980 und Biber!

Um mal zu sehen, ob ich einige Antworten auf Bibers Fragen erraten habe, ein [Edit] erweiterter [/Edit] Versuch, die vorgegebenen Daten einzulesen:
01.
Sub Importieren() 
02.
Basis = "C:\Textdateien" 
03.
Typ = "txt" 'Dateityp der zu verarbeitenden Dateien in Kleinbuchstaben 
04.
Dateien = Array("C:\Datei1.txt", "C:\Datei2.txt", "C:\Datei3.txt") 
05.
 
06.
Adressen = Array(1, 2, 4, 5, 6, 7, 11) 'da alle Werte in Spalte B stehen, nur die Zeilennummern 
07.
SchlSpalte = 2 'Spalte B = Schlüsselspalte für Suche in den Dateien 
08.
Delim = ":" 'Trennzeichen 
09.
 
10.
AbZeile = 2 'ab dieser Zeile werden die Werte in die Zieltabelle geschrieben 
11.
AbSpalte = 1 'Spalte A; ab dieser Spalte werden die Werte in die Zieltabelle geschrieben 
12.
 
13.
MaxFeld = UBound(Adressen) 'höchster Index in der Adressentabelle (= Anzahl der Felder - 1) 
14.
Dim Daten() 
15.
 
16.
Set fso = CreateObject("Scripting.FileSystemObject") 
17.
Set d = CreateObject("Scripting.Dictionary") 
18.
 
19.
For Each Datei In Dateien 'alle Dateien in Dictionary einlesen 
20.
    Zeilen = Split(fso.OpenTextFile(Datei).ReadAll, vbCrLf) 'in Zeilenarray einlesen 
21.
    For i = 0 To UBound(Zeilen) 'alle Zeilen durchgehen 
22.
        Zeile = Trim(Zeilen(i)) 'ev leading/trailing blanks entfernen 
23.
        If Zeile <> "" Then 'keine leere Zeile verarbeiten 
24.
            Schl = Split(Zeile, Delim)(0) 'Schlüssel ist erstes Feld 
25.
            If Not d.Exists(Schl) Then 'noch kein Datensatz mit diesem Schlüssel vorhanden 
26.
                Werte = Split(Replace(Zeile, Schl & Delim, "", 1, 1), Delim) 'Werte (erst ab 2. Spalte) in Array übernehmen und ... 
27.
                d.Add Schl, Werte '... dieses im Dictionary zum Schlüssel ablegen 
28.
            Else 'Schlüssel gab es schon 
29.
                MsgBox Schl & " ist bereits vorhanden!", vbCritical 
30.
                '### weitere Vorgangsweise? ### 
31.
            End If 
32.
        End If 
33.
    Next 
34.
Next 
35.
 
36.
Zeile = AbZeile 
37.
Cells(Zeile, AbSpalte).Select 'Startzelle für Daten markieren und ... 
38.
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).ClearContents '... ab hier Inhalte löschen 
39.
 
40.
For Each Ordner In fso.GetFolder(Basis).SubFolders 'alle Unterordner des Basisordners durchgehen 
41.
    For Each Datei In fso.GetFolder(Ordner).Files 'alle Dateien des jeweiligen Unterordners durchgehen ... 
42.
        If LCase(fso.GetExtensionName(Datei.Name)) = Typ Then '... und nur solche des vorgegebenen Typs verarbeiten 
43.
            Zeilen = Split(Datei.OpenAsTextStream.ReadAll, vbCrLf) 'alle Zeilen der Datei in Array einlesen 
44.
            ReDim Daten(MaxFeld) 
45.
            For i = 0 To MaxFeld 'alle Feldwerte lt Adressentabelle ermitteln 
46.
                Daten(i) = Split(Zeilen(Adressen(i) - 1), Delim)(1) 'Zeile lt Adressentabelle zerlegen und zweites Feld (= Spalte "B") verwenden 
47.
            Next 
48.
            Rows(Zeile).EntireRow.ClearContents 'Tabellenzeile löschen 
49.
            Cells(Zeile, AbSpalte).Resize(1, MaxFeld + 1).Value = Daten 'Datensatz (Teil 1) in Zieltabelle eintragen 
50.
             
51.
            Schl = Cells(Zeile, SchlSpalte).Value 'Schlüsselbegriff auslesen 
52.
            If d.Exists(Schl) Then 'wenn Daten zu diesem Schlüssel vorhanden, ... 
53.
                Werte = d.Item(Schl) '... diese auslesen und ... 
54.
                Cells(Zeile, AbSpalte + MaxFeld + 1).Resize(1, UBound(Werte) + 1).Value = Werte 'am Ende der Tabellenzeile hinzufügen 
55.
            End If 
56.
             
57.
            Zeile = Zeile + 1 'nächste Zeile der Zieltabelle 
58.
        End If 
59.
    Next 
60.
Next 
61.
End Sub
Hinsichtlich "Datei1" bis "Datei3" wurde unterstellt, dass
  • es sich ebenfalls um Textdateien mit dem Trennzeichen ":" handelt
  • diese Dateien alle gleich strukturiert sind (Weshalb werden die Daten nicht gleich in einer Datei zusammengefasst?)
  • Überschneidungen der Teilenummern (eine Nummer kommt in mehreren Dateien vor) erkannt werden müssen (Was dann zu geschehen hätte, wäre noch zu klären)

Grüße
bastla

[Edit] "Nachschlagen" in den Dateien "Datei1" bis "Datei3" sowie Löschen (alter Daten) der Zieltabelle hinzugefügt [/Edit]
Bitte warten ..
Mitglied: Biber
01.09.2011 um 21:13 Uhr
[OT] @bastla

Natürlich kenne ich auch die Situation, dass ich beim Heimkommen einen Zettel auf dem Küchentisch vorfinde mit den Worten:
"Zutaten für's Abendessen liegen im Kühlschrank. Fang ruhig schon mal an zu Kochen. Bin zum Essen wieder da."

...und im Kühlschrank liegen dann ein paar Fischfilets, ein halbes Glas Brombeermarmelade, 2 Becher Quark, 4 Stangen Rhabarber und der Rest einer Tube Gleitcreme.

Sollte ich wirklich mit diesen Infos schon anfangen und mache ich damit wirklich allen Beteiligten eine Freude?

Grüße
Biber
[/OT]
Bitte warten ..
Mitglied: bastla
01.09.2011 um 21:27 Uhr
[OT] @Biber
Also Dir traue ich durchaus zu, daraus etwas Interessantes zu kreieren - und Du doch auch ...

... und wenn der Rhabarber schon mal da ist ...

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: Biber
01.09.2011 um 21:41 Uhr
[OT ii] @bastla

Ich sach' ma so...

Natürlich gibt es erstmal Pluspunkte, wenn pünktlich etwas Warmes auf dem Tisch steht.
Jedenfalls eigentlich immer.

Aber ich sehe dennoch ein gewisses Restrisiko....

Und überhaupt: zu den drei Dingen, bei denen Zeit nun wirklich keinerlei Rolle spielt, gehört für mich auch das Kochen.
Heisst ja nicht, dass ich deshalb etwas anbrennen lasse.

Grüße
Biber
[/OT ii]
Bitte warten ..
Mitglied: Rio1980
01.09.2011 um 23:09 Uhr
@Biber

Danke schon mal im Voraus dass du dir die Sache angesehen hast.
Ja, das Ziel soll EINE Sammeldatei und EIN Sheet sein...immerhin reden wir hier nach dem aussieben der Daten nur noch von 14 Spalten und ein paar hundert Zeilen, sollte machbar sein denke ich.
Es ist mit sicherheit eine Aktion die noch mehrfach durchgeführt wird, aber ein zeitlicher Abstand ist noch nicht ersichtlich, auch wenn ich schon mal sagen kann, dass es sicher nicht wöchentlich sein wird, sondern schon mehr Zeit ins Land gehen wird und ich somit auf luxeriöse und sicher aufwenidge Abfrage über schon erfasste Daten bei erneuter Durchführung des Makros auf Grund der ohenhin vorhandenen Komplexität verzichtet habe. Da das dann nicht regelmäßig gemacht wird werde ich den Import auch manuell nach Bedarf starten. Das Suchkriterium ist wie bereits weiter unten im ursprünglichen Text erklärt die Teilenummer.

@ Bastla

WOW! Auch wenn ich dass Makro erst Morgen auf der Arbeit testen kann, sieht es schon mal sehr gut aus und entspricht was das Einlesen der Textdateien angeht meinen Vorstellungen. Was die Dateien 1-3 angeht sind diese ganz normale excel Dateien und es sind drei an der Zahl, da drei verschiedene Mitarbeiter von verschiedenen PC´s aus parallel Daten editieren müssen. Im übrigen ist der Aufbau der Dateien identisch und doppelt oder dreifach vorhandene Teilenummern pro Datei und dateiübergreifend sind nicht vorhanden.

[OT]
Im übrigen finde ich euren Disput sehr erheiternd
[/OT]

Viele Grüße
Rio
Bitte warten ..
Mitglied: bastla
01.09.2011 um 23:45 Uhr
Hallo Rio1980!

Die folgende Version holt die "Nachschlage"-Daten aus den Excel-Dateien "Datei1.xls" - "Datei3.xls"
01.
Sub Importieren() 
02.
Basis = "C:\Textdateien" 
03.
Typ = "txt" 'Dateityp der zu verarbeitenden Dateien in Kleinbuchstaben 
04.
Dateien = Array("C:\Datei1.xls", "C:\Datei2.xls", "C:\Datei3.xls") 
05.
 
06.
Adressen = Array(1, 2, 4, 5, 6, 7, 11) 'da alle Werte in Spalte B stehen, nur die Zeilennummern 
07.
SchlSpalte = 2 'Spalte B = Schlüsselspalte für Suche in den Dateien 
08.
Delim = ":" 'Trennzeichen 
09.
 
10.
AbZeile = 2 'ab dieser Zeile werden die Werte in die Zieltabelle geschrieben 
11.
AbSpalte = 1 'Spalte A; ab dieser Spalte werden die Werte in die Zieltabelle geschrieben 
12.
 
13.
AbZeileQuelle = 1 'erste Datenzeilen in den "Nachschlage"-Dateien 
14.
AbSpalteQuelle = 1 'erste Datenspalte in den "Nachschlage"-Dateien 
15.
DatenSpaltenQuelle = 7 'Anzahl Datenspalte ohne Schlüsselspalte 
16.
 
17.
 
18.
MaxFeld = UBound(Adressen) 'höchster Index in der Adressentabelle (= Anzahl der Felder - 1) 
19.
Dim Daten() 
20.
 
21.
Set fso = CreateObject("Scripting.FileSystemObject") 
22.
Set d = CreateObject("Scripting.Dictionary") 
23.
 
24.
Set Sammel = ThisWorkbook 
25.
For Each Datei In Dateien 'alle Dateien in Dictionary einlesen 
26.
    Set Quelle = Workbooks.Open(Datei) 
27.
    With Quelle.Worksheets(1) 
28.
        Zeile = AbZeileQuelle 
29.
        Schl = Trim(.Cells(Zeile, AbSpalteQuelle).Value) 
30.
        Do Until Schl = "" 
31.
            If Not d.Exists(Schl) Then 'noch kein Datensatz mit diesem Schlüssel vorhanden 
32.
                Werte = .Cells(Zeile, AbSpalteQuelle + 1).Resize(1, DatenSpaltenQuelle) 'Werte (ab 2. Spalte) in Array übernehmen und ... 
33.
                d.Add Schl, Werte '... im Dictionary zum Schlüssel ablegen 
34.
            Else 'Schlüssel gab es schon 
35.
                MsgBox Schl & " ist bereits vorhanden!", vbCritical 
36.
            End If 
37.
             
38.
            Zeile = Zeile + 1 
39.
            Schl = Trim(.Cells(Zeile, AbSpalteQuelle).Value) 
40.
        Loop 
41.
    End With 
42.
    Quelle.Close 
43.
Next 
44.
 
45.
Sammel.Activate 
46.
Zeile = AbZeile 
47.
Cells(Zeile, AbSpalte).Select 'Startzelle für Daten markieren und ... 
48.
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).ClearContents '... ab hier Inhalte löschen 
49.
 
50.
For Each Ordner In fso.GetFolder(Basis).SubFolders 'alle Unterordner des Basisordners durchgehen 
51.
    For Each Datei In fso.GetFolder(Ordner).Files 'alle Dateien des jeweiligen Unterordners durchgehen ... 
52.
        If LCase(fso.GetExtensionName(Datei.Name)) = Typ Then '... und nur solche des vorgegebenen Typs verarbeiten 
53.
            Zeilen = Split(Datei.OpenAsTextStream.ReadAll, vbCrLf) 'alle Zeilen der Datei in Array einlesen 
54.
            ReDim Daten(MaxFeld) 
55.
            For i = 0 To MaxFeld 'alle Feldwerte lt Adressentabelle ermitteln 
56.
                Daten(i) = Split(Zeilen(Adressen(i) - 1), Delim)(1) 'Zeile lt Adressentabelle zerlegen und zweites Feld (= Spalte "B") verwenden 
57.
            Next 
58.
            Cells(Zeile, AbSpalte).Resize(1, MaxFeld + 1).Value = Daten 'Datensatz (Teil 1) in Zieltabelle eintragen 
59.
             
60.
            Schl = Cells(Zeile, SchlSpalte).Value 'Schlüsselbegriff auslesen 
61.
            If d.Exists(Schl) Then 'wenn Daten zu diesem Schlüssel vorhanden, ... 
62.
                Werte = d.Item(Schl) '... diese auslesen und ... 
63.
                Cells(Zeile, AbSpalte + MaxFeld + 1).Resize(1, DatenSpaltenQuelle).Value = Werte 'am Ende der Tabellenzeile hinzufügen 
64.
            End If 
65.
             
66.
            Zeile = Zeile + 1 'nächste Zeile der Zieltabelle 
67.
        End If 
68.
    Next 
69.
Next 
70.
End Sub
Geschrieben wird, wie auch in der ersten Fassung, in die aktuelle Tabelle der Datei, welche das Makro enthält - und natürlich ist auch das hier produzierte Ergebnis statisch (wird also nur durch neuerliches Ausführen des Makros verändert).

Grüße
bastla

[Edit] Löschen der bereits vorhandenen (alten) Daten des Zieltabellenblattes verbessert [Edit]
Bitte warten ..
Mitglied: Rio1980
05.09.2011 um 11:02 Uhr
Hallo bastla!

Vielen Dank für die Mühe! Das importieren der Daten aus den Textdateien klappt super!
Allerdings erscheint beim durchführen des Makros ziemlich oft (vermutlich so oft wie Zeilen in meiner generierten Sammeldatei existieren) die Meldung " ist bereits vorhanden!" und nachdem das Makro durchgelaufen ist habe ich zwar eine wunderschöne Sammlung der Daten aus den Textdateien, aber die DAten aus den Exceldateien 1 - 3 sind nicht gefunden....bzw nicht übernommen worden.

Viele Grüße
Rio
Bitte warten ..
Mitglied: bastla
05.09.2011 um 12:38 Uhr
Hallo Rio1980!
Allerdings erscheint beim durchführen des Makros ziemlich oft (vermutlich so oft wie Zeilen in meiner generierten Sammeldatei existieren)
Die Meldung betrifft nur das Einlesen der Daten aus "Datei1.xls" - "Datei3.xls" und hat mit den Daten aus den Textdateien nix zu tun ...
die Meldung " ist bereits vorhanden!"
Die Meldung sollte auch eine Teilenummer ausgeben ...

Sinn der gesamten Aktion: In den Zeilen 25 bis 43 wird aus den Daten der xls-Dateien ein "Dictionary" aufgebaut - dieses besteht aus Datensätzen mit einem Schlüssel (der Teilenummer) und dem zugehörigen Wert (den weiteren Werten aus der Zeile als Array) und existiert nur zur Laufzeit im Arbeitsspeicher. Der Schlüssel muss dabei einmalig sein, daher wird zunächst geprüft, ob er bereits existiert, und wenn ja, die angesprochene Meldung erzeugt.
Zum Testen kannst Du im VBA-Editor den Cursor zwischen "Sub Importieren()" und "End Sub" platzieren und dann mit der Taste F8 in Einzelschritten durch den Ablauf gehen. Dabei kannst Du jederzeit (zB wenn eben die angesprochene Meldung ausgegeben wurde) den Mauszeiger über einer Variablen im Code (zB "Schl" platzieren und Dir damit deren Wert anzeigen lassen.

Eine Anmerkung noch: Da ich nicht weiß, welche Tabellen es in Deinen xls-Dateien gibt, wird jeweils auf die erste dieser Tabellen zugegriffen - siehe dazu Zeile 27. Diese Zeile könntest Du auf
With Quelle.Worksheets("Blattname")
ändern, damit die Tabelle "Blattname" ausgelesen wird.

Grüße
bastla
Bitte warten ..
Mitglied: Rio1980
12.09.2011 um 11:34 Uhr
Hallo Bastla!

Die Meldung betrifft nur das Einlesen der Daten aus "Datei1.xls" - "Datei3.xls" und hat mit den Daten aus den
Textdateien nix zu tun ...

Leider hat sich das Problem aufgetan, dass die Teile-Nr in den Exceldateien doch wiederholt vorkommen kann, was auch leider nicht abzuändern ist
Ich habe das Makro in der Version durchlaufen lassen und versucht die Zeilen 34 und 35 wegzulassen, aber das importeiren der Daten aus den Datei1.xls" - "Datei3.xls klappt leider nicht. Der Unterschied ist natürlich nur, dass die Msg-Box nicht mehr erscheint und das Makro dann Meldungen durchläuft. Die Dateien werden im Hintergrund zwar geöffnet und er arbeitet auch ne weile damit, aber am Ende kommt "nur" eine Auflistung der importierten Daten aus den Textdateien ohne die Daten aus den Exceldateien 1-3. Für mich sieht es so aus dass das "Dictionary" aus den Exceldateien aufgebaut wird, aber der Abgleich zwischen der erzeugten Tabelle aus den Textdateien und dem "Dictionary" hinkt.

Was die Anzahl der Tabellen in den Exceldateien angeht, sind da zwar mehrere vorhanden, aber ich benötige nur die Daten aus Tabelle1, somit muss die Zeile 27 nicht abgeändert werden.

Viele Grüße
Rio
Bitte warten ..
Mitglied: bastla
12.09.2011 um 16:53 Uhr
Hallo Rio1980!

Das Redundanz-Problem ist eigentlich auch eine andere Baustelle - die Zeilen 34 und 35 kannst Du also weglassen (es wird dann eben - kommentarlos - immer mit den ersten gefundenen Daten gearbeitet).
Wenn der Tabellenname immer "Tabelle1" lautet, würde ich diesen trotzdem in Zeile 27 verwenden ("Tabelle1" muss nicht immer das erste Blatt der Mappe sein).
Da das Script bei meinen Tests den gewünschten Erfolg gebracht hat, ist es schwer, den Grund für den Fehler mit Deinen Daten nachzuvollziehen - vielleicht noch als Hinweis zur Fehlersuche:
Setze auf die Zeile 61 einen Breakpoint (vor der Zeile in die graue Spalte klicken - es wird dann ein roter Punkt angezeigt) und die Ausführung hält an dieser Stelle an; dann kannst Du, wie oben beschrieben, durch Zeigen (ohne Klicken) mit der Maus auf eine Variable deren Wert anzeigen lassen - insbes die Variable "Schl" aus Zeile 60 wäre hier interessant. Danach kannst Du mit F8 in Einzelschritten weiter gehen, oder mit F5 den Ablauf wieder starten (bis zum nächsten Breakpoint oder bis zum Ende).

Grüße
bastla
Bitte warten ..
Mitglied: Rio1980
16.09.2011 um 15:41 Uhr
Hallo Bastla!

Ein wiederholtes Danke für deine Bemühungen mir zu helfen!
Deine Anregungen habe ich so weit alle durchprobiert. Die Zeile 27 ist abgeändert und ich habe probiert dem Fehler durch manuelles Durchlaufen des Makros auf die Spur zu kommen. Der Einfachheit halber habe ich EINE einzige DUMMY Exceldatei erstellt in der nur eine Zeile mit Daten enthalten ist, wobei der Schlüssel (Schl = Teilenummer) mit der Teilenummer aus der ersten Zeile der generierten Sammeldatei identisch ist. Beim durchlaufen der Zeilen 1 - 43 wird somit im "Dictionary" nur ein einziger Schlüssel erstellt und die dazugehörigen Daten müssten eingelesen werden. Beim weiteren durchlaufen des Makros wird dann beim ersten Durchlauf der Schleife (Zeile 50 - 68) der "Schl" in Zeile 60 korrekt erkannt und müsste mit dem "Schl" aus dem "Dictionary" identisch sein. Bei der Prüfung in Zeile 61 wird aber anscheinend keine Übereinstimmung gefunden, da direkt in die Zeile 64 gesprungen wird. Es sieht also so aus das der "Schl" zwar identisch ist, aber die Zeilen 62 - 63 nicht abgearbeitet werden...
Hast du evtl noch eine Idee? Die Teilenummern sehen wie folgt aus, falls das irgendeine Rolle spielt: 12345678-01

Viele Grüße
Rio
Bitte warten ..
Mitglied: bastla
16.09.2011 um 15:53 Uhr
Hallo Rio1980!
Es sieht also so aus das der "Schl" zwar identisch ist
... was es auch würde, wenn im einen Fall am Ende ein Leerzeichen stünde, im anderen nicht - versuch es daher mit folgender Zeile 60:
Schl = Trim(Cells(Zeile, SchlSpalte).Value) 'Schlüsselbegriff auslesen
Grüße
bastla
Bitte warten ..
Mitglied: Rio1980
20.09.2011 um 02:02 Uhr
Hallo Bastla!

Das wars wohl gewesen! Das Makro läuft jetzt durch und findet jetzt Übereinstimmungen zu den "Schlüsseln" und kopiert die entsprechendenDaten in die Sammeldatei.Somit steht schon mal fest, dass das Makro nun funktioniert. Allerdings sind die Daten nicht vollständig was die Anzahl der übereinstimmenden "Schlüssel" angeht...werde wohl schauen müssen wo es noch Unterschiede (Schreibweise, Leerschritte etc) geben kann. Vielen Dank!

Viele Grüße
Rio
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...