# Excel Sheets auslesen



## Soilder (7. Juli 2010)

Hi, 
Ich hab mehrere Excel Arbeitsmappen, bei diesen würde ich gern auf einen Schlag alle Tabellennamen auslesen und in in eine neue Exceltabelle schreiben.
Ich kireg es via Makro hin, aber dazu müssen auch alle Arbeitsmappen geöffnet sein. 
Gibt es hier eine Lösung in welcher nicht erst alle Dateien geöffnet werden müssen?


----------



## Yaslaw (7. Juli 2010)

Im Hintergrund wird Excel schon geöffnet. Aber es muss ja nicht am Bildschirm aufpopen


```
' @param    iFilePath   Pfad der Exceldatei
' @return               Array mit den Sheetnamen der Exceldatei
Public Function readExcelSheetNames(ByVal iFilePath As String) As String()
On Error GoTo Err_Handler
    
    Dim myExcel As New excel.Application
    Dim myWorkbook As workbook
    Dim names() As String
    Dim i
    
    'Excel verstecken
    myExcel.Visible = False
    
    Set myWorkbook = myExcel.Workbooks.Open(iFilePath)
    ReDim names(myWorkbook.Sheets.Count - 1)
    
    For i = 0 To myWorkbook.Sheets.Count - 1
        names(i) = myWorkbook.Sheets(i + 1).name
    Next i
    
    readExcelSheetNames = names
    
Exit_Handler:
On Error Resume Next
    'Alle Objekte schliessen zerstören
    Call myWorkbook.Close
    Set myWorkbook = Nothing
    Call myExcel.Quit
    Set myExcel = Nothing
    
    Exit Function

Err_Handler:
    MsgBox Err.Description
    GoSub Exit_Handler
End Function
```

Und hier noch ein kleiner Test damit du siehst wie die Funktion angewendet wird

```
Public Sub testReadExcelSheetNames()
    Dim names() As String
    Dim i
    
    names = readExcelSheetNames("C:\temp\test.xls")
    
    For i = 0 To UBound(names)
        Debug.Print names(i)
    Next i


End Sub
```


----------



## Soilder (7. Juli 2010)

Vielen Dank! Aber da wird nichts geschrieben?! Oder mach ich grad was falsch?


----------



## Yaslaw (7. Juli 2010)

Wenndu das Testscript mit einem Excelfile von dir laufen lässt, dann sollte nachher im Direktfenster die Namen ausgegeben werden.

Der Befehl Debug.Print() schreibt das dorthin...

Aus was lässt du das laufen? Excel-VBA? Access-VBA? VB6? VB-Script?


----------



## Soilder (7. Juli 2010)

Ich hab es erst einmal in Excel-VBA probiert... müsste doch gehen oder? 
Sorry wenn ich mich so dumm anstelle...
Ich habs es nicht so mit VB, befasse mich normal mit PHP/MySQL/CSS...


----------



## Yaslaw (7. Juli 2010)

1) Also, geh ins VBA von Excel.
2) Kopiere beide Funktionen rein
3) ändere den Dateipfad in der Funktion testReadExcelSheetNames() auf einen Pfad der bei dir exisitert
4) Führe die sub testReadExcelSheetNames() aus
5) Schaue im Direktfenster (immediate-Window) die Ausgabe an. Wenn dieses nicht angezeigt eitd, blende es über den Menüpunkt Ansicht (View) ein


----------



## Soilder (7. Juli 2010)

Des mit dem Direktfenster wars wohl... . Vielen Dank!


----------



## Soilder (7. Juli 2010)

```
Public Sub testReadExcelSheetNames()
    Dim names() As String
    Dim i
   
    names = readExcelSheetNames("C:\temp\test.xls")
   
    For i = 0 To UBound(names)
        Debug.Print names(i)
    Next i
 
 
End Sub
```
Hab diesen Teil damit ersetzt somit schreibt es mir diese Ausgabe schön in eine Datei 

```
Public Sub testReadExcelSheetNames()
   Dim names() As String
   Dim i
   Dim strPath As String
   strPath = "C:\Ausgabe.txt" 
   names = readExcelSheetNames("C:\kopie.xls")

   Open strPath For Output As #1
   For i = 0 To UBound(names)
      Print #1, names(i)
   Next
   Close #1
```

Doch nun noch eine allerletzte Frage... Wie Kann ich mehrere Dateien definieren die ausgelesen werden sollen? 
Also meine theoretische Vorstellung zu ist: 
Alle Dateinamen in eine "Liste.txt" zuschreiben, welche durch ein Array eingelesen wird und und dann Arbeitsmappe für Arbeitsmappe abgearbeitet wird.
Des mit dem Array würde ich vlt hinbekommen... aber wie öffne ich die "Ausgabe.txt" und ergänze darin die Einträge ohne diese zu überschreiben?


```
Dim Arr()
    For X = 1 To 50
        ReDim Preserve Arr(X)
        Arr(X) = Range("A" & X)
    Next X
        For X = 1 To UBound(Arr)
        Debug.Print Arr(X)
    Next X
```

Damit lese ich dir Werte(Pfade) in der dem bereich A1:A50 ein.
Jetzt muss ich des nur noch verarbeiten können woran es bei mir aber scheitert...


----------



## Soilder (8. Juli 2010)

So also ich komme nicht wirklich vorwärts... .
Wie kann ich es realisieren dass mehrere Dateien nacheinander ausgelesen werden? 
Also ich schreibe in der Tabelle in die Zellen A1-A10 Pfade diese werden auch ausgelesen und entsprechend verarbeitet.
Ich kireg nur dass auslesen der Pfade mit einem For-Schleife hin... Kann mir jemand helfen? 
Bin echt am verzweifeln..

Gruß


----------



## Yaslaw (8. Juli 2010)

Kombiniere deine Schleife mit dem Testaufruf testReadExcelSheetNames()


----------



## Soilder (8. Juli 2010)

```
Public Sub testReadExcelSheetNames()
    Dim names() As String
    Dim I
    Dim a
    Dim myExcel As New Excel.Application
    Dim myWorkbook As New Workbook
    Dim arbeitsmappe() As String
    strPath = "C:\Ausgabe.txt" 'ausgabe Pfad definieren

    Dim Arr()
        For X = 1 To 10
             ReDim Preserve Arr(X)
             Arr(X) = Range("A" & X)
             zaehler = c + 1
             Debug.Print Arr(X)

            names = readExcelSheetNames(Arr(X))

        Next X
            
End Sub
```
Hier werden die Pfade eingelesen, des passt soweit, doch ich komm nicht drauf wie ich des mit dem schreiben machen soll... wie Schleifen kombinieren? Hat bei mir gar nicht geklappt... Muss ich dabei was besonderes beachten?

```
Open strPath For Output As #1
           For I = 0 To UBound(names)
           Print #1, names(I)
           Next I
           Close #1
```


----------



## Yaslaw (8. Juli 2010)

Die folgende Reihenfolge sollte gehen

Öffnen der Ausgabedatei
Schleife über alle Einträge
-- auslesen der Namen
-- Schleife über alle namen
-- -- mit Print #1 der Daei hinzufügen
-- Namensschleife schliessen
Eintragsschleife schliessen
Datei schliessen


----------



## Soilder (8. Juli 2010)

Ich hab schon einiges ausprobioert, aber ich krieg es einfach nicht hin , ich stell mich wohl zu blöd an... 

Und egal wie ich es mach krieg ich immer 'Laufzeitfehler 9' Index ausserhalb des gültigkeitsbereiches


----------



## Yaslaw (8. Juli 2010)

Habs nicht getestet. Aber das ist das was ich dir oben beschrieben habe

```
Public Sub testReadExcelSheetNames()
    Dim i, j
    strPath = "C:\Ausgabe.txt" 'ausgabe Pfad definieren

    Open strPath For Output As #1
    For i = 1 To 10
        names = readExcelSheetNames(Range("A" & i))
        For j = 0 To UBound(names)
            Print #1, names(j)
        Next j

    Next i
    Close #1
End Sub
```


----------



## Soilder (8. Juli 2010)

Tausend Dank für deine Hilfe! Es klappt .


----------



## Yaslaw (8. Juli 2010)

Dann ist der Array names() leer.
Mach mal vor dem 'names = readExcel...' ein Debug.Print auf 'Range("A" & i)' und prüfe ob der ausgegebene Link richtig ist, dort ein Excelworkbook ist und ob es Sheets beinhaltet.

Nachtrag:
Wurden hier Threads zusammengezogen? Dieser mein Beitrag macht so grad wenig Sinn, obwohl ich sicher bin, dass beim Schreiben noch eine Frage da war....


----------



## Soilder (8. Juli 2010)

Hab gemerkt dass wenn ich dass skript sehr oft hintereinander ausführe, dann kommt dieser Fehler... Dann muss ich alles schliessen und neu öffnen und es geht wieder... 
Danke nochmal!


----------



## DrMueller (21. Juli 2010)

Hey Yaslaw, hab was ähnliches.
Ich möchte gerne die Sheets eines Workbooks zu einem grossen Sheet mergen
.Alternativ könnte ich sie auch als einzelne Files speichern.

Ich hab bisschen gegoogelt, aber z.B.
http://wiki.sitepark.com/index.php/ExcelSheet_(Objekt)

sagt ja nur, dass es nur sehr wenige Attribute gibt resp. damit überhaupt nicht gearbeitet werden kann.
Stimmt das denn so oder sehe ich etwas falsch?


----------

