« Audible revisited | Main | Moldenhauer »
Meine ersten Versuche mit Excel kosten ziemlich viel Zeit: Beim Lernen einer neuen Programmiersprache fühlt man sich immer mal wieder wie ein Legastheniker und für erfahrene Programmierer kommt noch das eher hinderliche Vorwissen dazu, wie Dinge in Sprache XY gemacht werden und nun zu fehlen scheinen; zum Beispiel das Continue-Statement:
VB doesn't have a Continue statement. You can imitate one like this...
For Each ....
If .... Then Goto Continue1
.... 'rest of loop
Continue1:
Next
Note that I used a number on the end because if you have more than one situation where you want the Continue, your Labels that you GoTo must be uniquely named. Rick
Das ist im Einzelnen nicht weiter schlimm, aber bei jeder Zeile stolpert man halt so vor sich hin. Und viele Excel-Programmierer haben wirklich das Visual in VBA sehr deutlich vor Augen bei den angebotenen Hilfen und Lösungen: Da werden Zellen in den Arbeitsblättern kopiert und eingefügt und angehängt, ohne dafür Datenstrukturen im Speicher zu benutzen, d.h. viele Macros sind wirklich "nur" aufgezeichnete manuelle Operationen, ohne wirkliche Programmierung. Wenn man letzteres will, ist man mit einem Excel-Buch wie diesem von Michael Kofler sehr gut bedient (ich habe die Buch-Auswahl nach dem Vorkommen der Worte "Collection" und "Dictionary" im Index gemacht.) Herr Kofler dürfte noch aus dem Linux-Handbuch bekannt sein.
Nach einer Weile stellt man fest, dass die Office-Suite in handliche Objekte mit einer Vielzahl von Methoden und Hierarchien verpackt ist. Und vieles läßt sich mit der Online-Hilfe sehr intuitiv erfahren; der Visual-Basic-Edior ist erstmal gewöhnungsbedürftig (sofortiges Compile führt zu Syntaxfehlern, Groß/Kleinschreibungsersetzung).
Naja, am Ende schaffe ich es, eine Routine zu schreiben, die alle Excel-Dateien in einem Verzeichnis ermittelt und aus jeder Datei bestimmte Werte ("Mediennummer") zu sammeln und sie mit dem Dateinamen in einer Map(Mediennummer->Dateiname1, Dateiname2, ...) zu sammeln - alles ohne neues Excel-Blatt, nur im Speicher.
Sub Einlesen()
On Error Resume Next
Set map = New Dictionary
Dim result As Variant
Dim baseFolder As folder
Path = Application.GetOpenFilename("Excel-Dateien,*.xls")
Path = Left(Path, InStrRev(Path, "\"))
Set baseFolder = fso.GetFolder(Path)
For Each wbkName In baseFolder.Files
'exclude macro file, result file and non-excel files
If wbkName.Name = "Ergebnis.xls" Then GoTo continue
If wbkName.Name = ThisWorkbook.Name Then GoTo continue
If UCase(Right(wbkName.Name, 4)) ".XLS" Then GoTo continue
Workbooks.Open wbkName.Path
For Each Worksheet In Workbooks(wbkName.Name).Worksheets
'Worksheet.Activate
Dim intCounter As Integer
For i = 1 To Worksheet.UsedRange.Rows.Count
For j = 1 To Worksheet.UsedRange.Columns.Count
If IsRelevant(Cells(i, j)) Then
mediennummer = Cells(i, j).Value
kundendatei = wbkName.Name
If map.Exists(mediennummer) Then
Set kundendateien = map(mediennummer)
kundendateien.Add kundendatei
Else
Set kundendateien = New Collection
kundendateien.Add kundendatei
map.Add mediennummer, kundendateien
End If
End If
Next j
Next i
Next
Workbooks(wbkName.Name).Close
continue:
Next
End Sub