Excel-Funktionen in Access nutzen

15.08.2006 von Helma  Spona
Excel verfügt über eine ganze Reihe interessanter Funktionen für mathematische und statistische Berechnungen, die sich mit nur geringem Aufwand auch in Access nutzen lassen. Wie das geht, erfahren Sie im vorliegenden Beitrag.

Damit Sie Excel-Funktionen nutzen können, müssen Sie Excel im Hintergrund starten. Damit Sie das nicht für jede Funktion einzeln machen müssen, sollten Sie sich zwei Hilfsfunktionen erstellen: eine, die Excel startet beziehungsweise das Application-Objekt von Excel zurückgibt, und eine zweite, die Excel beendet, falls es zuvor gestartet wurde.

Zwischen den beiden Funktionsaufrufen können Sie dann die Funktionen aufrufen und deren Rückgabewerte verwenden. Sie sollten dann wenn möglich alle Funktionen aufrufen, die Sie benötigen, und die Ergebnisse in Variablen zwischenspeichern. Das erhöht die Performance.

Verweise einrichten

Während der Entwicklung ist es sinnvoll, einen Verweis auf die Excel-Objektbibliothek einzurichten. Den sollten Sie aber vor der Weitergabe der Datenbank wieder löschen und dann alle mit Excel.Application deklarierten Variablen als Object deklarieren. Der Aufruf der Methoden und Funktionen wird dann zwar langsamer ausgeführt, dafür haben Sie bei der dann verwendeten späten Bindung keine Probleme, wenn der Endanwender die Datei in anderen Access-Versionen nutzt.

Bild 1: Verweis auf Excel-Objektbibliothek erstellen.

Erstellen Sie den Verweis, indem Sie Extras/ Verweise aus dem Menü der Entwicklungsumgebung auswählen, und aktivieren Sie das Kontrollkästchen vor dem Eintrag Microsoft Excel 11.0 Object Library (Bild 1). Schließen Sie danach den Dialog mit OK. Um den Verweis wieder zu deaktivieren, rufen Sie das Dialogfeld am Ende erneut auf und deaktivieren das Kontrollkästchen wieder.

Excel starten

Excel soll natürlich nur dann gestartet werden, wenn es noch nicht gestartet ist. Ansonsten würde es ausreichen, die aktuelle Instanz von Excel zurückzugeben. Zunächst sollten Sie also versuchen, mit der GetObject-Funktion ein Excel.Application- Objekt zurückzugeben. Falls das misslingt, erzeugen Sie es mit CreateObject (Listing 1).

Dim boolBeenden As Boolean
Function ExcelStarten() As Object
Dim objApp As Excel.Application
On Error Resume Next
Set objApp = GetObject(, "Excel.Application")
boolBeenden = False
If objApp Is Nothing Then
Set objApp = CreateObject("Excel.Application")
boolBeenden = True
End If
Set ExcelStarten = objApp
End Function

Abhängig davon, ob Sie Excel nur zurückgeben oder starten, setzen Sie noch eine entsprechende Variable, an der Sie später erkennen können, ob Sie Excel auch wieder schließen müssen.

War Excel schon gestartet, weil der Benutzer damit gerade etwas anderes bearbeitet, würde er sich natürlich ärgern, wenn Sie Excel einfach schließen. Sie müssen in dem Fall auch selbst im Hintergrund eine Instanz von Excel erzeugt haben.

Excel beenden

Excel beenden Sie, indem Sie die Quit-Methode des an die Prozedur übergebenen Application- Objekts aufrufen und dann die Variable auf Nothing setzen. Allerdings sollten Sie das nur dann tun, wenn die Variable boolBeenden den Wert True hat.

Sub ExcelBeenden(objApp As Object)
If boolBeenden = True Then
objApp.Quit
End If
Set objApp = Nothing
End Sub

Excel-Funktionen aufrufen

Nun können Sie alle Excel-Funktionen aufrufen. Sie werden über die Auflistung WorksheetFunction zur Verfügung gestellt. Mit dem Beispiel aus Listing 3 wird beispielsweise die Average-Funktion aufgerufen, die den Durchschnitt der drei übergebenen Zahlen berechnet und zurückgibt. Anstelle der Average-Funktion könnten Sie auch eine beliebige andere Funktion verwenden.

Sub Funktionaufrufen()
Dim objApp As Excel.Application
Set objApp = ExcelStarten()
Debug.Print objApp.WorksheetFunction.Average(65, 7, 9)
ExcelBeenden objApp
End Sub

Funktioniert Ihr Code wie gewünscht, sollten Sie zum Schluss noch den Verweis entfernen und alle Variablendeklarationen mit As Excel.Application zu As Object machen.

Function ExcelStarten() As Object
Dim objApp As Object
On Error Resume Next
Set objApp = GetObject(, "Excel.Application")
boolBeenden = False
If objApp Is Nothing Then
Set objApp = CreateObject("Excel.Application")
boolBeenden = True
End If
Set ExcelStarten = objApp
End Function
Sub Funktionaufrufen()
Dim objApp As Object
Set objApp = ExcelStarten()
Debug.Print objApp.WorksheetFunction.Average(65, 7, 9)
ExcelBeenden objApp
End Sub