« Audible revisited | Main | Moldenhauer »

Sonntag, November 15, 2009

Excel-Programmierung

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
Erstellt von tixus um 2:12 PM Kategorien: Software + Java
Powered by
Thingamablog 1.1b6