3.5k Aufrufe
Gefragt in Tabellenkalkulation von peko Mitglied (235 Punkte)
Hallo und guten Tag zusammen,

ich möchte aus einer geöffneten EXCEL-Datei heraus per Makro überprüfen lassen, ob in dem direkt übergeordneten Verzeichnis eine bestimmte Datei - z.B. "Vorgabe.xls" existiert.

Außerdem wäre es wichtig, falls sie existiert, im Makro feststellen zu lassen, ob die Datei gerade geöffnet ist.

Liebe Grüße
Peter

13 Antworten

0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

datei vorhanden im uebergeordneten verzeichnis,ausgabe true/false

gruss nighty

Function DateiJaNein(zelle As Variant) As Variant
Application.Volatile
On Error GoTo ErrorHandler
ChDir ".."
If Not Format(FileDateTime(zelle), "ddmmyy") Then
DateiJaNein = "ja"
End If
ErrorHandler:
If Err <> 0 Then DateiJaNein = "nein"
End Function
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all

ups das war das falsche :-))

gruss nighty

Function DateiJaNein(zelle As String) As Boolean
Application.Volatile
On Error GoTo ErrorHandler
ChDir ".."
If Not Format(FileDateTime(zelle), "ddmmyy") Then
DateiJaNein = True
End If
ErrorHandler:
If Err <> 0 Then DateiJaNein = False
End Function
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

datei offen true oder false

gruss nighty

Function DateiOffenJaNein(zelle As String) As Boolean
Application.Volatile
For indexWorkbook = 1 To Application.Workbooks.Count
If Application.Workbooks(indexWorkbook).Name = zelle Then
DateiOffenJaNein = True
Exit For
Else
DateiOffenJaNein = False
End If
Next indexWorkbook
End Function
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

beide functionen gehen bestimmt noch ein wenig zu verkuerzen,da muesste man sich mal gedanken darueber machen,es sind nur spontane ideen :-))

gruss nighty
0 Punkte
Beantwortet von joshuan Mitglied (545 Punkte)
Also ich glaub das erste kamma kürzer machn

Function FileExists(Dateiname As String) As Boolean
FileExists = CreateObject("Scripting.FileSystemObject").FileExists("..\" & Dateiname)
End Function
0 Punkte
Beantwortet von joshuan Mitglied (545 Punkte)
Hi nighty!

ICh hab probiert die zweite auch noch kürzer zum machen

Function IsOpen(Name As String) As Boolean
IsOpen = True
On Error Resume Next
Set Test = Workbooks(Name)
If Err Then IsOpen = False
On Error GoTo 0
End Function

Aber ich find deine is trotzdem besser weil saubrer programmiert. :-)
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi josh ^^

endlich mal wieder ein mitstreiter :-))

gruss nighty
0 Punkte
Beantwortet von peko Mitglied (235 Punkte)
Hi nighty und joshua,

danke erst mal für eure Mühe.

Ich habe selbst eine Funktion verwendet, die auch weitgehend funktioniert:

Function dv(dn As String) As Boolean
dv = False
If Len(dn) > 0 Then
dv = (Dir(dn) <> "")
End If
End Function

Arbeitet wohl so ähnlich wie die in Antwort 2 von dir, nighty. Die Funktion wird von mir aufgerufen über b=dv(ziel.xls), wobei b den Wert True oder False liefert und entsprechend ausgewertet werden kann.

Mein Problem liegt offensichtlich ganz anders, ich habe es wohl nicht klar ausgedrückt:

Die Verzeichnisstruktur ist
C:\ebene1\ebene2\ebene3\test

Statt c:\ebene1\ebene2\ebene3\... könnte aber auch (auf einem anderen Rechner) eine andere Struktur stehen. Am Ende der Kette steht aber auf jeden Fall das Verzeichnis test.

Im Verzeichnis test befindet sich die Datei "kopieren.xls", in der ich arbeite, sowie eine Datei "vorlage.xls".

Im Verzeichnis ebene3 befindet sich (oder auch nicht!) die Datei "ziel.xls".

Diese Struktur muss erhalten bleiben!

Aus "kopieren" (in test) soll überprüft werden, ob "ziel" (in ebene3) existiert (ohne über cd das Arbeitsverzeichnis zu wechseln). Dazu lasse ich folgenden Suchstring bilden:

dp = ActiveWorkbook.Path
dp = Left(dp, Len(dp) - 4)
suchen = dp & "ziel.xls"

und rufe die Funktion dv auf:

b = dv(suchen)

Liefert b den Wert False, wird "vorlage" (test) als "ziel" (ebene3) kopiert. Liefert b den Wert True, geschieht an dieser Stelle nichts.

In beiden Fällen aber werden danach Teil-Informationen aus "vorlage" nach "ziel" übertragen.

Nun das eigentliche Problem:

Öffne ich erst EXCEL und dann die Datei "kopieren", funktioniert alles wunderbar.

Rufe ich aber die Datei "kopieren" z.B. aus dem Explorer auf, steigt EXCEL nach Aufruf der Funktion dv aus, wenn "ziel" nicht vorhanden ist! Das aber muss vermieden werden, da andere Benutzer durchaus die Datei aus dem Explorer aufrufen könnten!

Hallo nighty, ich weiß nicht weiter. Für dich vielleicht auch eine echte Herausforderung. Auf jeden Fall wende ich mich nochmal vertrauensvoll vor allem an dich.

Liebe Grüße
Peter

Noch eine Frage: Wozu dient "Application.Volatile"?
0 Punkte
Beantwortet von peko Mitglied (235 Punkte)
Hi nighty und joshua,

inzwischen habe ich den Fehler selbst herausgefunden. Er liegt gar nicht in der Such-Funktion begründet.

Ich hatte angenommen, da ich mich im Verzeichnis test befinde, könnte ich "vorlage" ohne Angabe des Quellpfades kopieren:

filecopy "vorlage.xls", suchen

Hier enthält "suchen" den Zielpfad und den Dateinamen (siehe Antwort 8), "vorlage.xls" aber nur den Dateinamen. Hat aucvh funktioniert, solange ich die Datei "kopieren" aus EXCEL heraus aufgerufen habe, leider aber nicht nach deren Aufruf vom Explorer aus.

Irgendwann kam mir die Idee, vor der Datei "vorlage.xls" auch den Quellpfad anzugeben. Und siehe da: es klappt in beiden Fällen wie gewünscht.

Mit viel Zeitaufwand wieder etwas gelernt!

Danke euch ganz herzlich für eure Mühe!

Trotzdem: Was bewirkt "Application.Volatile"?

Liebe Grüße
Peter
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi peter ^^

Application.Volatile=dynamisch aktualisiert

gruss nighty
...