Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Per VBA auf ungeöffnete Excel-Datei zugreifen

1,710 views
Skip to first unread message

Markus Eckel

unread,
Sep 11, 2003, 7:26:40 AM9/11/03
to
Hallo Leute,

ich habe folgendes Problem: Ich möchte in Excel per VBA aus einer nicht
geöffneten Excel-Datei Werte auslesen und in einer anderen (geöffneten
Datei) weiterverarbeiten... Ich hab mir das irgendwie so gedacht:

Open "C:\Temp\Test.xls" For Input As #1
Get #1, Worksheets("Ausw5").Cells(1, 1), Wert
MsgBox Wert
ende:

- aber ich kann natürlich schlecht auf ein Sheet oder Cells zugreifen... Wie
geht das?

Danke für Hilfe

Markus


Thomas Ramel

unread,
Sep 11, 2003, 7:30:19 AM9/11/03
to
Grüpezi Markus

Markus Eckel schrieb:

Mit Hilfe einer 'alten' Excel4Makro-Anweisung klappt das wie folgt:

Public Function GetValue(path$, file$, sheet$, range_ref$)
'Holt einen Wert aus einer _geschlossenen_ Arbeitsmappe
'Nur in VBA zu gebrauchen; nicht aus einer Tabellenzelle heraus
'© John Walkenbach / Übersetzt von Thomas Ramel

'Die GetValue-Funktion, benötigt die vier unten angeführten Arugmente:
'path: Das Laufwerk und den Pfad der geschlossenen Datei (z.B. "C:\Daten")
'file: Der Dateiname der Arbeitsmappe (z.B. "MeineDatei.xls")
'sheet: Der Name des TabellenblattesThe worksheet name (z.B. "Tabelle1")
'ref: Der Zellbezug (z.B. "A1")
Dim arg As String
'Sicherstellen, dass die Datei exisiert
If Right(path, 1) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
GetValue = "Datei nicht gefunden"
Exit Function
End If
'Den Aufruf-String zusammenstellen
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(range_ref).Range("A1").Address(, , xlR1C1)
'Ausführen des XL4-Makros
GetValue = ExecuteExcel4Macro(arg)
End Function


Public Sub HoleWert()
Dim rngZelle As Range
Application.ScreenUpdating = False

For Each rngZelle In ActiveSheet.Range("A1:C10")
rngZelle = GetValue("\\Pfad\", "Datei.xls", "Tabelle1", _
rngZelle.Address)
Next rngZelle
Application.ScreenUpdating = True
End Sub

--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win 2000Pro SP-4 / xl2000 SP-3]

Alexander Wolff

unread,
Sep 11, 2003, 7:36:16 AM9/11/03
to
Deine Befehle sind für Textdateien oder binäre Dateien. Für Excel würdest
Du gewaltige Umwege beschreiten, denn Verknüpfungen sind vorgesehen!
Schmeiß den Makrorekorder an, drücke auf eine gültige Verknüpfung von
einer in eine geschlossene .xls-Datei mit F2, Entere und beende die
Aufzeichnung.
Verallgemeinere sie!
Wenn Du keine gültige Syntax für eine Verknüpfung in eine geschl.
.xls-Datei herstellen kannst, lies den Thread "Klaus-Peter Daub 07:52" von
heute.

--
Gruß Alexander (- Antworten bitte nur in die Newsgroup -)


Markus Eckel <Markus...@Nexgo.de> schrieb in im Newsbeitrag:
ePexgeFe...@TK2MSFTNGP12.phx.gbl...

Markus Eckel

unread,
Sep 11, 2003, 8:21:05 AM9/11/03
to
Super - klappt!

Danke für die schnelle Antwort

Markus

"Thomas Ramel" <t.r...@mvps.org> schrieb im Newsbeitrag
news:3F605CCB...@mvps.org...

Markus Eckel

unread,
Sep 11, 2003, 9:07:26 AM9/11/03
to
Ja, auch gut!

Ich hab es mit

Sub Makro1()


For Each rngZelle In ActiveSheet.Range("A1:C10")

rngZelle.FormulaR1C1 = "='C:\Temp\[Test.xls]Test1'!" & "R" & Column
& "C" & Row
Next rngZelle
End Sub

probiert - funktioniert! Aber ist das nun die besser/inteligentere Variante
als die von Thomas Ramel im Thread? Nun, in dieser Variante bekomme ich
Bezüge in der anderen Variante Werte. Gibt es noch andere Unterschiede???

Gruß

Markus


"Alexander Wolff" <cfa...@gmx.de> schrieb im Newsbeitrag
news:bjpmnm$luqgq$1...@ID-89721.news.uni-berlin.de...

Alexander Wolff

unread,
Sep 11, 2003, 9:33:09 AM9/11/03
to
Evtl sind Bezüge flexibler, da Du sie eine Weile aufrecht erhalten kannst
(bis sich die Quelldaten ändern) oder gleich "plattmachen" (=in Werte
wandeln) kannst. Da Du gerade dran bist, kannst Du uns ja interessehalber
noch was zum Geschwindigkeitsverhalten mitteilen! :) Würde sehr
interessieren! Blähe dafür Deinen Datenumfang ruhig ums 20-100fache auf,
wenn es geht.

> Sub Makro1()
> For Each rngZelle In ActiveSheet.Range("A1:C10")
> rngZelle.FormulaR1C1 = "='C:\Temp\[Test.xls]Test1'!" & "R" &
Column
> & "C" & Row

rngZelle = rngZelle.Value
> Next rngZelle
> End Sub

--
Gruß Alexander (- Antworten bitte nur in die Newsgroup -)


Markus Eckel <Markus...@Nexgo.de> schrieb in im Newsbeitrag:

3f6073a6$0$25837$9b4e...@newsread4.arcor-online.net...

Markus Eckel

unread,
Sep 11, 2003, 10:13:20 AM9/11/03
to
Haai,

also, die Variante mit den Verknüpfungen dauert bei mir bei 4000 Zellen 7,7
Sekunden.
Die Variante mit den Werten dauert 9,7 Sekunden.
Jeweils Application.ScreenUpdating = False gesetzt. Alles klar?

Gruß

Markus

"Alexander Wolff" <cfa...@gmx.de> schrieb im Newsbeitrag

news:bjptir$lh17l$1...@ID-89721.news.uni-berlin.de...

Alexander Wolff

unread,
Sep 11, 2003, 10:39:33 AM9/11/03
to
Fast! :)
Und die Variante, die Verknüpfungen dann sofort zu Werten zu machen? :)
(so wie ich Dein Makro ergänzt hatte: rngZelle = rngZelle.Value)

--
Gruß Alexander (- Antworten bitte nur in die Newsgroup -)


Markus Eckel <Markus...@Nexgo.de> schrieb in im Newsbeitrag:

#kLEm7Ge...@TK2MSFTNGP10.phx.gbl...

Markus Eckel

unread,
Sep 11, 2003, 11:17:14 AM9/11/03
to
Dauert unwesentlich länger - statt 7,7 Sekunden dauert es dann 7,85
Sekunden...

Gruß

Markus


"Alexander Wolff" <cfa...@gmx.de> schrieb im Newsbeitrag

news:bjq1fb$lt93v$1...@ID-89721.news.uni-berlin.de...

Alexander Wolff

unread,
Sep 11, 2003, 11:37:10 AM9/11/03
to
Interessant! Wahrscheinlich liegts an dem sehr ausführlichen und
sorgfältigen Code von Thomas' Quelle ... Du setzt bei Dir z.B. den Pfad
nicht jedesmal neu zusammen ... das spart Zeit!
Also: wahrscheinlich Gleichstand.

--
Gruß Alexander (- Antworten bitte nur in die Newsgroup -)


Markus Eckel <Markus...@Nexgo.de> schrieb in im Newsbeitrag:

3f609212$0$3272$9b4e...@newsread2.arcor-online.net...

Thomas Ramel

unread,
Sep 11, 2003, 11:45:06 AM9/11/03
to
Grüezi alesander und Markus

Alexander Wolff schrieb:


> Interessant! Wahrscheinlich liegts an dem sehr ausführlichen und
> sorgfältigen Code von Thomas' Quelle ... Du setzt bei Dir z.B. den Pfad
> nicht jedesmal neu zusammen ... das spart Zeit!
> Also: wahrscheinlich Gleichstand.

Ich vermute auch; die Funktion hat den 'Vorteil', dass sie individuell
einsetzbar ist.
Aber der eigentliche Aufruf lässt sich auch herausschälen und direkt einbinden.

Aber eine interessante Betrachtung wars allemal.

0 new messages