Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Frage(n) zur Function IsFileOpen

Forumthread: Frage(n) zur Function IsFileOpen

Frage(n) zur Function IsFileOpen
29.05.2018 14:31:49
Kai
Hallo zusammen,
für eine Prüfung, ob eine zu öffnende Datei bereits geöffnet ist, habe ich im Netz folgende Funktion gefunden:
Function IsFileOpen(filename As String)
Dim filenum As Integer
Dim errnum As Integer
On Error Resume Next   ' Turn error checking off.
filenum = FreeFile()   ' Get a free file number.
' Attempt to open the file and lock it.
Open filename For Input Lock Read As #filenum
Close filenum          ' Close the file.
errnum = Err           ' Save the error number that occurred.
On Error GoTo 0        ' Turn error checking back on.
' Check to see which error occurred.
Select Case errnum
' No error occurred.
' File is NOT already open by another user.
Case 0
IsFileOpen = False
' Error number for "Permission Denied."
' File is already opened by another user.
Case 70
IsFileOpen = True
' Another error occurred.
Case Else
Error errnum
End Select
End Function

Klappt alles wunderbar, da ich aber gerne wissen möchte was hier genau passiert, habe ich zwei Verständnisfragen:
1.

filenum = FreeFile()   ' Get a free file number.

Was hier geschieht, habe ich inzwischen herausgefunden. Wo der Sinn von "FreeFile" bzw. "free file number" liegt allerdings nicht. Wofür ist das gut?
2.

Open filename For Input Lock Read As #filenum

Hier wird versucht, die Datei (filename) zu öffnen. Soweit klar. Was bedeutet "Lock" und welche Rolle spielt "filenum" (siehe Frage 1)?
Der Rest ist ersichtlich. Ist die Datei bereits geöffnet, tritt ein Fehler (70) auf. Andernfalls nicht, also (0). Der Fehlercode wird in "errnum" gespeichert und über "Select Case" abgefragt. Als Ergebnis erhalte ich "False" (Datei nicht offen) oder "True" (Datei bereits geöffnet).
Ich hoffe auf Erleuchtung.
Gruß
Kai
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Frage(n) zur Function IsFileOpen
29.05.2018 15:05:13
mmat
Hei Kai,
Beim Öffenen wird immer eine Nummer angegeben, über diese Nummer wird bei späteren Befehlen auf die geöffnete Datei Bezug genommen. z.B.:
Open "Datei" for Output as #1
print #1, "xy"
Close #1
"filenum = FreeFile()" macht nix anderes als die nächste Freie Nummer festzustellen und in der Variablen "filenum" zu speichern.
Mit Lock wird eine Datei für die exklusive Benutzung durch einen speziellen Prozess gesperrt. Wenn das schiefgeht, dann ist die Datei bereits durch einen anderen Prozess "in Arbeit".
Anzeige
AW: Frage(n) zur Function IsFileOpen
29.05.2018 15:57:03
Kai
Hallo mmat,
"Beim Öffenen wird immer eine Nummer angegeben"
Also wird Excelintern eine Nummer vergeben? Kann ich zwar nachvollziehen, bringt mich bei der Sinnfrage aber nicht weiter. Das wird in VBA selten verwendet, oder?
"Mit Lock wird eine Datei für die exklusive Benutzung durch einen speziellen Prozess gesperrt. Wenn das schiefgeht, dann ist die Datei bereits durch einen anderen Prozess "in Arbeit"."
OK, hört sich logisch an. Warum ist dafür filenum bzw. free file number nötig? Kommt der Fehler nicht, wenn ich versuche, die Datei nur über den Dateinamen zu öffnen? Oder ist das schlicht und ergreifend die erforderliche Syntax für diese Methode?
Ich lasse den Beitrag mal auf offen stehen...
Übrigens finde ich die Kenntnis-Level etwas grob unterteilt. Ich glaube, bei VBA über bescheiden hinaus zu sein, gut wäre aber übertrieben. Irgendwo dazwischen passt eher.
Gruß
Kai
Anzeige
Gefährliches Halbwissen meinerseits
29.05.2018 16:28:02
Peter(silie)
Hallo,
FreeFile ist mehr oder weniger der Buchtitel für den Computer.
Daran kann er die Datei eben identifizieren.
Wir brauchen Dateinamen auch nur, weil wir nicht in der Lage sind uns zu merken dass in Datei 192 die Inventur aus dem Jahre 2010 zu finden ist.
Du und ich brauchen dann halt die info: Inventur_2010.txt
Wer effektive Lese und Schreibevorgänge tätigen will, benötigt dass häufig.
Ich kann dir leider nicht sagen, was genau durch Open passiert,
aber da wird wohl irgendein objekt geladen werden, welches schritt für schritt mit bestimmter
buffer größe die daten in binär einliest.
Warum einen Dateinamen verwenden bei einem System dass nur 1 und 0 kennt?
Anzeige
FreeFile sollte immer angewendet werden....
30.05.2018 09:42:38
EtoPHG
Hallo Kai,
Zitat: Also wird Excelintern eine Nummer vergeben? Kann ich zwar nachvollziehen, bringt mich bei der Sinnfrage aber nicht weiter. Das wird in VBA selten verwendet, oder?
Die Dateinummer ist der eindeutige Schlüssel für eine zu manipulierende externe Datei.
Die Verwendung ist immer dann angebracht, wenn mit externen Dateien per VBA manipuliert wird.
FreeFile gibt die nächste freie Dateinummer zurück. Wenn mehrere Mappen nebeneinander laufen und/oder du verschiedene Codeteile hast, bei denen mehrere solche externen Dateien ansprechen, dann kannst du nur über die Dateinummer sicher sein, die richtige anzusprechen.
Das alles kannst du auch in Online-Help des MSDN nachlesen.
Gruess Hansueli
Anzeige
AW: FreeFile sollte immer angewendet werden....
30.05.2018 11:00:49
Kai
Hallo Hansueli,
danke für die Erklärung. Die Onlinehilfe habe ich gelesen, das war mir aber nicht ausführlich genug. Ich frage hier nur, wenn mich eine (intensive) Onlinesuche nicht weiterbringt. Oft ist die Excel-/MSDN-Hilfe nicht gut verständlich oder wirft mehr Fragen auf, als sie beantwortet. Jedenfalls für Spät-/Quereinsteiger, die die Programmierung nicht von Grund auf gelernt haben.
Gruß
Kai
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Überprüfung, ob eine Datei in VBA geöffnet ist: Die Funktion IsFileOpen


Schritt-für-Schritt-Anleitung

Um die Funktion IsFileOpen in VBA zu implementieren, folge diesen Schritten:

  1. Öffne den VBA-Editor: In Excel drücke ALT + F11.

  2. Neues Modul erstellen: Klicke im Projekt-Explorer mit der rechten Maustaste auf "VBAProject (deine Arbeitsmappe)" und wähle Einfügen > Modul.

  3. Füge den Code ein: Kopiere den folgenden Code in das Modul:

    Function IsFileOpen(filename As String) As Boolean
        Dim filenum As Integer
        Dim errnum As Integer
        On Error Resume Next   ' Fehlerprüfung deaktivieren.
        filenum = FreeFile()   ' Nächste freie Dateinummer erhalten.
        ' Versuche die Datei zu öffnen und zu sperren.
        Open filename For Input Lock Read As #filenum
        Close filenum          ' Datei schließen.
        errnum = Err           ' Fehlernummer speichern.
        On Error GoTo 0        ' Fehlerprüfung wieder aktivieren.
    
        ' Überprüfen, welcher Fehler aufgetreten ist.
        Select Case errnum
            Case 0
                IsFileOpen = False ' Datei ist nicht offen.
            Case 70
                IsFileOpen = True  ' Datei ist bereits geöffnet.
            Case Else
                Error errnum       ' Anderer Fehler.
        End Select
    End Function
  4. Verwendung der Funktion: Du kannst die Funktion nun in deinem VBA-Projekt verwenden, um zu überprüfen, ob eine bestimmte Datei geöffnet ist:

    If IsFileOpen("Pfad\zur\Datei.txt") Then
        MsgBox "Die Datei ist bereits geöffnet."
    Else
        MsgBox "Die Datei ist nicht geöffnet."
    End If

Häufige Fehler und Lösungen

  • Fehler 70: Permission Denied: Dieser Fehler tritt auf, wenn die Datei bereits von einem anderen Prozess geöffnet ist. Stelle sicher, dass du Zugriff auf die Datei hast und sie nicht in einem anderen Programm geöffnet ist.

  • Falscher Dateipfad: Wenn der angegebene Dateipfad nicht korrekt ist, wird ein Laufzeitfehler ausgegeben. Überprüfe den Pfad und die Dateinamen auf Richtigkeit und Vollständigkeit.


Alternative Methoden

Wenn du die Funktion IsFileOpen nicht verwenden möchtest, gibt es alternative Methoden, um den Status einer Datei zu überprüfen:

  1. Überprüfen der Datei mit Dir: Diese Methode stellt fest, ob die Datei existiert, sagt jedoch nichts über ihren Status aus.

    If Dir("Pfad\zur\Datei.txt") <> "" Then
        MsgBox "Die Datei existiert."
    Else
        MsgBox "Die Datei existiert nicht."
    End If
  2. Dateizugriffssteuerung mit FileSystemObject: Diese Methode ermöglicht eine umfangreiche Verwaltung von Dateien, benötigt jedoch das Microsoft Scripting Runtime-Referenz.


Praktische Beispiele

Hier sind einige praktische Anwendungsbeispiele für die Verwendung der IsFileOpen Funktion in einem VBA-Projekt:

  1. Dateiüberprüfung vor dem Öffnen:

    Sub OpenFileIfNotOpen()
        Dim filename As String
        filename = "Pfad\zur\Datei.txt"
    
        If Not IsFileOpen(filename) Then
            Workbooks.Open filename
            MsgBox "Die Datei wurde geöffnet."
        Else
            MsgBox "Die Datei ist bereits geöffnet."
        End If
    End Sub
  2. Bericht über mehrere Dateien:

    Sub CheckMultipleFiles()
        Dim files As Variant
        Dim file As Variant
        files = Array("Datei1.txt", "Datei2.txt", "Datei3.txt")
    
        For Each file In files
            If IsFileOpen(file) Then
                MsgBox file & " ist geöffnet."
            Else
                MsgBox file & " ist nicht geöffnet."
            End If
        Next file
    End Sub

Tipps für Profis

  • VBA FreeFile(): Verwende immer FreeFile, um eine neue Dateinummer zu erhalten, bevor du eine Datei öffnest. Dies verhindert Konflikte mit bereits geöffneten Dateien.

  • Fehlerbehandlung: Implementiere eine robuste Fehlerbehandlung in deinen VBA-Projekten, um unerwartete Zustände zu managen.


FAQ: Häufige Fragen

1. Warum sollte ich FreeFile verwenden? FreeFile stellt sicher, dass du eine eindeutige Dateinummer erhältst, um Konflikte mit anderen geöffneten Dateien zu vermeiden.

2. Kann ich IsFileOpen mit anderen Dateiformaten verwenden? Ja, die Funktion kann mit verschiedenen Dateiformaten verwendet werden, solange der Pfad korrekt ist und die Datei vom richtigen Programm verarbeitet werden kann.

3. Welche Excel-Version benötige ich für diese Funktion? Die Funktion IsFileOpen ist mit allen Versionen von Excel kompatibel, die VBA unterstützen, einschließlich Excel 2010 und neuer.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige