cubic83
Goto Top

Excel - Zellen aus anderen Exceldateien auslesen

Hallo,

ich stecke mal wieder bei einem Excel Problem fest und hoffe ihr könnt mir helfen.

Ich habe in einem Ordner C:\Test einen Haufen Excel Dateien:
C:\Test\file1.xlsx
C:\Test\file2.xlsx

In jeder dieser Dateien steht in der Zeile A1 ein Zahlenwert.

Nun habe ich eine weitere Excel-Datei wo ich diese Zellen gerne auslesen möchte. Diese Datei hat in etwa die Struktur:

	A	B	C	D

1	file1	100

2	file2   200

3	file3	300

4	file4	400

In Spalte A steht der Dateiname und in Spalte B soll der Wert aus Zelle A der jeweiligen Datei kommen. Mit dem Befehl

='C:\Test\[file1.xlsx]Sheet1'!A1  

klappt das genauso wie ich das Möchte. Ändere ich aber die Formel um in etwa:

='C:\Test\[$A1.xlsx]Sheet1'!A1  

ist das nicht mehr möglich. Ich habe inzwischen alle Version von Gänsefüschen etc durch, aber ich bekomme das einfach nicht hin.

Gibts da eine Möglichkeit?

Vielen Dank und mit freundlichen Grüssen,
Cubic83

Content-ID: 258961

Url: https://administrator.de/contentid/258961

Ausgedruckt am: 03.12.2024 um 17:12 Uhr

119478
119478 05.01.2015 aktualisiert um 19:42:05 Uhr
Goto Top
Wenn ich mich richtig erinnere kann man solche Sachen mit der INDIRECT()-Funktion loesen. Schau mal obe es ueberhaupt notwendig ist.

Welche Form des Dateinamens waehlst Du denn in A! ? Ist das ein Datum oder aehnliches ? Darueber hinaus weiss Excel nicht das $A1.xlsx nicht der Dateiname sein soll.
Du musst also vorher mit TEXT(.......) eine Konvertierung des "Zellenwertes" aus $A1 vornehmen. Sowas wie :

='C:\Test\['TEXT(...................)'.xlsx] oder so aehnlich. Kann es momentan nicht ueberpruefen.

Hoffe es ist wenigstens ein Ansatz.

VG
Cubic83
Cubic83 05.01.2015 aktualisiert um 19:46:37 Uhr
Goto Top
Hallo und danke für dein Feedback.

Also INDIRECT funktionniert nur wenn die Datei geöffnet ist. Das ist bei mehreren hundert Dateien nicht wirklich eine Lösung.

Der Dateiname ist aufgebaut nach dem Prinzip:

benutzername.xlsx - Also den Benutzernamen bei uns im Netzwerk.

Mit freundlichen Grüßen


PS: Du hast dein Post noch verändert, ich war zu schnell ;)

Ich habe tatsächlich schon mit Text probiert. Er ersetzt die Variablen auch richtig (zeigt mir also an, wie die Zeile aussieht), führt den Befehl dann aber nicht mehr aus sprich: Er schreibt nur in die Zeile hinein =C:\Test\file1.xlsx, etc...
114757
Lösung 114757 05.01.2015, aktualisiert am 06.01.2015 um 11:27:39 Uhr
Goto Top
Moin,
"indirekt" kann wie gesagt nur mit geöffneten Arbeitsmappen umgehen, am besten man macht das über eine Makrofunktion
Function getValue(rngName as Range) 
    strParam = "'C:\Test\[" & rngName.Value & "]Sheet1'!R1C1"  
    getValue = ExecuteExcel4Macro(strParam)
End Function  
Dann schreibt man in die Zelle B1 folgendes
=getValue(A1)
und kopiert die Formel nach unten, feddich.

Gruß jodel32

p.s. siehe auch folgenden Thread in dem das schon diskutiert wurde
VBA: mehrere Zellen aus anderer Datei auslesen (ohne diese zu öffnen)
MarxMoritz
MarxMoritz 05.01.2015 um 22:08:14 Uhr
Goto Top
Hallo,
probier das einmal! Das funktioniert!

Sub zellen_auslesen()
Dim strDatei As String, strPfad As String, strTyp As String
Dim wbX As Workbook, wksX As Worksheet, wksN As Worksheet
Dim lngCount As Long

Application.ScreenUpdating = False
strPfad = "C:\test" 'Pfad anpassen
strTyp = "xls" 'Dateityp anpassen
Set wksN = ThisWorkbook.Sheets(1) 'Zieltabelle
lngCount = 3 'Startzeile in der Zieltabelle
wksN.Range(wksN.Rows(lngCount), wksN.Rows(wksN.UsedRange.Rows.Count + lngCount)).Delete

strDatei = Dir(strPfad & "\*." & strTyp)
Do Until strDatei = ""
Set wbX = Workbooks.Open(strPfad & "\" & strDatei)
Set wksX = wbX.Sheets(1)
strDatei = Left(strDatei, Len(strDatei) - 4)
wksN.Cells(lngCount, 1) = strDatei
wksN.Cells(lngCount, 2) = wksX.Cells(1, 1)
lngCount = lngCount + 1
wbX.Close False
strDatei = Dir
Loop
Application.ScreenUpdating = True

End Sub


Grüße
Cubic83
Cubic83 06.01.2015 um 09:38:39 Uhr
Goto Top
Hallo,

funktionniert leider nicht. Bekomme nur den Fehler #VALUE.

Mit MsgBox strParam bekomme ich den korrekten String ('C:\Test\[file1.xlsx]Sheet1'!A1) angezeigt. Das Zusammenbauen klappt also.

Den Link aus dem Forum hier kannte ich nicht. Reduziert läuft es ja auch auf ein ExecuteExcel4Macro('C:\Test\[file1.xlsx]Sheet1'!A1) hinaus.

Komisch.
114757
114757 06.01.2015 aktualisiert um 10:30:08 Uhr
Goto Top
funktionniert leider nicht. Bekomme nur den Fehler #VALUE.
Du musst die Zelle A1 in R1C1 Schreibweise schreiben, siehe korrigierten Code oben(hatte ich noch editiert), der läuft hier problemlos.

Gruß jodel32
Cubic83
Cubic83 06.01.2015 um 10:36:49 Uhr
Goto Top
Hatte ich schon gemacht.

Hier nochmal meine ganze Funktion in der aktuellen Version

Function GetValue(rngName As Range) As Variant
    strParam = "'C:\test\[" & rngName.Value & "]Sheet1'!R1C1"  
    'MsgBox strParam  
    GetValue = ExecuteExcel4Macro(strParam)
End Function

Aufgerufen wird die Funktion mit =GetValue(A4). In A4 steht file1.xlsx.

Ich habe es inzwischen auf einem Office 2010 und 2013 probiert. Nicht dass es damit zu tun hat. Ist aber überall das gleiche.


"du musst die Zelle A1 in R1C1 Schreibweise schreiben, siehe korrigierten Code oben, der läuft hier einwandfrei."

Hast du das denn mit einer Funktion probiert oder nur in die Zelle eingetragen?
Cubic83
Cubic83 06.01.2015 um 10:45:14 Uhr
Goto Top
Hallo,

das ist nicht ganz was is suche. Du geht das ganze Verzeichniss durch. Ich habe aber vordefinierte Dateien.

Ausserdem geht bei dieser Variante (wenn ich richtig verstehe) Excel immer auf.

Danke,
mfG
colinardo
Lösung colinardo 06.01.2015 aktualisiert um 11:27:44 Uhr
Goto Top
Hallo zusammen,
die Funktion ExecuteExcel4Macro funktioniert nur innerhalb von Makros, nicht innerhalb einer Funktion die einen Wert an das Sheet zurückgegeben soll!! Du musst also den Wert aus dem Makro in die Zellen schreiben, so wie es in dem obigen Link von mir gemacht wird.

Also Beispielsweise so:
Function getValue(rngName As Range) As Variant
    strParam = "'C:\Test\[" & rngName.Value & "]Sheet1'!R1C1"  
    getValue = ExecuteExcel4Macro(strParam)
End Function

Sub WriteValuesToCells()
    For Each cell In ActiveSheet.Range("B1:B10")  
        cell.Value = getValue(cell.Offset(0, -1))
    Next
End Sub
Die Prozedur WriteValuesToCells() lässt sich ja dann z.B. nach belieben aus einem Event von Excel aufrufen (Workbook_Open / Worksheet_Change), je nachdem wie oft es aktualisiert werden soll.

Grüße Uwe
Cubic83
Cubic83 06.01.2015 um 11:27:25 Uhr
Goto Top
Das wars! Funktionniert jetzt.

Vielen lieben Dank!