Zugriffsstatus für Exceldateien Anzeigen

Simone_1

Grünschnabel
Hallo an alle!
Bin total neu hier und möchte Euch (nach bestimmt insgesamt 10 Std. vergeblicher Suche) um die Beantwortung einer Frage bitten!

Mir wurde beruflich das Erstellen von Makros in Excel "übergeholfen" obwohl überhaupt keine Ahnung davon. Nun habe ich schon einige kleinere Probleme gelöst und scheitere aber an folgender Aufgabe:
Mein Makro soll diverse Excel-Dateien in einem Ordner mit mehreren Unterordnern dahin gehend prüfen, ob die Dateien (oder auch nur eine davon) bereits von einem anderen Benutzer geöffnet wurde(n). Wenn ja möchte ich ein PopUp, dass mir mitteilt welche Datei geöffnet ist und das Makro beendet mit dem Hinweis "Aktualisierung wird abgebrogen".
Wenn alle Dateien geschlossen sind, soll das restliche Makro ausgeführt werden. (Die Dateien sind alle mit einander verknüpft. Werden geöffnet, aktualisiert, gespeichert und wieder geschlossen).

Wäre lieb, wenn mir jemand helfen könnte.

L.G. Simone
 
Bin selbst auch nicht so gut in VBA. Aber gibt er eine solche Meldung nicht generell, wenn versucht wird eine geöffnete Datei zu öffnen?
Das ist doch sicherlich einen Versuch wert.

ulki
 
Hallo Ulki,
na ja, die Datei würde schreibgeschützt geöffnet und beim abspeichern käme die Abfrage: "speichern unter". Genau das darf aber erst gar nicht geschehen. Sobald festgestellt wird, dass eine der Dateien bereits von jemanden anderen geöffnet wurde muss das Makro beendet werden. Die Daten sind hochsensibel und tief mit weiteren Dateien verknüpft. Ein fehlerhaftes Abspeichern könnte zu ziemlichen Ärger führen.
Lieben Gruß
Simone
 
war ja auch nur eine Idee. Ziemlich ungünstig das. Sensible Daten auf die mehr als ein Mensch zugreifen muss und das ganze in Excel. Wäre vieleicht angebracht darüber nachzudenken es anders zu organisieren. Aber das hat ja mit deinem Problem nur am Rande zu tun.
Sorry
ulki
 
Hatte gerade noch einen Geistesblitz:

Sinnvoll wäre doch nacheinander jede Datei einzeln zu öffnen.

So öffnen wir die erste. Dann müsste doch festzustellen sein, ob sie schreibgeschützt ist, was dann ja bedeuten würde jemand hatte sie zuvor schon geöffnet. Ist dies der Fall werden alle Dateien wieder geschlossen, ohne das Änderungen gespeichert werden. Das Makro wird abgebrochen. Ist die Datei nicht schreibgeschützt wird die nächste geöffnet und überprüft und so weiter, bis alle Dateien geöffnet sind.

Hierbei ist es einfach wenn die Anzahl der Dateien fest ist. Aber es ist bestimmt auch möglich die Anzahl an Dateien in einem Verzeichnis festzustellen, wenn das MAkro startet.

Das ist jetzt natürlich kein fertiger Code, aber es ist möglicherweise an gangbarer Ansatz.

ulki
 
Hi,hi. Ja! Das ist genau dass, was mein Makro im Moment macht. Es öffnet 60 oder 70 (hab sie noch nie so genau gezählt) Dateien nacheinander und bei der Meldung "Datei bereits von ... geöffnet" sind meine Kolleginnen angewiesen, auf abbrechen zu klicken.
Das ist aber ein irre langes Makro und dauert doch teilweise ziemlich lange. Insbesondere weil einige Dateien viele Formeln und Verknüpfungen enthalten.
Ist auch schon vorgekommen, dass zwischenzeitlich dann jemand doch eine Datei geöffnet hat und die wurde dann ganz woanders abgespeichert und ich habe eine halbe Stunde gesucht und mich gewundert.... Daher meine Suche nach einem schnelleren Weg.

Es gibt ja diese ReadOnly-Funktion. Aber das steht nur wie man sie auf die aktive Arbeitsmappe anwendet und nicht auf einen Ordner und mehrere Dateien.... :-(
Es gibt auch diese iOpen Sache. Aber irgendwie funktioniert das bei mir nicht! :(
L.G.
Simone
 
Hallo "Ein Freund"!
Erst einmal vielen Dank für die schnelle Hilfe. Habe mir den Link angesehen und denke, dass ist genau das, was ich suche. Jetzt bin ich aber zu blöd die Sache in mein bereits vorhandenes Makro einzustricken.
Könntest Du mir da vielleicht noch einmal helfen (oder bitte irgendjemand anderer)? Mein Makro sieht so aus:
Sub V5_DATEIEN_ÖFFNEN()
'Variablendeklaration
Dim L1 As Integer
Dim i As Integer
'Abfrage Verknüpfungen aktualisieren unterdrücken und automatisch aktualisieren
Application.AskToUpdateLinks = False
'ÖFFNEN ALLER DATEIEN IM VERZEICHNIS X:\Test, DIE MIT V5 BEGINNEN
With Application.FileSearch
.NewSearch
.LookIn = "X:\Test"
.SearchSubFolders = True
.FileType = msoFileTypeExcelWorkbooks
.Filename = "V5*.xls"
If .Execute() > 0 Then
L1 = .FoundFiles.Count
For i = 1 To L1
Workbooks.Open (.FoundFiles(i)), notify:=False
Next i
End If
End With
'Abfrage Verknüpfungen aktualisieren wieder aktivieren
Application.AskToUpdateLinks = True
'Wechsel zum Fenster, dass als einziges offen bleiben soll
Windows("V5_start.xls").Activate
'alle Fenster (außer dem aktiven) speichern und schließen
Dim wkb As Workbook
For Each wkb In Workbooks
If wkb.Name <> ThisWorkbook.Name Then
wkb.Close savechanges:=True
End If
Next wkb
End Sub

Und das muss jetzt da noch vorher rein:

' Prüfen, ob Datei in Benutzung
Private Function FileInUse(ByVal sFile As String) As Boolean
Dim F As Integer

On Error Resume Next
' Versuch, Datei EXKLUSIV zu öffnen
F = FreeFile
Open sFile For Binary Lock Read Write As #F

' Bei Fehler 70 ist die Datei in Benutzung
FileInUse = (Err.Number = 70)

Close #F
On Error Goto 0
End Function

Wenn ich das versuche, will er immer noch ein Makro öffnen!

Lieben Gruß

Simone
 
Du kannst doch die Funktion 1:1 übernehmen:

Code:
Sub V5_DATEIEN_ÖFFNEN()
    Dim fileStr$
    fileStr = "c:\test.xls" 'Beispiel-Datei
    If (FileInUse(fileStr)) Then
        MsgBox "Datei in Benutzung"
    Else
        'Rest des Makros ausführen
    End If
End Sub


Private Function FileInUse(ByVal sFile As String) As Boolean
  Dim F As Integer

  On Error Resume Next
  ' Versuch, Datei EXKLUSIV zu öffnen
  F = FreeFile
  Open sFile For Binary Lock Read Write As #F

  ' Bei Fehler 70 ist die Datei in Benutzung
  FileInUse = (Err.Number = 70)

  Close #F
  On Error GoTo 0

End Function

Wenn Du wieder Quellcode postest, dann nutze bitte die Code-Funktion. Dann können wir den Quellcode schneller und leichter lesen ;-]
 
Zurück