konmaster
Goto Top

mehrere Exceldateien in eine Excel Datei zusammenfassen

Hallo alle zusammen,

habe folgebdes Problem, versuche es kurz zusammenzufassen.

habe ca. 370 Excel Dateien die ich gerne zu einer machen will, um die später besser auswerten zu können.
Die Dateinamen sind wie folgt aufgebaut: 151~0006@284774.xls, 151~0007@284774.xls, 151~0008@284774.xls usw. alle Dateien sind gleich aufgebaut und von jeder datei bräuchte ich die Zelleninhalte von C54:C332 und, um die Datensätze wieder identifizieren zu können die Zelle B9, die über jeden Datesatz stehen soll. Die ich aber schon manuell eingetragen habe, sollen aber trotzdem mitgeschrieben werden, falls man Nachforschung betreiben möchte/muss.

das. Beispiel unten haut leider nicht ganz hin, da er die datensätze durcheinander kopiert und ich die später nicht mehr identifizieren kann.


Sub Makro1()


Dim Rohdaten(36) As String
Dim AnzahlDateien
Dim ZuÖffnendeDateien, W, Pfad, excelMesswerteDate

ZuÖffnendeDateien = Application.GetOpenFilename("MPT Meßwerte (*.xls), *.xls", _
, "MPT .xls-Datei auswählen", , True)

If IsArray(ZuÖffnendeDateien) Then
For Each W In ZuÖffnendeDateien
AnzahlDateien = AnzahlDateien + 1

For j = 1 To Len(W)
If Left(Right(W, j), 1) = Application.PathSeparator Then
Exit For
Else
End If

Next j

Rohdaten(AnzahlDateien) = Right(W, j - 1)
Pfad = Left(W, Len(W) - Len(Rohdaten(AnzahlDateien)))
Rohdaten(AnzahlDateien) = _
Left(Rohdaten(AnzahlDateien), Len(Rohdaten(AnzahlDateien)) - 4)

Next W

Else

End If

ThisWorkbook.Activate
Sheets.Add
ActiveSheet.Name = "Tabelle1"


For k = 1 To AnzahlDateien


excelMesswerteDatei = Pfad & Rohdaten(k) & ".xls"


Workbooks.OpenText Filename:= _
excelMesswerteDatei _
, Origin:=xlWindows, StartRow:=54, DataType:=xlDelimited, TextQualifier _
:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array _
(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8 _
, 1)), DecimalSeparator:=".", ThousandsSeparator:=" ", TrailingMinusNumbers:=False


Range("C54:C332").Select
Selection.Copy
ThisWorkbook.Activate
Sheets("Tabelle1").Select
Cells(2, k + 1).Select
ActiveSheet.Paste


Next k
End Sub

1771ae4bd91e5e589324bdb8d4fcbc45-vorlage

Für eure Unterstützung wäre ich sehr dankbar...

Content-Key: 62052

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

Printed on: April 18, 2024 at 11:04 o'clock

Member: stplaner
stplaner Jun 22, 2007 at 07:36:42 (UTC)
Goto Top
nur ein kleiner Hinweis:

Excel kann nur ca 65000 datensätze verwalten und du kommst über 100000 zeilen

ist nur ein Hinweis mehr nicht
Member: konmaster
konmaster Jun 22, 2007 at 07:44:13 (UTC)
Goto Top
nur ein kleiner Hinweis:

Excel kann nur ca 65000 datensätze
verwalten und du kommst über 100000
zeilen

ist nur ein Hinweis mehr nicht

ich wolte auch nur 230 Spalten in Anspruch nehmen...
Member: bastla
bastla Jun 22, 2007 at 08:10:12 (UTC)
Goto Top
Hallo konmaster!

Bessere Antwort wäre gewesen (falls die verwendete Office-Version nicht der Geheimhaltung unterliegt): "Habe Excel 2007 und daher mit der Zeilenanzahl kein Problem ..."

Ansonsten hast Du je Excel-Datei 280 Werte, welche Du nicht in einer Zeile unterbringen kannst, bzw, wenn sie in Spalten stehen sollen und "nur 230 Spalten in Anspruch nehmen..." so zu interpretieren ist, dass nur 230 der 370 Dateien verwendet werden sollen, dann war Deine obige Problembeschreibung irreführend.

Grüße
bastla
Member: konmaster
konmaster Jun 22, 2007 at 08:36:45 (UTC)
Goto Top
Hallo konmaster!

Bessere Antwort wäre gewesen (falls die
verwendete Office-Version nicht der
Geheimhaltung unterliegt): "Habe Excel
2007 und daher mit der Zeilenanzahl kein
Problem ..."

Ansonsten hast Du je Excel-Datei 280 Werte,
welche Du nicht in einer Zeile unterbringen
kannst, bzw, wenn sie in Spalten stehen
sollen und "nur 230 Spalten in
Anspruch nehmen...
" so zu
interpretieren ist, dass nur 230 der 370
Dateien verwendet werden sollen, dann war
Deine obige Problembeschreibung
irreführend.

Grüße
bastla


habe Excel 2002 SP3 und ich würde auch mit 230 oder max 255 auch klarkommen... also zeilem anzahl ist nicht mein problem, mein problem ist das oben steh. makro nicht so richtig funktioniert wie ich mir das vorstelle d.h. ich kann max 20 datensätze auslesen, dann muss ich die prozedur wiederholen, da das prog ab gewis. an datensätzen abstürzt/fehlermeldung...

das 2te problem ist die daten die überschrieben werden durcheinander sortiert sind, so dass die später nicht mehr identifizieren kann.

eins muss ich noch anmerken, dass ich absoluter vba anfänger bin, den makro habe ich von ein kollegen bekommen der nicht mehr erreichbar ist und ich brauche die auswertung dringend.

deswegen habe ich hier im forum um unterstützung gebeten...

danke im voraus

Gruß konmaster
Member: bastla
bastla Jun 22, 2007 at 08:46:39 (UTC)
Goto Top
Hallo konmaster!

Also konkret:
Von den existierenden ca 370 Dateien, benannt nach dem Schema "151~####@284774.xls" sollen aus etwa 230 (manuell auszuwählenden?) Dateien die Zellen B9 sowie C54:C332 der ersten Tabelle in eine neue Tabelle als Spalten ab Zeile 1 eingefügt werden - richtig?

Grüße
bastla
Member: konmaster
konmaster Jun 22, 2007 at 09:06:28 (UTC)
Goto Top
Hallo konmaster!

Also konkret:
Von den existierenden ca 370 Dateien,
benannt nach dem Schema
"151~####@284774.xls" sollen
aus etwa 230 (manuell auszuwählenden?)
Dateien die Zellen B9 sowie C54:C332 der
ersten Tabelle in eine neue Tabelle als
Spalten ab Zeile 1 eingefügt werden -
richtig?

Grüße
bastla


1.genau es sind 370 dateien die nach dem schema(rechts) benannt sind -->151~####@284774.xls

2. auf jeden fall wähle ich die 230 Dateien aus, manuel oder automatisch völlig egal...

3. dann sollen aus den 370 dateien die zellen C54:C332 und zur identiviezierung B9 ausgelesen werden und in ein blatt/tabelle übertragen werden... Beispiel für ein datensatz (B9-->007 datensatz 007 und C54:C332--> die zugehörigen werte)

ich hoffe, dass es einigermassen verständlich ist... ich weiss ich bin ein erklärbär. (sorry)

danke für die unterstützung
Member: bastla
bastla Jun 22, 2007 at 09:09:01 (UTC)
Goto Top
... bzw, wenn es Dir grundsätzlich möglich war, mit Deinem Code Daten zu erhalten, vielleicht zwischendurch ein Versuch: Ändere die Zeile
Dim Rohdaten(36) As String
auf
Dim Rohdaten(250) As String
und versuch es dann nochmals.

Grüße
bastla

[Edit] Hatte Deinen vorigen Kommentar noch nicht gesehen ... [/Edit]
Member: konmaster
konmaster Jun 22, 2007 at 09:42:41 (UTC)
Goto Top
... bzw, wenn es Dir grundsätzlich
möglich war, mit Deinem Code Daten zu
erhalten, vielleicht zwischendurch ein
Versuch: Ändere die Zeile
Dim Rohdaten(36) As String
> 
auf
Dim Rohdaten(250) As String
> 
und versuch es dann nochmals.

Grüße
bastla

[Edit] Hatte Deinen vorigen Kommentar noch
nicht gesehen ... [/Edit]

das hab ich geändert, jetzt kann ich schon mal alle dateien auslesen, aber ich brauche die spalten überschrift, um die datensätze identivizieren. sprich Zelle: B9 die aus jedem Datensatz ausgelesen wird und für jede einzelne spalte als überschrift in einer zusammen gefassten tabelle steht...
Member: bastla
bastla Jun 22, 2007 at 09:56:00 (UTC)
Goto Top
Hallo konmaster!

Ergänze den folgenden Code-Block (alt)
Range("C54:C332").Select  
Selection.Copy
ThisWorkbook.Activate
Sheets("Tabelle1").Select  
Cells(2, k + 1).Select
ActiveSheet.Paste
zu dieser Fassung:
<b>ID = Range("B9").Value</b>  
Range("C54:C332").Select  
Selection.Copy
ThisWorkbook.Activate
Sheets("Tabelle1").Select  
Cells(2, k + 1).Select
ActiveSheet.Paste
<b>Cells(1, k + 1).Value = ID</b>
Zur Sicherheit kannst Du noch in einer der "Dim"-Zeilen oben am Ende ", ID" anfügen.
In der Zwischenzeit habe ich noch eine Alternativ-Lösung versucht:
Kopiere alle (230) Dateien, aus denen Daten übernommen werden sollen, in einen neuen Ordner, zB "D:\Datensammlung". Erstelle eine neue Exceldatei nicht im selben Ordner und füge dort das folgende VBA-Programm in ein Modul ein:
Sub Zusammenfassen()

Const sSourcePath = "D:\Datensammlung"  

Set wbGes = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")  

C = 2 '(ab Spalte B in der Sammeltabelle eintragen)  

For Each oFile In fso.GetFolder(sSourcePath).Files
    'nur .xls-Dateien bearbeiten  
    If LCase(Right(oFile.Name, 4)) = ".xls" Then  
        Application.Workbooks.Open (oFile.Path)
        ID = ActiveWorkbook.Worksheets(1).Range("B9").Value  
        aTemp = ActiveWorkbook.Worksheets(1).Range("C54:C332")  
        ActiveWorkbook.Close
        wbGes.Worksheets(1).Cells(1, C).Value = ID
        wbGes.Worksheets(1).Range(Cells(2, C), _
            Cells(2 + UBound(aTemp) - 1, C)) = aTemp
        C = C + 1
    End If
Next 'Datei  
wbGes.Worksheets(1).Activate
'Gesamt-Datei speichern  
wbGes.Save
MsgBox "Fertig."  
End Sub
Speichere die Datei und führe den Code aus (wird vermutlich etwas dauern ...). Eventuell musst Du die Formatierungen in der Sammeldatei anpassen, zB per "Format übertragen" (Pinsel-Symbol) aus einer Originaldatei.

Grüße
bastla

P.S.: Habe momentan nicht mehr Zeit, daher dieser Lösungsansatz "auf Verdacht" ...
Member: konmaster
konmaster Jun 22, 2007 at 11:18:52 (UTC)
Goto Top
ich danke dir, habe jetzt auch keine zeit mehr auszubrobieren...
werd mich noch melden obs funktioniert hat...
Member: konmaster
konmaster Jun 23, 2007 at 20:13:08 (UTC)
Goto Top
alles klar, hat wunderbar funktioniert...

eine frage der schönheit, ist es möglich vor der datensatz nummer ein "Y" einzufügen, dass es z.b. so aussieht Y6, Y7, Y8... usw...


noch ma vielen dank für die unterstützung....
Member: bastla
bastla Jun 24, 2007 at 07:10:57 (UTC)
Goto Top
Hallo konmaster!

Ersetze die letzte Zeile (wenn Du Dein Script verwendest) durch
Cells(1, k + 1).Value = "Y" & CStr(ID)  
In der Alternativvariante müsstest Du folgende Änderung vornehmen:
wbGes.Worksheets(1).Cells(1, C).Value = <b>"Y" & CStr(ID)</b>  

Grüße
bastla
Member: bolshi
bolshi May 21, 2008 at 14:26:32 (UTC)
Goto Top
Hallo,
ich versuche mich auch grad an einer Vielzahl von Dateien mit unterschiedlichem range. Bei der größten Datei reicht der range von A1 über vier Spalten und 2042 Zeilen.


[code]
ID = ActiveWorkbook.Worksheets(1).Range("A1:Cells[2042]", "[4]").Value
[/code]

Die ursprüngliche Codezeilen sehen so aus:

[code]
ID = ActiveWorkbook.Worksheets(1).Range("C54:C332").Value
aTemp = ActiveWorkbook.Worksheets(1).Range("C54:C332")
[/code]

Der Debugger schllägt in folgender Zeile Alarm:

[code]
wbGes.Worksheets(1).Range ("A1:Cells[3000]", "[4]"), _
Cells(2 + UBound(aTemp) - 1, C) = aTemp
[/code]

Wie definiere ich range richtig?

Wird die Formatierung aus der alten Datei im Normalfall mit übernommen?

bolshi
Member: bastla
bastla May 21, 2008 at 21:03:24 (UTC)
Goto Top
Hallo bolshi!

Wie definiere ich range richtig?
Wenn Du offensichtlich bereits die gewünschte Zeilen-/Spaltenanzahl kennst, kannst Du das etwa so schreiben:
aTemp = ActiveWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2042, 4)).Value
Damit wird ein Array mit den Werten des Bereichs erstellt, was Deine nächste Frage ("Wird die Formatierung aus der alten Datei im Normalfall mit übernommen?") auch gleich beantworten sollte ...
Im übrigen fände ich es sinnvoll, Dein Vorhaben in einem neuen Beitrag darzustellen (nicht zuletzt auch, da sich außer uns beiden wohl kaum jemand in diesen Thread hier verirren dürfte) ...

Grüße
bastla