Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1340to1344
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

SVERWEIS: Pfad dynamisch

SVERWEIS: Pfad dynamisch
17.12.2013 11:33:39
Marek
Hallo zusammen,
ich möchte in einer Tabelle Werte aus mehreren Dateien einlesen. Via SVERWEIS kein Problem, nur soll der Pfad dynamisch sein.
Mit INDIREKT müssen alle Dateien geöffnet sein, was ich vermeiden will.
Im angehängten Beispiel habe ich es versucht, Fehlermeldung: #WERT.
Weiß jemand Rat?
Gruß
Marek
https://www.herber.de/bbs/user/88547.xlsx

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
17.12.2013 11:53:53
Klaus
Hi Marek,
mit INDIREKT kannst du nur auf offene Dateien zugreifen, Punkt.
Alternativen mit VBA gibt's massenhaft im Archiv, zB. hier:
https://www.herber.de/forum/archiv/792to796/794808_Zugriff_auf_geschlossene_Dateien.html
In deine Musterdatei hab ich kurz reingeschaut. Hier oder da mal eine INDIREKT Formel schadet nicht, aber was du vorhast (die INDIREKT weit nach rechts und unten kopieren) wird im Erfolgsfall in einer schneckenlangsamen Datei enden.
Ich würd mir ein Makro schreiben, dass die grad benötigten Dateien öffnet, den gesuchten Wert als Zahl kopiert und die Datei dann wieder schließt. Hätte halt den Nachteil, dass die Datei sich nicht selbstständig aktualisert - aber man kann den Makrostart ja ins Workbook-Open schreiben.
Grüße,
Klaus M.vdT.

Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
17.12.2013 12:01:50
Marek
Hallo Klaus,
besten Dank. Ich hatte schon befürchtet, dass ich um VBA nicht herumkomme. Werde ich wohl oder übel etwas basteln müssen.
Gruß
Marek

geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
17.12.2013 14:49:45
Ralf
Hi Marek,
ich hatte sowas heute morgen schnell zusammengezimmert, evtl. hilfts dir.

Sub alle()
Dim zbk As Workbook
Dim qbk As Workbook
Dim datei As String
Dim zsht As Worksheet
ChDrive "H"
Set zbk = Workbooks(ActiveWorkbook.Name)
ChDir zbk.Path
Set zsht = zbk.Worksheets("Tabelle2")
datei = Dir(zbk.Path & "\*KB*.xls")
With zsht
Do While datei  ""
Workbooks.Open datei, False, True
On Error Resume Next
Worksheets("ATB").Activate
If Err.Number = 0 Then
ActiveSheet.Range(Cells(4, 1), Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet. _
UsedRange.Columns.Count)).Copy .Cells(.UsedRange.Rows.Count + 1, 1)
End If
Err.Clear
ActiveWorkbook.Close False
datei = Dir
Loop
End With
End Sub
Gruß
Ralf

Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
17.12.2013 15:43:09
Marek
Hi Ralf,
danke dir. Ich versuche es dennoch mit INDIREKT; Geschwindigkeit ist zum Glück Nebensache. Nur kämpfe ich gerade mit dem simplen Problem, mehrere Dateien per VBA zu öffnen. Die jeweilige Datei bezieht sich immer auf das entsprechende Tabellenblatt, demnach muss der Pfad variabel sein.
Gruß
Marek

geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
17.12.2013 16:20:14
Marek
Es wird nur die erste Datei geöffnet. Kann mir jemand helfen?
Sub Aktualisieren()
Dim j%, i%, m%, k%, strDateiname$
j = Year(CDate(Range("A1")))
i = i + 1
m = i
k = Range("Y1")
'Dateien öffnen
For i = 1 To 12
strDateiname = "C:\Pfad1\Pfad2\Pfad3 " & j & "\" & m & "\Details\" & k & "_Detail_" & m & ". _
xls"
Workbooks.Open Filename:=strDateiname
ActiveSheet.Calculate
Next i
End Sub

Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
18.12.2013 08:06:11
Klaus

Sub Aktualisieren()
Dim j%, i%, m%, k%, strDateiname$
j = Year(CDate(Range("A1")))
i = i + 1
m = i
k = Range("Y1")
'Dateien öffnen
For i = 1 To 12
strDateiname = "C:\Pfad1\Pfad2\Pfad3 " & j & "\" & m & "\Details\" & k & "_Detail_" & m & ". _
_
xls"
Workbooks.Open Filename:=strDateiname
ActiveSheet.Calculate
Next i
End Sub
Hi Marek,
du erhöhst erst i um 1, obwohl i noch gar keinen Wert hat. Das wird abgefangen und i gleich 0 gesetzt, nach deiner Erhöhung ist i also 1. Demnach ist m auch 1, da m = i.
Du hättest i hier aber auch auf eine Milliarde setzen können, denn:
For i = 1 To 12
setzt i nacheinander auf 1,2,3,...12 und zwar egal welcher Wert vorher in i stand!
Ich vermute jetzt, dass dadurch weder deine i- noch deine m- Bezüge stimmen.
Tip zum umbauen: arbeite im Einzelschrittmodus und mit ganz viel debug.print!
Sub Aktualisieren()
Dim j%, i%, m%, k%, strDateiname$
j = Year(CDate(Range("A1")))
i = i + 1
m = i
k = Range("Y1")
'Dateien öffnen
For i = 1 To 12
debug.print "i=" & i & " / m=" & m & " / j =" & j & " / k =" & k
strDateiname = "C:\Pfad1\Pfad2\Pfad3 " & j & "\" & m & "\Details\" & k & "_Detail_" & m & ". _
_
xls"
Workbooks.Open Filename:=strDateiname
ActiveSheet.Calculate
Next i
End Sub

Dann und jede Zeile vergleichen, ob die variablen Stimmen. Wenn nicht, umbauen!
Grüße,
Klaus M.vdT.

Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
18.12.2013 11:13:53
Marek
Hallo Klaus,
ich muss mich erst mal wieder in die Programmierlogik reindenken, lang ist´s her. Danke für deinen Hinweis.
Gelöst habe ich es wie im folgenden Code; klappt wunderbar. Ein Problem habe ich noch: Trotz der Resume-Next-Anweisung kommt eine Fehlermeldung; klar, für den Monat 12 existiert noch keine Datei. Leider hört das Programm dann auf. Im nächsten Schritt sollen die geöffneten Dateien wieder geschlossen werden, und zwar mit der gleichen For-Next-Schleife, statt "open" eben "close".
Wenn ich das habe, bin ich glücklich, dann kann ich die Tabellenblätter erstellen und mit Formeln befüllen.
Weißt du oder jemand anders Rat, wie der Code weiterläuft, so dass die Dateien auch wieder geschlossen werden?
Gruß
Marek
Sub Aktualisieren()
Dim j%, i As Byte, m As Byte, k%, strDateiname$
j = Year(CDate(Range("A1")))
k = Range("Y1")
'Dateien öffnen
On Error Resume Next
For i = 1 To 12
m = m + 1
strDateiname = "C:\Pfad1\Pfad2\Pfad3 " & j & "\" & m & "\Details\" & k & "_Detail_" & m & ". _
_
xls"
Workbooks.Open Filename:=strDateiname
Next i

Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
18.12.2013 11:28:14
Klaus
Hi Marek,
dass ich nichts von Vorgang halte, Dateien öffnen / INDIREKT berechnen / Dateien schließen, sagte ich bereits. Aber da du explizit danach fragst, bitte sehr:
Sub vieleOeffnen()
Call VieleDateien(True)
End Sub
Sub vieleSchliessen()
Call VieleDateien(False)
End Sub
Sub VieleDateien(bOpen As Boolean)
Dim j%, i As Byte, k%, strDateiname$
Dim wkbOld As Workbook
j = Year(CDate(Range("A1")))
k = Range("Y1")
Set wkbOld = ActiveWorkbook
For i = 1 To 12
strDateiname = "C:\Pfad1\Pfad2\Pfad3 " & j & "\" & i & "\Details\" & k & "_Detail_" & i & ". _
xls """
If bOpen Then       'Dateien öffnen oder
Call FileCheckOpen(strDateiname)
Else                'Dateien schließen
On Error Resume Next
If WkbExists(strDateiname) Then Workbooks.Close strDateiname
On Error GoTo 0
End If
Next i
'wieder ins alte Workbook wechseln (beim Datei-Öffnen geraten die neuen Workbooks in den Focus)
wkbOld.Activate
activesheet.calculate
End Sub
'*********************************************************************************************** _
'* Module to open needed files. Checks if Files are open or not.
'* If file is already open, do nothing - else open it
'* stolen from: https://www.herber.de/mailing/Pruefen_ob_Arbeitsmappe_geoeffnet_und_wenn_nein_oeffnen.htm
'* modified by Klaus Meyer von der Twer / 16.NOV.2012
'*********************************************************************************************** _
'Example:
'Call FileCheckOpen("C:\TMP", "Filename.xls")
'path and filename can be RANGE from excelsheet
Sub FileCheckOpen(sPath As String)
If WkbExists(sFile) = False Then
If Dir(sPath) = "" Then
MsgBox "File " & sPath & " not found!"
Else
Workbooks.Open sPath, UpdateLinks:=False
End If
Else
End If
End Sub
Function WkbExists(sFile As String) As Boolean
Dim wkb As Object
On Error Resume Next
Set wkb = Workbooks(sFile)
If Not wkb Is Nothing Then
WkbExists = True
End If
On Error GoTo 0
End Function

Das "FileCheckOpen" Makro stammt aus meiner Sammlung und verhindert, dass Fehlermeldungen entstehen wenn ein Workbook (noch) nicht existiert.
Mit dem Makro Sub vieleOeffnen() öffnest du alle Dateien, mit Sub vieleSchliessen() gehen sie wieder zu.
Die Variable m habe ich raus geworfen. Du zählst schon i hoch (for i = 1 to xxx), da musst du nicht separat m hochzählen und verwenden - verwende direkt i.
Grüße,
Klaus M.vdT.

Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
18.12.2013 14:44:25
Marek
Hallo Klaus,
besten Dank.
Einige Codezeilen habe ich eingebaut. Bei der Funktion "wbkExists" kommt in der Zeile "set wbk = ..." der Laufzeitfehler 9, Index außerhalb des gültigen Bereichs. Ich bin jede Zeile mit F8 durchgegangen, die Variablen werden alle richtig befüllt. Warum dieser Fehler?
Gruß
Marek
Option Explicit
Sub Aktualisieren()
Dim j%, i As Byte, k%, strDateiname$
Dim wkbOld As Workbook
j = Year(CDate(Range("A1")))
k = Range("Y1")
Set wkbOld = ActiveWorkbook
'Dateien öffnen
For i = 1 To 12
strDateiname = "C:\Pfad1\Pfad2\Pfad3 " & j & "\" & i & "\Details\" & k & "_Detail_" & i & ". _
xls"
If WkbExists(strDateiname) Then Workbooks.Open Filename:=strDateiname Else
On Error GoTo 0
Next i
wkbOld.Activate
ActiveSheet.Calculate
For i = 1 To 12
If WkbExists(strDateiname) Then Workbooks(strDateiname).Close Else
On Error GoTo 0
Next i
End Sub
Private Function WkbExists(strDateiname As String) As Boolean
Dim wkb As Object
'On Error Resume Next
Set wkb = Workbooks(strDateiname)
If Not wkb Is Nothing Then
WkbExists = True
End If
End Function

Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
18.12.2013 14:57:01
Klaus
Hi Marek,
kommt in der Zeile "set wbk = ..." der Laufzeitfehler 9, Index außerhalb des gültigen Bereichs
das ist, weil du "on error resume next" ausgeklammert hast! Das ist aber ein elementarer Bestandteil dieser Function.
Wenn es ein workbook nicht gibt, wird der Variable "wkb" auch nichts zugewiesen. Durch OnError läuft die Function trotzdem weiter. Direkt danach wird gefragt, ob in der Variable wkb irgendwas steht. Wenn dort nichts steht (da die Set wkb-Zeile durch "OnError" übersprungen wurde) dann meldet die Funktion, dass es eben kein Workbook gibt.
Klammerst du das "on Error" aus, bricht die Function korrekterweise ab - sie versuchte ja, ein Workbook zu öffnen das es nicht gibt.
Dein Code kann und wird trotzdem nicht funktionieren. In der ersten FOR-NEXT schleife weist du i die Werte 1-12 zu und veränderst jedesmal den String "strDateiname".
In der zweiten Schleife fasst du den String nicht mehr an! Das heist, VBA wird 12-mal prüfen ob die letzte Gültige Datei existiert und sie gegebenenfalls schließen.
Zusammenbasteln musst du das jetzt selber, ich habe bereits eine funktionale Version geliefert :-)
Grüße,
Klaus M.vdT.

Anzeige
geht nicht (ohne VBA) AW: SVERWEIS: Pfad dynamisch
18.12.2013 15:13:38
Marek
Hallo Klaus,
die Resume-Next-Anweisung habe ich rausgenommen, da außer Berechnen nichts passiert ist, sprich: Dateien wurden nicht geöffnet.
Deinen Code habe ich probiert; es hing bei "CheckOpenFilename". Deshalb wollte ich´s anders lösen.
Klar, bei der Schließen-Schleife muss ich noch nachbessern.
Ich hoffe, ich habe jetzt genug Input zum Basteln. Danke für deine Mühe, auch den anderen. :-)
Gruß
Marek

Viel Erfolg!
18.12.2013 15:23:01
Klaus
Hi Marek,
kann auch sein dass in meinem Code etwas hängt - ich hab den Blind geschrieben und nicht getestet (und baue zum testen auch nicht deine Ordnerstruktur nach!).
Aber den Rest bekommst du jetzt hin, oder?
(Nochmal nörgeln: Wenn du die Dateien eh öffnest, kannst du die benötigten Werte auch gleich per Copy-Paste oder so holen und auf die INDIREKT-Schnecke verzichten)
Grüße,
Klaus M.vdT.

Anzeige
AW: Viel Erfolg!
18.12.2013 15:48:06
Marek
Hi Klaus,
hm, ich habe jetzt alles so umgebaut, wie es laufen müsste. Ändert nichts: Workbooks(strDateiname)= "Index außerhalb des gültigen Bereichs". Die Variablen werden brav befüllt; wbk bleibt wegen des Fehlers trotzdem auf "Nothing". Auch eine Änderung zu "Dim wkb As Workbooks" hat nichts gebracht.
Hast du noch eine Idee?
Eventuell baue ich noch einen Code zum Auslesen der Daten; Vorteil der INDIREKT-Schnecke: die Formeln sind fertig. :-)
Gruß
Marek

Idee
18.12.2013 16:00:37
Klaus
Hast du noch eine Idee?
Ja: du könntest mal deinen gesamten Code posten. Denn ich hab grad keine Glaskugel zur Hand!
Vorteil der INDIREKT-Schnecke: die Formeln sind fertig.
Das ist allerdings ein valides Argument, dass ich nicht von der Hand weisen kann!
Ich schaue heute nicht mehr ins Forum! Les dich morgen.
Grüße,
Klaus M.vdT.

AW: Idee
18.12.2013 16:45:37
Marek
Hi Klaus,
ich habe das testweise mal so umgebaut, dass auf die Prüfung, ob eine Datei vorhanden ist, verzichtet wird. Die Dateien werden geöffnet, die letzte Fehlermeldung (trotz Resume-Next) erscheint und wird weggeklickt. Das klappt schon mal.
Das Schließen (Code ohne Prüfung, ob Datei vorhanden ist) funktioniert jedoch noch nicht. Das werde ich noch mal ohne Resume-Next testen; mal sehen, wie die Fehlermeldung lautet.
Gruß
Marek
Der gesamte Code:
Option Explicit
Sub Aktualisieren()
Dim j%, i As Byte, k%, strDateiname$
Dim wkbOld As Workbook
j = Year(CDate(Range("A1")))
k = Range("Y1")
Set wkbOld = ActiveWorkbook
'Dateien öffnen
For i = 1 To 12
strDateiname = "C:\Pfad1\Pfad2\Pfad3 " & j & "\" & i & "\Details\" & k & "_Detail_" & i & ". _
xls"
If WkbExists(strDateiname) Then Workbooks.Open Filename:=strDateiname Else
On Error GoTo 0
Next i
wkbOld.Activate
ActiveSheet.Calculate
'Dateien schließen
For i = 1 To 12
strDateiname = "C:\Pfad1\Pfad2\Pfad3 " & j & "\" & i & "\Details\" & k & "_Detail_" & i & ". _
xls"
If WkbExists(strDateiname) Then Workbooks(strDateiname).Close Else
On Error GoTo 0
Next i
End Sub
Private Function WkbExists(strDateiname As String) As Boolean
Dim wkb As Workbooks
On Error Resume Next
Set wkb = Workbooks(strDateiname)
If Not wkb Is Nothing Then
WkbExists = True
End If
End Function

wer anders bitte!
19.12.2013 13:41:02
Klaus
Hallo Marek,
ich sehe keinen Fehler in deinem Code, habe aber heute (und dieses Jahr) leider keine Zeit mehr mich damit zu beschäftigen. Daher lasse ich den Beitrag offen und hoffe, ein anderer kann nochmal drüber schauen.
Grüße und Viel Erfolg,
Klaus

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige