2009-07-24 7 views
5

Ich erhalte monatlich mehr als 100 Excel Tabellenkalkulation, aus denen ich einen festen Bereich nehme und in andere Tabellen einfügen, um einen Bericht zu erstellen.Datenextraktion mit Excel

Ich versuche, ein VBA-Skript zu schreiben, um meine Excel-Dateien zu iterieren und den Bereich in einer Tabelle zu kopieren, aber ich konnte es nicht tun.

Gibt es eine einfache Möglichkeit, dies zu tun?

+3

Qusetions: 1) Was hast du bisher? 2) Wie kann ich wissen, welche Dateien geöffnet werden sollen?und 3) Was ist das Problem, auf das Sie stoßen? – RBarryYoung

Antwort

3

Ich schrieb dies vor Jahren, aber vielleicht wird es Ihnen helfen. Ich habe die Erweiterung für die neueste Version von Excel (xlsx) hinzugefügt. Scheint zu arbeiten.

Sub MergeExcelDocs() 
    Dim lastRow As Integer 
    Dim docPath As String 
    Dim baseCell As Excel.range 
    Dim sysObj As Variant, folderObj As Variant, fileObj As Variant 
    Application.ScreenUpdating = False 
    docPath = Application.GetOpenFilename(FileFilter:="Text Files (*.txt),*.txt,Excel Files (*.xls),*.xls,Excel 2007 Files (*.xlsx),*.xlsx", FilterIndex:=2, Title:="Choose any file") 
    Workbooks.Add 
    Set baseCell = range("A1") 
    Set sysObj = CreateObject("scripting.filesystemobject") 
    Set fileObj = sysObj.getFile(docPath) 
    Set folderObj = fileObj.ParentFolder 
    For Each fileObj In folderObj.Files 
     Workbooks.Open Filename:=fileObj.path 
     range(range("A1"), ActiveCell.SpecialCells(xlLastCell)).Copy 
     lastRow = baseCell.SpecialCells(xlLastCell).row 
     baseCell.Offset(lastRow, 0).PasteSpecial (xlPasteValues) 
     baseCell.Copy 
     ActiveWindow.Close SaveChanges:=False 
    Next 
End Sub 

EDIT:

Ich sollte erwähnen, wie es funktioniert. Wenn Sie das Makro starten, wird ein Dialogfeld "Datei öffnen" geöffnet. Doppelklicken Sie auf die erste Datei in der Liste (oder auf eine andere Datei). Es erstellt eine neue Arbeitsmappe und durchläuft dann alle Dateien im Ordner. Für jede Datei wird der gesamte Inhalt aus dem ersten Arbeitsblatt kopiert und am Ende der neuen Arbeitsmappe eingefügt. Das ist so ziemlich alles.

+0

Arbeitete wie ein Charme! Ich habe gerade hinzugefügt: Bereich ("H14: N14"). Kopieren Um meine Bedürfnisse anzupassen; Aber auf der anderen Seite versuche ich, den ADO-Weg für mehr Flexibilität zu gehen. Vielen Dank Herr! Ich bin ein glücklicher Cubicle Bewohner! – Rodrigo

+0

Froh, dass es geholfen hat! – devuxer

1

Haben Sie versucht,

Tools->Macro->Record New Macro 

maco zu schaffen, das Gleiche zu tun

+0

Ich habe getan, um ein Gefühl dafür zu bekommen, wie VBA Sachen macht, aber ich muss es tun, um das Gleiche mit einer Reihe von Dateien zu machen. – Rodrigo

+0

Dies ist der Ausgangspunkt aller meiner Makros. – Kieveli

+0

Sie könnten eine leere Zieltabelle mit dem Makro darin haben. Lassen Sie Dateien durchlaufen, öffnen Sie sie nacheinander und kopieren Sie dann alles heraus. Versuchen Sie, ein Makro aufzunehmen, während Sie es mit ein paar Dateien machen. – Kieveli

2

Eine andere Lösung ist Ihr Roll-up-Tabelle Zugriff die anderen Tabellen von Dateinamen zu haben, und die Daten selbst greifen.

Dazu müssen alle Tabellen gleichzeitig geöffnet sein, damit die Links aktualisiert werden können. Dies ist jedoch wahrscheinlich immer noch schneller als das Öffnen und Kopieren bzw. Einfügen eines einzelnen Dokuments, selbst mit einem Makro . Jede Tabelle muss einen eindeutigen Dateinamen haben.

Wenn die Namen der Tabellen erst bekannt sind, wenn Sie sie erhalten oder sie sich regelmäßig ändern, erstellen Sie in Ihrer Rollup-Tabelle eine Spalte, in der der Dateiname der Tabellen gespeichert wird. Erstellen Sie dann die gewünschte Adresse mithilfe der Zeichenfolgenbearbeitung und erhalte die Daten mit INDIRECT().

=INDIRECT("'[C:\path\workbook.xls]MyWorksheet'!$A$2") 

Spülen und wiederholen Sie die oben für jede Zelle jeder Tabelle, die Sie erhalten möchten:

Beispiel eine Zelle von Daten aus einer bestimmten Datei zu greifen.

Sie sollten schlau sein, wie Sie die Zeichenfolge an INDIRECT() übergeben können. Erstellen Sie es als eine Formel, so dass Sie buchstäblich die gleiche Formel für jede Zelle verwenden können, die Sie abrufen müssen.

Beispiel:

= INDIRECT("'[" & $A2 & "]MyWorksheet'!$" & ADDRESS(3, COL())) 

Die Formel oben an der Tabelle, deren Dateinamen gehen ist in $ A2 (man beachte das Fehlen von $ vor „2“ so können Sie die gleiche Formel auf andere Zeilen für andere Dateien einfügen), und den Wert der Zelle auf dem MyWorksheet-Blatt in Zeile drei und der aktuellen-Spalte erhalten (also, wenn dies in B2 auf Ihrem Roll-up ist, erhält es B3 von der anderen Datei).

Passen Sie die ADDRESS-Funktion an, um Offsets zur benötigten Zeile und Spalte hinzuzufügen.

Der Vorteil der obigen Lösung besteht darin, dass die gleiche Formel kopiert und in die Zeilen und Spalten eingefügt werden kann, die Sie ausfüllen müssen, und Excel passt $ A2 und COL() nach Bedarf an. Sehr pflegeleicht.

Bearbeiten einmal hatte ich eine ähnliche Situation, und ich konnte nicht alle Tabellen auf einmal laden (mehr als 200). Ich glaube, ich habe am Ende die VBA geschrieben, also tat es nicht tatsächlich öffnen und lesen Sie die Excel-Dateien. Stattdessen ließ ich die Dateinamen durchlaufen, öffne jeweils eine ODBC-Verbindung und benutze ADO, um die benötigten Werte aus einem vorgegebenen benannten Bereich zu lesen (der als "Tabelle" in ODBC erscheint - die Arbeitsblätter erscheinen auch als "Tabellen") "Aber es gibt Regeln über erlaubte Namen." Dies war viel schneller als das Öffnen und Schließen von Excel-Dateien und hatte den zusätzlichen Vorteil, dass Excel nicht abstürzte.

+0

Ich mache das jetzt mit einer Formel, um den Wert aus der Tabelle aufzurufen. Die bevorzugte Lösung wäre jedoch ein VBA-Skript von Excel. – Rodrigo

1

Rodrigo,

Ich vermute, Sie meinen über 100 Arbeitsmappen, die Sie brauchen, in einem einzeln öffnen und kopieren und einfügen? Klingt nach Spaß :)

Wenn Sie alle in einem einzigen Verzeichnis speichern könnten, ist das Öffnen jeder Datei relativ einfach, suchen Sie zuerst. (@ Mark Biek hat ein gutes Beispiel für Sie geschrieben)

Sobald Sie eine Datei geöffnet haben, würde ich dann die Daten in ein ADO-Recordset kopieren, die Sie dann anhängen würden. Ich habe posted some code für ein etwas sehr ähnliches mit dem Zusammenführen mehrerer Blätter in einer Arbeitsmappe.

Es ist nicht genau das, was Sie brauchen, aber es sollte helfen. Wenn nicht, posten Sie, wie weit Sie kommen und ich werde während der Woche noch einmal schauen.

6

Hier einig VBA-Code, Iterieren über eine Reihe von Excel-Dateien in einem Verzeichnis zeigt und Öffnen jeder:

Dim sourcePath As String 
Dim curFile As String 
Dim curWB As Excel.Workbook 
Dim destWB As Excel.Workbook 

Set destWB = ActiveWorkbook 
sourcePath = "C:\files" 

curFile = Dir(sourcePath & "\*.xls") 
While curFile <> "" 
    Set curWB = Workbooks.Open(sourcePath & "\" & curFile) 

    curWB.Close 
    curFile = Dir() 
Wend 

Hoffentlich dass es einen gut genug Ausgangspunkt für Sie, Ihren vorhandenen Makrocode zu arbeiten .

+0

Es ist, vielen Dank, Mark. Das wirkliche Problem für mich war, die Auswahl zu bekommen: copy: change workbook: paste sequence rigth. – Rodrigo

0

In der Vergangenheit habe ich VBA verwendet, um externe Referenzen (Links) zu erstellen.

ich hier darüber geschrieben (siehe Beispiel 2): ​​

Best short examples of the need for Excel VBA

es um die Verwendung INDIREKTE ähnlich ist, aber die Excel-Arbeitsmappe, ohne offen zu haben.

Der einzige Nachteil ist, dass ein alter Computer oder eine alte Version von Excel, nicht sicher, was, kann diesen Prozess verlangsamen. Ich glaube, es ist so, weil jedes Mal, wenn eine neue externe Referenz hinzugefügt wird, alle anderen externen Referenzen aktualisiert werden. Um es schneller zu machen, habe ich Berechnung auf Manuell gesetzt, die externen Referenzen hinzugefügt und Berechnung auf Automatisch gestellt, um sie zu aktualisieren.

Danach, wenn Sie nur die Werte möchten, können Sie die Verknüpfung verwenden, oder Kopieren und Einfügen von Sonderwerten.