Um Daten per VBA aus einer anderen Arbeitsmappe auszulesen, muss diese im Normalfall zunächst geöffnet werden um anschließend auf die einzelnen Zellinhalte zugreifen zu können.
Es geht aber auch anders. Die folgenden VBA-Beispiele zeigen, wie über einen Trick diese Beschränkung umgangen werden kann. Verwendet wird dazu eine Excel4Macro-Funktion, die nach wie vor in allen Excel-Versionen zur Verfügung steht.
Zentraler Bestandteil ist eine Function, welche die Daten aus der geschlossenen Arbeitsmappe ausliest. Dieser Funktion werden dazu einfach der Pfad, der Dateiname, das Tabellenblatt und die Zelle übergeben, die aus der geschlossenen Tabelle ausgelesen werden soll.
Listing 1 zeigt die Auslese-Function.
Private Function GetValue(pfad, datei, blatt, zelle) '** Daten aus geschlossener Arbeitsmappe auslesen '*** Dimensionierung der Variablen Dim arg As String 'Sicherstellen, dass das datei vorhanden ist If Right(pfad, 1) <> "\" Then pfad = pfad & "\" If Dir(pfad & datei) = "" Then GetValue = "datei Not Found" Exit Function End If '** Das Argument erstellen arg = "'" & pfad & "[" & datei & "]" & blatt & "'!" & Range(zelle).Range("A1").Address(, , xlR1C1) '** Auslesen über Excel4Macro GetValue = ExecuteExcel4Macro(arg) End Function
Um einen einzelnen Wert aus einer angegebenen Zelle auszulesen, verwenden Sie folgendes Makro.
Sub Zelle_auslesen() '** Dimensionierung der Variablen Dim pfad As String, datei As String, blatt As String, zelle As String '** Angaben zur auszulesenden Zelle pfad = "F:\Excel\Beispiele" datei = "geschlossene Mappe2.xls" blatt = "Tabelle1" bezug = "A2" '** Eintragen in Zelle ActiveCell.Value = GetValue(pfad, datei, blatt, bezug) End Sub
Im Beispiel wird aus der Datei "geschlossene Mappe2.xls" die Zelle A2 aus dem Tabellenblatt "Tabelle1" ausgelesen und in die aktuell selektierte Zelle eingetragen. Wenn ganze Bereiche aus der geschlossenen Arbeitsmappe ausgelesen werden sollen, dann verwenden Sie einfach folgenden VBA-Code.
Sub Bereich_auslesen() '** Dimensionierung der Variablen Dim pfad As String, datei As String, blatt As String, bereich As Range, zelle As Object '** Angaben zur auszulesenden Zelle pfad = "F:\Excel\Beispiele" datei = "geschlossene Mappe2.xls" blatt = "Tabelle1" Set bereich = Range("A1:B10") '** Bereich auslesen For Each zelle In bereich '** Zellen umwandeln zelle = zelle.Address(False, False) '** Eintragen in Bereich ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle) Next zelle End Sub
In diesem Beispiel wird der Zellbereich A1 bis B10 der geschlossenen Tabelle ausgelesen und in das aktuelle Tabellenblatt im gleichen Zellbereich eingetragen.
Die Beispieldatei mit dem VBA-Code können Sie über den folgenden Link herunterladen.