Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
784to788
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
784to788
784to788
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Werte aus Dateien auslesen (Code von Ramses)

Werte aus Dateien auslesen (Code von Ramses)
27.07.2006 10:42:38
Ramses)
Hallo EXCEL-Freunde,
ich suche eine Lösung mit der ich bestimmte Werte aus mehreren Dateien auslesen
bzw. rauskopieren kann. In der Recherche habe ich diesen Code von Ramses gefunden:
https://www.herber.de/forum/archiv/396to400/t397306.htm
Jetzt bräuchte ich zwei Anpassungen, die ich zwar realisieren kann, allerdings
geht dies sicher mit Schleifen einfacher:
1. Die betroffenen Dateinamen habe ich in einer Tabelle "Anzrel" hinterlegt (immer gleicher Pfad)
2. Die betroffenen Tabellennamen habe ich in einer Tabelle "Anzrel" hinterlegt
Anzrel
 BC
1DateinameTabelle
2testklaus1A_1TM
3testklaus1A_2RZ
4testklaus1B_1JU
5testklaus2B_22K
6testklaus2CH_1SL
7testklaus2CH_2CL
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Ich habe in dem o.g. Code nun die betroffenen Passagen angepasst und suche
eine Verschlankung durch Schleifen,
Schleife 1 für die Abarbeitung der Dateinamen
Schleife 2 für die Abarbeitung der Tabellennamen
(derzeit 2 bzw. 3, können aber jeweils noch mehr werden)
So sieht der code nun aus (läuft auch), aber wer kann mir bei den Schleifen noch
helfen:

Option Explicit
Sub Dateien_in_eine_Tabelle_zusammenfuehrentest()
'by Ramses
Dim myFso As Object, myFld As Object, Exfiles As Object
Dim xlFile As Object, wbMainBook As Workbook, wbDataBook As Workbook
Dim iCounter As Integer, lgRow As Long
Dim myDat1 As String, myDat2 As String
Dim myName11 As String, myName12 As String, myName13 As String
Dim myName21 As String, myName22 As String, myName23 As String
myDat1 = Sheets("Anzrel").Cells(2, 2)
myName11 = Sheets("Anzrel").Cells(2, 3)
myName12 = Sheets("Anzrel").Cells(3, 3)
myName13 = Sheets("Anzrel").Cells(4, 3)
myDat2 = Sheets("Anzrel").Cells(5, 2)
myName21 = Sheets("Anzrel").Cells(5, 3)
myName22 = Sheets("Anzrel").Cells(6, 3)
myName23 = Sheets("Anzrel").Cells(7, 3)
Application.DisplayAlerts = False
'Sollte aktiviert werden wegen Bildschirmflackern
Application.ScreenUpdating = False
'Erstellt neue Mappe für die Datenausgabe
Set wbMainBook = Workbooks.Add
'Zeilenzähler initialisieren
iCounter = 1
Set myFso = CreateObject("Scripting.FileSystemObject")
Set myFld = myFso.GetFolder("D:\Testen\")
Set Exfiles = myFld.Files
''________________________________________________
'''''aus Datei 1 auslesen

' For Each xlFile In Exfiles
'Prüfen auf Dateinamen
' If LCase(Right(xlFile.Name, 3)) = "xls" Then 'And Right(xlFile.Name, 1) = "a" Then
'Zuweisen der Variablen
'mit "UpdateLinks" werden Verknüpfungen aktualisiert
Set wbDataBook = Workbooks.Open("D:\Testen\" & myDat1, UpdateLinks:=3)
'Kopieren
' wbDataBook.Worksheets("Kopfdaten").Range("C21").Copy _
' Destination:=wbMainBook.Worksheets(1).Cells(iCounter, 1)

lgRow = Cells(Rows.Count, 2).End(xlUp).Row
wbDataBook.Worksheets(myName11).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(lgRow + 1, 2) 'Cells(iCounter, 2)
wbDataBook.Worksheets(myName12).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(lgRow + 21, 2) 'Cells(iCounter, 2)
wbDataBook.Worksheets(myName13).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(lgRow + 41, 2) 'Cells(iCounter, 2)
'Zeilenzähler hochsetzen
iCounter = iCounter + 1
'Geöffnete Mappe schliessen
wbDataBook.Close
'Variable leeren
Set wbDataBook = Nothing
''_______________________________________
''' aus Datei 2 auslesen

Set wbDataBook = Workbooks.Open("D:\Testen\" & myDat2, UpdateLinks:=3)
'Kopieren
' wbDataBook.Worksheets("Kopfdaten").Range("C21").Copy _
' Destination:=wbMainBook.Worksheets(1).Cells(iCounter, 1)

wbDataBook.Worksheets(myName21).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(lgRow + 61, 2) 'Cells(iCounter, 2)
wbDataBook.Worksheets(myName22).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(lgRow + 81, 2) 'Cells(iCounter, 2)
wbDataBook.Worksheets(myName23).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(lgRow + 101, 2) 'Cells(iCounter, 2)
'Zeilenzähler hochsetzen
iCounter = iCounter + 1
'Geöffnete Mappe schliessen
wbDataBook.Close
'Variable leeren
Set wbDataBook = Nothing
' End If
' Next
'Speichert die Zusammengefasste Tabelle
wbMainBook.SaveAs "D:\Testen\All_Data.xls"
'Variable leeren
Set wbMainBook = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Besten Dank für eine Hilfe!
mfg
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Erste Zwischenlösung
27.07.2006 14:05:11
Erich
Hallo EXCEL-Freunde,
bin einen Schritt weiter. Leider fehlt bei der Schleife noch die richtige Zuordnung
der Tabellennamen zu den Dateinamen. Hier die aktuelle Übersciht als Gurndlage:
Anzrel
 BCD
1DateinameTabellebetrifft Datei
2AA_A_D_2006A_1TMAA_A_D_2006
3AA_DK_H_2006A_2RZAA_A_D_2006
4AA_I_Z_2006B_1JUAA_A_D_2006
5 B_22KAA_A_D_2006
6 CH_1SLAA_A_D_2006
7 CH_2CLAA_A_D_2006
8 CZ_1GLAA_A_D_2006
9 D_1BLAA_A_D_2006
10 D_2BLAA_A_D_2006
11 D_3RLNAA_A_D_2006
12 D_4RLSAA_A_D_2006
13 DK_1SASAA_DK_H_2006
14 DK_2Div1AA_DK_H_2006
15 DK_3Div2AA_DK_H_2006
16 F_1L1AA_DK_H_2006
17 F_2L2AA_DK_H_2006
18 F_3AA_DK_H_2006
19 GB_1PLAA_DK_H_2006
20 GB_2CHSAA_DK_H_2006
21 GB_3L1AA_DK_H_2006
22 GB_4L2AA_DK_H_2006
23 I_1SAAA_I_Z_2006
24 I_2SBAA_I_Z_2006
25 I_3SC1AA_I_Z_2006
26 I_4SC2AA_I_Z_2006
27 NL_1EreAA_I_Z_2006
28 NL_2JLAA_I_Z_2006
29 SCO_1PLAA_I_Z_2006
30 SCO_2FDAA_I_Z_2006
31 SCO_3SDAA_I_Z_2006
32 SCO_4ThDAA_I_Z_2006
33 SK_1SLAA_I_Z_2006
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Und hier mein Code mit der fehlerhaften Schleife:

Option Explicit
Sub Dateien_in_eine_Tabelle_zusammenfuehrentestF()
'by Ramses
Dim myFso As Object, myFld As Object, Exfiles As Object
Dim xlFile As Object, wbMainBook As Workbook, wbDataBook As Workbook
Dim iCounter As Integer, lgRow As Long
Dim strDat(1 To 10) 'myDat1 As String, myDat2 As String
Dim myName11 As String, myName12 As String, myName13 As String
Dim myName21 As String, myName22 As String, myName23 As String
Dim strName(1 To 40) As String
Dim ii As Integer, i As Integer
Dim jj As Integer
With Sheets("Anzrel")
For jj = 2 To 4
strDat(jj) = .Cells(jj, 2)
Next jj
End With
With Sheets("Anzrel")
For ii = 2 To 33
strName(ii) = .Cells(ii, 3)
Next ii
End With
'Erstellt neue Mappe für die Datenausgabe
Set wbMainBook = Workbooks.Add
Set myFso = CreateObject("Scripting.FileSystemObject")
Set myFld = myFso.GetFolder("D:\EXCEL\Hobby\Wetten\Remis\")
Set Exfiles = myFld.Files
''________________________________________________
'''''? Schleife für Zuordnung der Tabellennamen zu den Dateinamen

'Zuweisen der Variablen
'mit "UpdateLinks" werden Verknüpfungen aktualisiert
For jj = 2 To 4
Set wbDataBook = Workbooks.Open("D:\EXCEL\Hobby\Wetten\Remis\" & strDat(jj), UpdateLinks:=3)
If strDat(jj) = 2 Then
For ii = 2 To 12 ' Datei 1
lgRow = Cells(Rows.Count, 2).End(xlUp).Row
wbDataBook.Worksheets(strName(ii)).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) 'Cells(lgRow + 1, 2) 'Cells(iCounter, 2)
Next ii
End If
If strDat(jj) = 3 Then
For ii = 13 To 22 ' Datei 2
lgRow = Cells(Rows.Count, 2).End(xlUp).Row
wbDataBook.Worksheets(strName(ii)).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) 'Cells(lgRow + 1, 2) 'Cells(iCounter, 2)
Next ii
End If
If strDat(jj) = 4 Then
For ii = 23 To 33 ' Datei 3
lgRow = Cells(Rows.Count, 2).End(xlUp).Row
wbDataBook.Worksheets(strName(ii)).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) 'Cells(lgRow + 1, 2) 'Cells(iCounter, 2)
Next ii
End With
'Geöffnete Mappe schliessen
wbDataBook.Close
'Variable leeren
' Set wbDataBook = Nothing
Next jj
Columns("B:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
Range("B1").Select
'Speichert die Zusammengefasste Tabelle
wbMainBook.SaveAs "D:\EXCEL\Hobby\Wetten\All_Data.xls"
'Variable leeren
Set wbMainBook = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Besten Dank für eine Hilfe!
mfg
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
Anzeige
AW: Erste Zwischenlösung
27.07.2006 14:15:43
fcs
Hallo Erich,
basierend auf den ursprünglichen Daten sollte etwa folgendes gehen. Leider ungetestet
Gruß
Franz
Sub Dateien_in_eine_Tabelle_zusammenfuehrentest() 'by Ramses Dim wbMainBook As Workbook, wbDataBook As Workbook Dim iCounter As Integer, lgRow As Long Dim myDat As String Dim myName Dim wksAnzrel As Worksheet, strPfad As String strPfad = "D:\Testen\" Set wksAnzrel = Sheets("Anzrel") lngZeile = 2 '1. Zeiel mit Daten in Blatt "Anzrel 'Erstellt neue Mappe für die Datenausgabe Set wbMainBook = Workbooks.Add 'Zeilenzähler initialisieren iCounter = 0 'Zähler für geladenen Tabellen lgRow = Cells(Rows.Count, 2).End(xlUp).Row '? ===welche Zeile soll hier berechnet werden==== Do Until IsEmpty(wksAnzre.Cells(lngZeile, 2)) myDat = wksAnzre.Cells(lngZeile, 2) Set wbDataBook = Workbooks.Open(Pfad & myDat, UpdateLinks:=3) 'Kopieren Do myName = wksAnzrel.Cells(lngZeile, 3) Application.DisplayAlerts = False 'Sollte aktiviert werden wegen Bildschirmflackern Application.ScreenUpdating = False 'mit "UpdateLinks" werden Verknüpfungen aktualisiert wbDataBook.Worksheets(myName).Range("B212:D231").Copy _ Destination:=wbMainBook.Worksheets(1).Cells(lgRow + 1 + iCounter * 20, 2) 'Cells(iCounter, 2) 'Zeilenzähler hochsetzen iCounter = iCounter + 1 lngZeile = lngZeile + 1 Loop Until myDat <> wksAnzre.Cells(lngZeile, 2) 'Geöffnete Mappe schliessen wbDataBook.Close Loop 'Variable leeren Set wbDataBook = Nothing 'Speichert die Zusammengefasste Tabelle wbMainBook.SaveAs "D:\Testen\All_Data.xls" 'Variable leeren Set wbMainBook = Nothing Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
Anzeige
AW: Korrektur
27.07.2006 14:29:15
fcs
Hallo Erwin,
war noch ein kleiner Bug drin und ich hab gesehen, dass die Zeilen in der zusammengeführten Datei jetzt doch unmittelbar untereinander geschrieben werden und nicht mit Lücken von 20 Zeilen.
Gruß
Franz
Sub Dateien_in_eine_Tabelle_zusammenfuehrentest() 'by Ramses Dim wbMainBook As Workbook, wbDataBook As Workbook Dim iCounter As Integer, lgRow As Long Dim myDat As String Dim myName Dim wksAnzrel As Worksheet, strPfad As String strPfad = "D:\Testen\" Set wksAnzrel = Sheets("Anzrel") lngZeile = 2 '1. Zeiel mit Daten in Blatt "Anzrel 'Erstellt neue Mappe für die Datenausgabe Set wbMainBook = Workbooks.Add 'Zeilenzähler initialisieren iCounter = 0 'Zähler für geladenen Tabellen lgRow = Cells(Rows.Count, 2).End(xlUp).Row '? ===welche Zeile soll hier berechnet werden==== Do Until IsEmpty(wksAnzre.Cells(lngZeile, 2)) myDat = wksAnzre.Cells(lngZeile, 2) Set wbDataBook = Workbooks.Open(Pfad & myDat, UpdateLinks:=3) 'Kopieren Do myName = wksAnzrel.Cells(lngZeile, 3) Application.DisplayAlerts = False 'Sollte aktiviert werden wegen Bildschirmflackern Application.ScreenUpdating = False 'mit "UpdateLinks" werden Verknüpfungen aktualisiert wbDataBook.Worksheets(myName).Range("B212:D231").Copy _ Destination:=wbMainBook.Worksheets(1).Cells(lgRow + 1 + iCounter, 2) 'Zeilenzähler hochsetzen lngZeile = lngZeile + 1 iCounter = iCounter + 1 Loop Until myDat <> wksAnzre.Cells(lngZeile, 2) 'Geöffnete Mappe schliessen wbDataBook.Close Loop 'Variable leeren Set wbDataBook = Nothing 'Speichert die Zusammengefasste Tabelle wbMainBook.SaveAs "D:\Testen\All_Data.xls" 'Variable leeren Set wbMainBook = Nothing Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
Anzeige
AW: Korrektur
27.07.2006 17:55:24
Erich
Hallo Franz,
super - mit ein paar kosmetischen Korrekturen läuft der code einwandfrei. Hier die
neue Fassung:
Option Explicit
Sub Dateien_in_eine_Tabelle_zusammenfuehrentestfcs()
'by Ramses
Dim wbMainBook As Workbook, wbDataBook As Workbook
Dim iCounter As Integer, lgRow As Long
Dim myDat As String, lngZeile As Long
Dim myName
Dim wksAnzrel As Worksheet, strPfad As String
strPfad = "D:\Testen\"
Set wksAnzrel = Sheets("Anzrel")
lngZeile = 2 '1. Zeiel mit Daten in Blatt "Anzrel
'Erstellt neue Mappe für die Datenausgabe
Set wbMainBook = Workbooks.Add
'Zeilenzähler initialisieren
iCounter = 0 'Zähler für geladenen Tabellen
lgRow = Cells(Rows.Count, 2).End(xlUp).Row '? ===welche Zeile soll hier berechnet werden====
Do Until IsEmpty(wksAnzrel.Cells(lngZeile, 2))
myDat = wksAnzrel.Cells(lngZeile, 2)
Set wbDataBook = Workbooks.Open("D:\Testen\" & myDat, UpdateLinks:=3)
'Kopieren
Do
myName = wksAnzrel.Cells(lngZeile, 3)
' Application.DisplayAlerts = False
'Sollte aktiviert werden wegen Bildschirmflackern
Application.ScreenUpdating = False
'mit "UpdateLinks" werden Verknüpfungen aktualisiert
wbDataBook.Worksheets(myName).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0)
'Zeilenzähler hochsetzen
lngZeile = lngZeile + 1
iCounter = iCounter + 1
Loop Until myDat <> wksAnzrel.Cells(lngZeile, 2)
'Geöffnete Mappe schliessen
wbDataBook.Close
Loop
'Variable leeren
Set wbDataBook = Nothing
Columns("B:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
Range("B1").Select
'Speichert die Zusammengefasste Tabelle
wbMainBook.SaveAs "D:\Testen\All_Data.xls"
'Variable leeren
Set wbMainBook = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Abschließend noch 2 Fragen:
1. In der zusammengeführten Datei habe ich jetzt entdeckt, dass ich die Werte in den
Zeilen nicht sofort der Ursprungsdatei zuordnen kann. Kann man jede Zeile um eine
Spalte erweitern (links oder rechts) in der dann steht, von welcher Tabelle die Werte
dieser Zeile stammen (es ist sichergestellt, dass jeder Tabellenname nur 1 x vorkommt
(trotz mehrer Dateien)?
2. Irgendwo habe ich mal gelesen, dass man Daten auch aus geschlossenen Dateien auslesen kann,
wenn man den genauen Dateinamen, die genaue Tabellenbezeichnung und die Zellenposition
kennt. Bevor ich jetzt in der Recherche forsche: Wäre so ein Makros schneller, da ich ja alle Positionen genau kenne?
Besten Dank auf alle Fälle!!
mfg
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de
Anzeige
AW: Korrektur
28.07.2006 00:15:28
fcs
Hallo Erwin,
zu 1.
ich hab deinen Code entsprechend ergänzt/angepaßt und gleichzeitig einige jetzt überflüssige Zeilen und Variablendeklarationen gelöscht.
Der Pfad für die Daten Dateien wird jetzt zu Beginn des Makros mit der Variablen strPfad gesetzt. Nach dem Testen brauchst du nur hier zu Ändern
zu 2.
ich weis nicht ob es geht, respektive ob das Makro wesentlich schneller abläuft.
Eine Möglichkeit die Daten schneller zu übernehmen ist die, statt mit Copy-Einfügen zu arbeiten die Werte direkt aus den geöffneten Tabellen in die neu Tabelle zu schreiben. Allerdings werden dabei natürlich die Formate der Ursprungszellen nicht ins neue Blatt übertragen . Code sieht dann etwa so aus wbMainBook.Worksheets(1).Cells(lgRow, 2).Range("A1:C20").Value = _ wbDataBook.Sheets(myName).Range("B212:D231").Value
gruss Franz
modifizierter Code

Sub Dateien_in_eine_Tabelle_zusammenfuehrentestfcs()
'by FCS
Dim wbMainBook As Workbook, wbDataBook As Workbook
Dim myDat As String, lngZeile As Long
Dim myName As String, lgRow As Long
Dim wksAnzrel As Worksheet, strPfad As String
strPfad = "D:\Testen\" 'Pfad der Datendateien und neue Datei
Set wksAnzrel = Sheets("Anzrel")
lngZeile = 2 '1. Zeiel mit Daten in Blatt "Anzrel
'Erstellt neue Mappe für die Datenausgabe
Set wbMainBook = Workbooks.Add
' Application.DisplayAlerts = False
'Sollte aktiviert werden wegen Bildschirmflackern
Application.ScreenUpdating = False
Do Until IsEmpty(wksAnzrel.Cells(lngZeile, 2))
myDat = wksAnzrel.Cells(lngZeile, 2)
'mit "UpdateLinks" werden Verknüpfungen aktualisiert
Set wbDataBook = Workbooks.Open(strPfad & myDat, UpdateLinks:=3)
'Kopieren
Do
myName = wksAnzrel.Cells(lngZeile, 3)
'Nächste freie zeile zum Einfügen in wbMainBook
lgRow = wbMainBook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
wbDataBook.Worksheets(myName).Range("B212:D231").Copy _
Destination:=wbMainBook.Worksheets(1).Cells(lgRow, 2)
'Tabellenname einfügen
wbMainBook.Worksheets(1).Cells(lgRow, 5).Range("A1:A20").Value = myName
'Zeilenzähler hochsetzen
lngZeile = lngZeile + 1
Loop Until myDat <> wksAnzrel.Cells(lngZeile, 2)
'Geöffnete Mappe schliessen
wbDataBook.Close
Loop
'Variable leeren
Set wbDataBook = Nothing
Columns("B:D").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
Range("B1").Select
'Speichert die Zusammengefasste Tabelle
wbMainBook.SaveAs strPfad & "All_Data.xls"
'Variable leeren
Set wbMainBook = Nothing
'Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Anzeige
PERFEKT!!
28.07.2006 08:28:31
Erich
Hallo Franz,
besten Dank für die Optimierung - ist super!
(Das mit der Value-Funktion werde ich bei Gelegenheit mal testen.)
mfg
Private Tippgemeinschaft für Lotto oder KENO: http://www.kenostrategen.de

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige