arafat
Goto Top

Excel Dateien durchsuchen und Werte in neue Excel Datei auslesen

Hallo und Danke für Eure stets guten Antworten und Hilfen!

Folgendes Problem habe ich:

WinXP - Office2003

Ich habe etliche Excel Dateien mit je einem Tabellenblatt - in diesen Dateien stehen ähnliche Daten (Name, Vorname, etc.) leider aber nicht in in gleichen Felden (mal ist Name auf A1 der "Wert" dazu auf B1 - mal auf A2 und B2). Ich möchte nun alle Dateien durchsuchen und die "Werte" in eine neue Excel Datei auslesen lassen.

Ich denke ich komme nicht an Makros vorbei - die sind aber leider garnicht meine Welt - vielleicht gibts ja auch ne Möglichkeit das ganze als Shell-Script zu machen.

Vielleich Dank für Eure ANtworten

Gruß MArkus

Content-Key: 43626

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

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

Member: bastla
bastla Nov 03, 2006 at 09:50:30 (UTC)
Goto Top
Hallo Markus!

Um das Ganze automatisieren zu können, wären zusätzliche Informationen ganz gut:

Gibt es eine Systematik bei den Dateinamen?
Falls nein: Wie viele sind "etliche"? (Hintergrund: Ist es praktikabel, alle Dateien gleichzeitig zu öffnen?)
Habe ich richtig verstanden, dass jeweils der Inhalt einer Zelle ("Wert"), die rechts neben einer Zelle mit gleich bleibendem Inhalt (also "Name" ist in allen Tabellen vollkommen identisch) steht, übernommen werden soll?
Kommt der "Name" in jeder Mappe bzw Tabelle nur einmal bzw nur in Spalte A vor?
Die übernommenen "Werte" sollen vermutlich in der Zieltabelle in einer Spalte untereinander gespeichert werden?

Grüße
bastla
Member: Arafat
Arafat Nov 03, 2006 at 10:21:14 (UTC)
Goto Top
ok - etwas mehr ins Detail:

1. es sind zwischen 500 und 1000 Dateien
2. in diesen Dateien stehen die "Werte" in Spalte B - die Wertebezeichnunge (Name, Vorname...) in Spalte A - die Werte an sich kommen nur einmal in jeder Datei vor

in der Ziel Datei sollen nur noch die Werte vorkommen -

Beispiel:

Quelle:

Datei 1
A : B
Name : Meier
Vorname : Hans
Strasse : Wesergraben

Datei 2
A : B
Vorname : Jupp
Name : Heinckes
Strasse: im Niergendwo


Ziel:

A : B : C
Hans : Meier : Wesergraben
Jupp : Heinckes : im Niergendwo


so in etwa sieht es vom Prinzip her aus - natürlich etwas komplexer face-wink

Gruß Markus
Member: Arafat
Arafat Nov 03, 2006 at 10:22:41 (UTC)
Goto Top
noch was - eine Systematik in den Dateinamen gibt es nicht - leider - aber man könnte sie alle in ein Verzeichnis kopieren - so das der Aufenthalt der gleiche ist
Member: Arafat
Arafat Nov 03, 2006 at 10:52:16 (UTC)
Goto Top
also eigentlich würde mir vielleicht schon die Möglichkeit reichen aus - verschiedenen excel dateien eine CSV-Datei zu machen - diese könnte ich per awk-skript bearbeiten - da kenn ich mich dann aus
Member: bastla
bastla Nov 03, 2006 at 11:20:01 (UTC)
Goto Top
Hallo Markus!

Alle Dateien in einem Ordner genügt.

Erstelle die Zieldatei (in meinem Beispiel mit dem Namen "Alle.xls") in einem anderen Ordner und füge folgendes Makro hinzu:

Option Explicit

Sub GetData()

Dim oMe As Object
Set oMe = Workbooks("Alle.xls").Worksheets("Tabelle1") 'ZielDatei/-Tabelle (also die gerade geöffnete) ;-)  
Const sDateiPfad As String = "D:\Test\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash am Ende  
Const iSbAnzahl = 3 'Nach 3 Begriffen suchen  
Dim sSuchbegriff(iSbAnzahl) As String
sSuchbegriff(1) = "Name"  
sSuchbegriff(2) = "Vorname"  
sSuchbegriff(3) = "Strasse"  

Dim i As Integer
Dim sWbName As String
Dim rFound As Range
Dim vWert As Variant
Dim iZeile As Integer

iZeile = 2
Dim oFS As Object, oDatei As Object
Set oFS = CreateObject("Scripting.FileSystemObject")  
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
    sWbName = oDatei.Name
    Workbooks.Open (sDateiPfad & sWbName)
    For i = 1 To iSbAnzahl
        Set rFound = Workbooks(sWbName).Worksheets(1).Range("a1:a100").Find(sSuchbegriff(i), LookIn:=xlValues)  
        If Not rFound Is Nothing Then
            vWert = Cells(rFound.Row, rFound.Column + 1).Value
            oMe.Cells(iZeile, i).Value = vWert
        End If
    Next
    Workbooks(sWbName).Saved = True
    Workbooks(sWbName).Close
    iZeile = iZeile + 1
Next
End Sub

Anzupassen sind die Daten im ersten Absatz sowie weiter unten der vorgegebene Suchbereich Range("a1:a100").

Nach Durchlauf des Makros (vielleicht nur einmal mit 3 Dateien testen face-wink) enthält die Zieldatei die entsprechenden Einträge und kann (in beliebigem Format, auch csv) gespeichert werden (wird nicht durch das Makro erledigt).

HTH
bastla
Member: Arafat
Arafat Nov 03, 2006 at 11:32:24 (UTC)
Goto Top
Danke - genau das ist es !!!
Member: Sleepy00
Sleepy00 Jul 09, 2007 at 08:14:33 (UTC)
Goto Top
Hey Ihr beiden!

Habe ein so ähnliches Problem, jedoch mit etwas geänderten Variablen. Würde jedoch gerne diese VBA-Grundstruktur verwenden, jedoch funktioniert dies nicht so bei mir wie erwartet.

Könntet Ihr deshalb das Excel-Sheet uploaden oder so, dass ich mir ein bild davon machen kann wie es geht?

ware nett

thx, im voraus
rene
Member: bastla
bastla Jul 09, 2007, updated at Oct 18, 2012 at 16:32:11 (UTC)
Goto Top
Hallo Sleepy00 und willkommen im Forum!

"Das Excel-Sheet" gibt es eigentlich nicht, sondern es ist, wie oben beschrieben, zu erstellen.

Wenn Du Dein Vorhaben etwas näher erklärst, sollten wir hoffentlich auch unter geänderten Voraussetzungen etwas Brauchbares basteln können ...

Grüße
bastla
Member: BTS-18203
BTS-18203 Mar 02, 2008 at 23:01:40 (UTC)
Goto Top
Hallo,

ich nehme das Thema und das oben geschriebene Makro nochmal auf, da es im Grunde meine Bedürfnisse beinahe trifft und toll funktioniert.

Möchte aus mehreren Excel-Dateien Werte in einer Datei zusammenfassen (wie Arafat). Die Variation besteht aber darin, dass die einzelnen Excel-Dateien eine variierende Anzahl von Tabellenblättern beinhalten, und von diesen sollen auch nur bestimmte Tabellenblätter bei der Zusammenfassung berücksichtigt werden.

Bsp.: In dem Ordner D:\Test\ liegen 2 Excel-Dateien.
Die erste hat 21 Tabellenblätter, wovon ein Tabellenblatt eine Übersicht ist ('Übersicht'), 20 Tabellenblätter sind Testauswertungen ('Test 1' bis 'Test 20').
Die zweite hat 16 Tabellenblätter, auch hier eine Übersicht und 15 Testauswertungen ('Test 1' bis 'Test 15').

Ziel des Makros ist es wie bei Arafat, bestimmte Werte aus den Dateien in einer neuen Liste zusammenzuführen. Hierbei sollen aber nur Werte von Tabellenblättern berücksichtigt werden, deren Bezeichnung mit 'Test' beginnen.

Könnt Ihr mir bei der Anpassung des Makros helfen??
Member: bastla
bastla Mar 03, 2008 at 13:20:54 (UTC)
Goto Top
Hallo BTS-18203 und willkommen im Forum!

Mit kleineren Änderungen (zB muss die Sammeldatei nicht mehr "Alle.xls" heißen, sollte sich aber dennoch nicht im selben Ordner wie die zu durchsuchenden Dateien befinden) und der gewünschten Ergänzung (Berücksichtigung aller passenden Blätter der einzelnen Tabellen) sollte es so gehen:
Option Explicit

Sub GetData()

Dim oMe As Object, sSuchbegriff(), sBereich As String, iZeile As Integer, sKennz As String
Dim iSbMax As Integer, iLK As Integer, i As Integer, sWbName As String, rFound As Range, vWert As Variant
Dim oFS As Object, oDatei As Object, wsTabelle As Worksheet, bEintrag As Boolean

Set oMe = ThisWorkbook.Worksheets("Tabelle1") 'Zieltabelle (in der gerade geöffneten Datei)  
iZeile = 2 'ab dieser Zeile Ergebnisse in die Zieltabelle eintragen  
Const sDateiPfad As String = "D:\Test\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash am Ende  
sKennz = "Test" 'Nur Tabellen, deren Name mit dem Kennzeichen beginnt, verarbeiten  
sSuchbegriff = Array("Name", "Vorname", "Strasse") 'Liste der Suchbegriffe  
sBereich = "A1:A100"  

iSbMax = UBound(sSuchbegriff) 'Höchster Index der Suchbegriffmatrix  
iLK = Len(sKennz) 'Länge des Tabellennamen-Kennzeichens  

Set oFS = CreateObject("Scripting.FileSystemObject")  
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
    sWbName = oDatei.Name
    Workbooks.Open (oDatei.Path)
    For Each wsTabelle In Workbooks(sWbName).Worksheets()
        If StrComp(Left(wsTabelle.Name, iLK), sKennz, vbTextCompare) = 0 Then
            bEintrag = False
            For i = 0 To iSbMax
                Set rFound = wsTabelle.Range(sBereich).Find(sSuchbegriff(i), LookIn:=xlValues)
                If Not rFound Is Nothing Then
                    vWert = wsTabelle.Cells(rFound.Row, rFound.Column + 1).Value
                    oMe.Cells(iZeile, i + 1).Value = vWert
                    bEintrag = True
                End If
            Next
            If bEintrag Then iZeile = iZeile + 1 'mindestens ein Eintrag erfolgt, daher neue Zeile  
        End If
    Next
    Workbooks(sWbName).Saved = True
    Workbooks(sWbName).Close
Next
End Sub

Grüße
bastla
Member: BTS-18203
BTS-18203 Mar 04, 2008 at 17:57:17 (UTC)
Goto Top
Phantastisch,

ausprobiert und für gut geheisen. So schön kann Excel sein, vielen Dank für die Hilfe.

Beste Grüße
BTS_18203
Member: BTS-18203
BTS-18203 Apr 08, 2008 at 15:58:15 (UTC)
Goto Top
Ich würde das Makros gerne auch für eine andere Sache verwenden, bekomme die Abwandlung jedoch nicht hin.

Ist-Zustand: Ich erhalte täglich 12-20 Excel-Listen mit Leistungswerten, die ich gerne in einer Datei zusammenfassen würde und ggf. in eine Access Datei exportieren würde. In den Dateien sind die Leistungen von einzelnen Mitarbeitern in Verschiedenen Themen (Vertriebskanäle) aufgeführt. Im Grunde ist der Aufbau der Datein identisch, es werden jedoch von den 8 möglichen Vertriebskanäle nur die aufgeführt, in denen die Mitarbeiter auch gearbeitet haben. D.h. die Werte eines Vertriebskanals sind nicht immer in der gleichen Spalte aufgeführt.

Beispiele:
[Dateiname: Datei 1]
Namen Vertriebskanal1 Vertriebskanal2 Vertriebskanal3
ADAM 15 10 20
BIRGIT 10 0 15

[Dateiname: Datei 2]
Namen Vertriebskanal1 Vertriebskanal3
CÄSAR 5 8
DETLEF 20 0

Ziel ist es, aus den einzelnen Dateien, die täglich in einem definierten Laufwerksordner abgelegt werden, eine Datei zu machen, mit der dann weiter gearbeitet werden kann.

Ziel Beispiel:

Dateiname Name Vertriebskanal Leistung
Datei 1 ADAM Vertriebskanal 1 15
Datei 1 ADAM Vertriebskanal 2 10
Datei 1 ADAM Vertriebskanal 3 20
Datei 1 BIRGIT Vertriebskanal 1 10
Datei 1 BIRGIT Vertriebskanal 3 15
Datei 2 CÄSAR Vertriebskanal 1 5
Datei 2 CÄSAR Vertriebskanal 3 8
Datei 2 DETLEF Vertriebskanal 1 20


Könnt Ihr mir bei der Abwandlung des o.g. Makros helfen?

Beste Grüße
BTS-18203
Member: bastla
bastla Apr 08, 2008 at 20:09:12 (UTC)
Goto Top
Hallo BTS-18203!

Soferne es zwischen den Daten keine Leerzeilen bzw -spalten gibt, sollte es so gehen:
Option Explicit

Sub GetData()

Dim oMe As Object, sUeber() As String, sVK()
Dim iZSpalte As Integer, iZZeile As Integer, iZAbZeile As Integer, iZAbSpalte As Integer, iZSpAnz As Integer
Dim iQZeile As Integer, iQSpalte As Integer, iQAbZeile As Integer, iQAbSpalte As Integer, iQSpAnz As Integer
Dim sWbName As String, sName As String, sV As Variant, iLeist As Integer


'######## ab hier anpassen ########  
Set oMe = ThisWorkbook.Worksheets("Tabelle1") 'Zieltabelle (in der gerade geöffneten Datei)  
Const sDateiPfad As String = "D:\Test\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash am Ende  

sUeber = Split("Dateiname Name Vertriebskanal Leistung") 'Spaltenüberschriften  
iZAbSpalte = 1 'ab dieser Spalte Ergebnisse in die Zieltabelle eintragen  
iZAbZeile = 1 'ab dieser Zeile Ergebnisse in die Zieltabelle eintragen (Spaltenüberschriften; Leerzeichen als Trennzeichen)  

iQAbSpalte = 1 'ab dieser Spalte Daten in Quelltabelle enthalten  
iQAbZeile = 1 'ab dieser Zeile Daten in Quelltabelle enthalten  
'######## bis hier anpassen ########  


iZSpAnz = UBound(sUeber)
With oMe
    .Cells.Clear 'gesamte Zieltabelle löschen  
    .Range(.Cells(iZAbZeile, iZAbSpalte), .Cells(iZAbZeile, iZAbSpalte + iZSpAnz)).Value = sUeber 'Überschriften eintragen  
End With
iZZeile = iZAbZeile + 1

Dim oFS As Object, oDatei As Object
Set oFS = CreateObject("Scripting.FileSystemObject")  
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
    sWbName = oDatei.Name
    Workbooks.Open (sDateiPfad & sWbName)
    With Workbooks(sWbName).Worksheets(1)
        iQSpalte = iQAbSpalte + 1 'Vertriebskanäle ab dieser Spalte  
        iQZeile = iQAbZeile 'Überschriften ab dieser Zeile  
        Do While .Cells(iQZeile, iQSpalte).Value <> ""  
            iQSpalte = iQSpalte + 1
        Loop
        iQSpAnz = iQSpalte - iQAbSpalte - 1
                
        sVK = .Range(.Cells(iQAbZeile, iQAbSpalte + 1), .Cells(iQAbZeile, iQAbSpalte + iQSpAnz)).Value
        
        iQZeile = iQZeile + 1
        iQSpalte = iQAbSpalte
        
        Do While .Cells(iQZeile, iQAbSpalte).Value <> ""  
            iQSpalte = iQAbSpalte
            sName = .Cells(iQZeile, iQSpalte).Value
            For Each sV In sVK
                iQSpalte = iQSpalte + 1
                iLeist = .Cells(iQZeile, iQSpalte).Value
                With oMe
                    'Eintragung in Zieltabelle; Reihenfolge siehe Überschriften (sUeber)  
                    .Cells(iZZeile, iZAbSpalte).Value = sWbName
                    .Cells(iZZeile, iZAbSpalte + 1).Value = sName
                    .Cells(iZZeile, iZAbSpalte + 2).Value = sV
                    .Cells(iZZeile, iZAbSpalte + 3).Value = iLeist
                    iZZeile = iZZeile + 1
                End With
            Next
            iQZeile = iQZeile + 1
        Loop
    End With
    
    Workbooks(sWbName).Saved = True
    Workbooks(sWbName).Close
    
Next

'Sortierung: zunächst (Key1) nach Datei, dann (Key2)nach Name  
With oMe
.Cells(iZAbZeile, iZAbSpalte).Sort _
    Key1:=.Cells(iZAbZeile, iZAbSpalte), Order1:=xlAscending, _
    Key2:=.Cells(iZAbZeile, iZAbSpalte + 1), Order2:=xlAscending, _
    Header:=xlYes, OrderCustom:=1, Orientation:=xlTopToBottom
End With
End Sub
Auch in diesem Fall sollte sich die Zieldatei nicht im selben Ordner wie die Quelldateien befinden.

Die Zieltabelle wird zu Beginn vollständig gelöscht und abschließend nach Datei und Name sortiert.

Grüße
bastla
Member: warnickel
warnickel Jul 07, 2008 at 07:15:37 (UTC)
Goto Top
hallo bastla,
ich weiß nicht was ich falsch mache, aber ich versuche es zur zeit mit deinem zweiten skript und es wird zwar durchgeführt, doch es erscheinen keine Namen, etc. bei mir in der Tabelle, was mache ich falsch?

Ich habe meine Dateien alles gleich benannt, einen ordner für die fragebögen geschaffen, jedoch durch sucht er zwar aber er schreibt nichts in die Zieltabelle?

Viele Grüße,
Warnickel
Member: vzimmer
vzimmer Oct 10, 2011 at 12:27:28 (UTC)
Goto Top
Hallo,

ich würde das Makro gerne ähnlich verwenden, bekomme aber die Anpassung für meine Zwecke nicht hin.

Ich habe mehrere Dateien mit jeweils mehreren Tabellenblättern, die ausgelesen werden sollen und deren Daten in eine Zieldatei übertragen werden sollen.

Das ganze soll mit einem Suchbegriff geschehen, aber je nach Suchbegriff sollen in Relation zum Suchbegriff unterschiedliche Zellen ausgelesen werden.

Bsp. Suchbegriff Name => +1 Spalte rechts soll ausgegeben werden
Bsp. Suchbegriff Auszahlunt Monatsprämie 1 => +1 Zeile darunter soll ausgegeben werden
Bsp. Suchbegriff Zielerreichung MP 1 => + 1 Spalte rechts soll ausggegeben werden
Bsp. Suchbegriff Jan 11 => + Spalte 1-7 rechts davon sollen ausgegeben werden

D.h. ich muss irgendwie für jeden Suchbegriff definieren können, welcher Wert ausgegeben werden soll, dieser soll dann in der Zieldatei jeweils in die Spalte daneben geschrieben werden und die Daten aus dem nächsten Tabellenblatt in einer neuen Zeile etc.

Ich kenn mich mit Makros nicht so gut aus, ein paar kleinere Anpassungen hab ich zwar geschafft, aber jetzt häng ich.
Anbei mein (fehlerhafter) Versuch:

Sub GetData()

Dim oMe As Object, sBereich As String, iZeile As Integer, iSpalte As Integer, sKennz As String
Dim i As Integer, sWbName As String, rFound As Range
Dim vName As Variant, vVorname As Variant, vBU As Variant, vAbteilung As Variant, vMPK1 As Variant, vMPK2 As Variant, vMPK3 As Variant
Dim oFS As Object, oDatei As Object, wsTabelle As Worksheet, bEintrag As Boolean

Set oMe = ThisWorkbook.Worksheets("Tabelle1") 'Zieltabelle (in der gerade geöffneten Datei)  

iZeile = 4 'ab dieser Zeile Ergebnisse in die Zieltabelle eintragen  
iSpalte = 1

Const sDateiPfad As String = "H:\Eigene Dateien\Dateienauslesen\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash am Ende  
Const iSbAnzahl = 7 'Nach x Begriffen suchen  
Dim sSuchbegriff(iSbAnzahl) As String
sSuchbegriff(1) = "Name:"  
sSuchbegriff(2) = "Vorname:"  
sSuchbegriff(3) = "BU:"  
sSuchbegriff(4) = "Abteilung:"  
sSuchbegriff(5) = "Auszahlung Monatspraemie 1"  
sSuchbegriff(6) = "Auszahlung Monatspraemie 2"  
sSuchbegriff(7) = "Auszahlung Monatspraemie 3"  
sBereich = "A1:Z200"  

Set oFS = CreateObject("Scripting.FileSystemObject")  
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
    sWbName = oDatei.Name
    Workbooks.Open (oDatei.Path), Password:="pw", WriteResPassword:="pw"  
    For Each wsTabelle In Workbooks(sWbName).Worksheets()
            For i = 0 To iSbAnzahl
                Set rFound = wsTabelle.Range(sBereich).Find(sSuchbegriff(i), LookIn:=xlValues)
                If Not rFound Is Nothing Then
                    vWert = wsTabelle.Cells(rFound.Row, rFound.Column + 1).Value
                    vVorname = wsTabelle.Cells(rFound.Row, rFound.Column + 1).Value
                    vBU = wsTabelle.Cells(rFound.Row, rFound.Column + 1).Value
                    vAbteilung = wsTabelle.Cells(rFound.Row, rFound.Column + 1).Value
                    vMPK1 = wsTabelle.Cells(rFound.Row + 1, rFound.Column).Value
                    vMPK2 = wsTabelle.Cells(rFound.Row + 1, rFound.Column).Value
                    vMPK3 = wsTabelle.Cells(rFound.Row + 1, rFound.Column).Value
                    With oMe
                    .Cells(iZeile, i + 1).Value = vName
                    .Cells(iZeile, i + 2).Value = vVorname
                    .Cells(iZeile, i + 3).Value = vBU
                    .Cells(iZeile, i + 4).Value = vAbteilung
                    .Cells(iZeile, i + 5).Value = vMPK1
                    .Cells(iZeile, i + 6).Value = vMPK2
                    .Cells(iZeile, i + 7).Value = vMPK3
                    bEintrag = True
                    End With
                End If
            Next
            If bEintrag Then iZeile = iZeile + 1 'mindestens ein Eintrag erfolgt, daher neue Zeile  
    Next
    Workbooks(sWbName).Saved = True
    Workbooks(sWbName).Close
Next
End Sub

Danke für Eure Hilfe!

Vicky
Member: utroger
utroger Feb 22, 2012 at 09:45:04 (UTC)
Goto Top
Hallo zusammen, bin neu hier, habe ein ähnliches Problem und habe schon alles durchsucht aber nichts passendes gefunden.
Also benutze Excel 2007
habe in einem Verzeichnis lauter Exceldateien stehen, aus diesen Dateien soll immer das Feld H5 in eine neue Tabelle ausgelsen werden und im nächsten feld ein Hyperlink erscheinen so das ich die Datei bei bedarf von dort öffnen kann. Das Feld H5 entält einen Index der für mich die Information ist ob aktuell oder nicht.
Im Moment muss ich jede einzelne Datei öffnen was absolut nervig ist bei ca .500 einzelnen Dateien.

Wäre schön für ein Beispiel wie ich das lösen könnte.

Im Voraus Danke
Member: bastla
bastla Feb 22, 2012 at 11:31:09 (UTC)
Goto Top
Hallo utroger und willkommen im Forum!

Sollte sich etwa so machen lassen:
Sub GetData()

Set oMe = ThisWorkbook.ActiveSheet 'ZielDatei/-Tabelle (= die aktuelle Tabelle der aktuellen Datei)  
Const sDateiPfad As String = "D:\Test\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash am Ende  

sZelle = "H5" 'auszulesende Zelle  
iZeile = 2 'ab Zeile 2 in Zieltabelle eintragen  
iSpalte = 1 'ab Spalte A in Zieltabelle eintragen  

Set oFS = CreateObject("Scripting.FileSystemObject")  
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
    sWbName = oDatei.Name
    If Left(LCase(oFS.GetExtensionName(sWbName)), 3) = "xls" Then  
        Workbooks.Open (sDateiPfad & sWbName)
        oMe.Cells(iZeile, iSpalte).Value = Range(sZelle).Value
        oMe.Hyperlinks.Add Anchor:=oMe.Cells(iZeile, iSpalte + 1), Address:=sDateiPfad & sWbName, TextToDisplay:=sWbName
        Workbooks(sWbName).Saved = True
        Workbooks(sWbName).Close
        iZeile = iZeile + 1
    End If
Next
End Sub
Grüße
bastla
Member: utroger
utroger Feb 27, 2012 at 06:59:07 (UTC)
Goto Top
erstmal Danke für die Antwort bastla.
Den Hyperlink setzt er in das Tabellenblatt aber in Spalte A wird kein Index aus den auszulesenden Dateien eingetragen.
Also Spalte B steht der Hyperlink und Spalte A bleibt leer wo der Index stehen sollte.

Diese Zeile im Code verstehe ich doch richtig?

Workbooks.Open (sDateiPfad & sWbName)
oMe.Cells(iZeile, iSpalte).Value = Range(sZelle).Value

Also es soll die Datei geöffnet werden, sZelle wäre in diesem Fall Feld H5 und in neue Tabelle vor dem Hyperlink eingetragen werden.

nur er macht es nicht.

würde mich freuen über ein Rückantwort und noch mal DANKE im Voraus.

Grüße
utroger
Member: bastla
bastla Feb 27, 2012 at 11:11:25 (UTC)
Goto Top
Hallo utroger!

Die beiden Code-Zeilen hast Du richtig interpretiert ... face-smile

Verwende ersatzweise folgende Zeile 15:
        oMe.Cells(iZeile, iSpalte).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle).Value
Grüße
bastla
Member: utroger
utroger Feb 27, 2012 at 11:37:02 (UTC)
Goto Top
hallo bastla,

super, funktioniert !

Nochmals besten Danke für die schnelle Hilfe

Grüße utroger
Member: utroger
utroger Feb 27, 2012 at 13:38:50 (UTC)
Goto Top
Hallo basla,

wollte nun noch das Feld D5 mit auslesen.
Habe gedacht ich könnte mir den Rest selbst zusammenfügen, habe mich wohl überschätzt.
Er macht das zwar in dem ich den code ein zeitesmal mit aufgenommen habe, aber ich denke das geht noch besser ohne das das Feld "D5" als Hyperlink mit ausgegeben wird und zweimal der Code durchlaufen muss.

hier mal den Code den ich nicht "professionell aber funktioniert" umgestellt habe.
Was bestimmt ein lächeln bei Dir ausführen wird.

Sub GetData()

Set oMe = ThisWorkbook.ActiveSheet 'ZielDatei/-Tabelle (= die aktuelle Tabelle der aktuellen Datei)
Const sDateiPfad As String = "G:\QW_Control-Range\Bauteile\DW8000_Range\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash am Ende

sZelle = "H5" 'auszulesende Zelle
iZeile = 2 'ab Zeile 2 in Zieltabelle eintragen
iSpalte = 1 'ab Spalte A in Zieltabelle eintragen


Set oFS = CreateObject("Scripting.FileSystemObject")
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
sWbName = oDatei.Name
If Left(LCase(oFS.GetExtensionName(sWbName)), 3) = "xls" Then
Workbooks.Open (sDateiPfad & sWbName)
oMe.Cells(iZeile, iSpalte).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle).Value
oMe.Hyperlinks.Add Anchor:=oMe.Cells(iZeile, iSpalte + 1), Address:=sDateiPfad & sWbName, TextToDisplay:=sWbName
Workbooks(sWbName).Saved = True
Workbooks(sWbName).Close
iZeile = iZeile + 1
End If
Next
sZelle = "D5" 'auszulesende Zelle
iZeile = 2 'ab Zeile 2 in Zieltabelle eintragen
iSpalte = 2 'ab Spalte A in Zieltabelle eintragen


Set oFS = CreateObject("Scripting.FileSystemObject")
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
sWbName = oDatei.Name
If Left(LCase(oFS.GetExtensionName(sWbName)), 3) = "xls" Then
Workbooks.Open (sDateiPfad & sWbName)
oMe.Cells(iZeile, iSpalte).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle).Value
oMe.Hyperlinks.Add Anchor:=oMe.Cells(iZeile, iSpalte + 1), Address:=sDateiPfad & sWbName, TextToDisplay:=sWbName
Workbooks(sWbName).Saved = True
Workbooks(sWbName).Close
iZeile = iZeile + 1
End If
Next
End Sub


Eilt nicht, aber ich würde Dankbar sein für eine professionelle Lösung

Grüße utroger
Member: bastla
bastla Feb 27, 2012 at 14:47:57 (UTC)
Goto Top
Hallo utroger!

Sollte eher so aussehen:
Sub GetData()

Set oMe = ThisWorkbook.ActiveSheet 'ZielDatei/-Tabelle (= die aktuelle Tabelle der aktuellen Datei)  
Const sDateiPfad As String = "D:\Test\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash am Ende  

sZelle1 = "H5" 'auszulesende Zelle  
sZelle2 = "D5" 'weitere auszulesende Zelle  
iZeile = 2 'ab Zeile 2 in Zieltabelle eintragen  
iSpalte = 1 'ab Spalte A in Zieltabelle eintragen  

Set oFS = CreateObject("Scripting.FileSystemObject")  
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
    sWbName = oDatei.Name
    If Left(LCase(oFS.GetExtensionName(sWbName)), 3) = "xls" Then  
        Workbooks.Open (sDateiPfad & sWbName)
        oMe.Cells(iZeile, iSpalte).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle1).Value
        oMe.Cells(iZeile, iSpalte + 1).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle2).Value
        oMe.Hyperlinks.Add Anchor:=oMe.Cells(iZeile, iSpalte + 2), Address:=sDateiPfad & sWbName, TextToDisplay:=sWbName
        Workbooks(sWbName).Saved = True
        Workbooks(sWbName).Close
        iZeile = iZeile + 1
    End If
Next
End Sub
Bei noch mehr zu übernehmenden Zellen würde sich dann eine eigene Schleife anbieten ...

Grüße
bastla
Member: utroger
utroger Feb 28, 2012 at 06:14:43 (UTC)
Goto Top
Hallo bastla,

herzlichen Dank, funktioniert.
So gut und vorallem so schnell hatte ich noch nie Hilfe erhalten, SUPER.

Grüße
utroger
Member: hansfrans
hansfrans May 18, 2012 at 20:46:57 (UTC)
Goto Top
Hallo zusammen,

mein Problem geht vermutlich auch in die Richtung, deshalb häng ichs hier dran.

Die Quelldatei enthält 3 Spalten (Vokabelnummer "NR", deutsches Wort "GER", englische Übersetzung "ENG"). In der Zieldatei befinden sich nur noch die Überschriften "NR" und "ENG", wobei "NR" (mehrere Zeilen) bereits vorgegeben sind und als Suchkriterium dienen! Das Makro soll nun mit Hilfe dieser Vorgaben die Quelldatei durchsuchen und die entsprechenden Felder (ENG) übertragen.

Zur Veranschaulichung:
http://www25.zippyshare.com/v/10032778/file.html

Danke!
Member: bastla
bastla May 18, 2012 at 20:51:50 (UTC)
Goto Top
Hallo hansfrans und willkommen im Forum!

Das wäre in diesem Fall doch einfach per "SVERWEIS()" zu realisieren ...

Grüße
bastla
Member: Ano-Oobist
Ano-Oobist Apr 12, 2013 at 13:26:49 (UTC)
Goto Top
Hallo,
das Thema passt genau in meine Richtung und ich frage an nach Details für mein spezifisches Problem.

Danke für die bisher super Erklärung und Vorlage für ein eigenes Makro.

Das Makro funktioniert soweit erstmal für Zellen mit einfachen Inhalten. Ich muss es nun weiter anpassen. Dazu meine Fragen:

- Was muss ich statt "sZelle" eintragen, wenn ich zusammenhängende Felder habe? Feld T38 bis X38 z.B.

- Teilweise sind die Felder mit SVERWEISEN. Wie kann ich einstellen, dass nur der Text kopiert wird? Müller statt SVERWEIS(....)

Letzte Frage noch zum Ablauf.

Wie kann ich einstellen, dass nicht alle Dateien neu reinkopiert werden, sondern nur noch neue? Manuell kann ich das so machen, dass im Ordner die alten gelöscht werden, aber denke, dass es vom Makro her auch gehen sollte, oder?

Wenn ich das Makro mit F5 starte, überschreibt er standardmäßig immer die erste Zeile oder hängt er sich unten dran?

Danke für die Mühe.
Member: oceangirl
oceangirl Oct 13, 2013 at 20:19:01 (UTC)
Goto Top
Hallo zusammen,

ich bin froh, dass ich auf diese Seite gestossen bin, denn auch ich moechte gerne Daten aus eine Excel Tabelle auslesen um sie zunaechst im Format zu vereinheitlichen und dann mit xml auszulesen.

Bei mir sind die Daten jedoch deutlich unstrukturierter. Die Daten werden normalerweise mit Bezeichnung und Wert gefuehrt, koennen aber ganz unterschiedlich aufgeschluesselt sein:

1.Der einfachste Fall: Alles steht einzeln in Spalten oder Zeilen

A:B
Vorname:Martin
Nachname: Heinz

oder

A:B
Vorname:Nachname:
Martin:Heinz

2.So gibt es Bezeichnung - Werte die hintereinander in einer Zeile vorkommen.

Bsp:
A:B:C:D:E
1. Vorname:Sven: :Nachname:Mueller
2. Geburtstag:13.10.2013: :Beruf: Ackerer

3.Es gibt Bezeichnung- Werte bei denen Leerzeichen dazwischen stehen.

Bsp:
A:B:C:
Vorname: : Sven:

4. Um die Verwirrung komplett zu machen werden teils unterschiedliche Bezeichnungen vergeben, also bei manchen heisst es geboren am, bei anderen Geburtstag.

Diese Daten wuerde ich gerne in eine Tabelle bringen, um sie mit xml zu exportieren.

Das soll dann so aussehen:


A:B:C:D
1.Vorname:Nachname:Geburtstag:Beruf
2.Sven:Mueller:22.04.2013:Ackerer
3.Martin:Heinz 13.10.2013:Landwirt

Ist das moeglich oder zu unstrukturiert?

Viele Gruesse
oceangirl
Member: bastla
bastla Oct 13, 2013 at 20:34:19 (UTC)
Goto Top
Hallo oceangirl und willkommen im Forum!

Erstelle besser einen eigenen "Frage"-Beitrag - hier dürften nicht allzu viele potenzielle Helfer vorbeikommen ...

... ansonsten: Wenn die Dateien derart unterschiedlich aufgebaut sind, solltest Du vorweg Dateien mit gleicher Struktur in Ordnern zusammenfassen und dann auf jeden Ordner eine angepasste VBA-Variante "los lassen" ...

Grüße
bastla
Member: oceangirl
oceangirl Oct 13, 2013 at 21:20:23 (UTC)
Goto Top
Ok danke bastler,

mache ich morgen nochmal einen neuen Thread und schaue ob es da einheitliche Strukturen gibt.

Gruss
oceangirl
Member: AlexBerlin
AlexBerlin Jul 21, 2016 at 11:41:06 (UTC)
Goto Top
Hallo zusammen,
hallo hilfsbereiter Bastla,

gerne mache ich auch einen neuen Thread auf, aber mein Problem ähnelt den hier Erwähnten sehr.

folgendes Problem: ich habe rund 60 verschiedene Exceldateien mit jeweils 53 Reitern. 52 Reiter sollen vom Bediener ausgefüllt werden und der letzte Reiter enthält alle Daten des gesamten Jahres in Tabellenform (Name des Reiters in allen 60 Dateien ist "Auswertung 2016").

Aufbau des Reiters Auswertung 2016, welcher so auch in die neue große Auswertung übernommen werden soll:


Datum Name Zeit Beschreibung usw....
xx.xx.xx xxx xx:xx xxx


Alle Dateien liegen in einem Ordner, die Reiter und der Aufbau ist komplett identisch, nur die Benennung der Datei ist unterschiedlich (z.B. B01, B02, B03,...,B60, usw.). Nun möchte ich wöchentlich in einem neuen Tabellenblatt und einem neuen Ordner eine Auswertung fahren und alle gesammelten Daten der 60 Dateien in einer Pivottabelle grafisch darstellen. Kann mir jemand mit einem Makro weiterhelfen, eventuell der hilfsbereite bastla?

Vielen Dank und beste Grüße
AlexBerlin
Member: AlexBerlin
AlexBerlin Jul 21, 2016 at 11:46:21 (UTC)
Goto Top
Idealerweise wird die Gesamtauswertung jede Woche um die aktuellen Werte erweitert
Member: bastla
bastla Jul 21, 2016 at 21:17:17 (UTC)
Goto Top
Hallo AlexBerlin und willkommen im Forum !

Hilfsbereit wäre ich zwar grundsätzlich, bin aber leider derzeit beruflich stark gefordert - daher doch auch an Dich der Vorschlag, einen neuen (und damit im Forum prominenter platzierten) Beitrag zu erstellen ...

Grüße
bastla
Member: MartiniBerlin
MartiniBerlin Aug 17, 2016 at 16:00:36 (UTC)
Goto Top
Hallo,

das auslesen in die neue Datei klappt super. Aber er liest aus der Quelldatei immer nur einmal z.B. Name, Vorname aus. Was muss ich hinzufügen, wenn alle Namen, Vornamen aus der Quelldatei ausgelesen werden sollen?

Vielen Dank im voraus