Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Prüfen, ob Datei von einem anderen User geöffnet ist

Forumthread: Prüfen, ob Datei von einem anderen User geöffnet ist

Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 08:47:24
Willi
Hallo liebe Excel-Profis,

ich habe eine Frage, wo ich nicht weiter komme.
Wir haben auf einem Netzlaufwerk eine Datei, die standardmäßig und die meiste Zeit an einem PC/Benutzer geöffnet ist. Um die Bearbeitung von einem andern User zu ermöglichen, will ich diese automatisch in den schreibgeschützten Modus wechseln lassen, wenn dieses nötig ist und die Datei grade nicht bearbeitet wird. Das ist soweit alles auch kein Problem.
Nur der wechsel zurück in den "ReadWrite"-Modus bereitet mir etwas Probleme. Wenn ein anderer Benutzer die Datei in ReadWrite geöffnet hat und ich einfach mit dem Befehl ThisWorkbook.ChangeFileAccess (xlReadWrite) versuche wieder die "Bearbeitungsrechte" zu erlangen, bekomme ich die Meldung, dass die Datei durch einen anderen Benutzer gesperrt ist. Diese Meldung muss dann händisch beantwortet werden, das würde ich gerne vermeiden. Application.DisplayAlerts = False funktioniert nicht.

Kann ich bei geöffneter Arbeitsmappe, die sich in ReadOnly befindet, prüfen, ob ein anderer User diese Datei in ReadWrite geöffnet hat? Wie bekommt Excel das denn mit? Ich habe schon versucht die temporäre Datei ab zu fragen, diese erscheint aber nur kurzzeitig, zumindest im gleichen Ordner, wo die Datei liegt. Hat da jemand vielleicht eine Idee?

Gruß,
Willi
Anzeige
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 09:44:47
Onur
Indem du einfach BEVOR du versuchst, " mit dem Befehl ThisWorkbook.ChangeFileAccess (xlReadWrite) versuche wieder die "Bearbeitungsrechte" zu erlangen",
On Error Resume Next

schreibst und die Fehlerbehandlung vorher aktivierst.
Nach deiner Zeile musst du es wieder rückgängig machen mit
On Error Goto 0

Anzeige
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 10:37:09
Oberschlumpf
Moin Willi,

noch verstehe ich deine Logik nicht = was aber auch...an mir..liegen kann ;-)

Wenn Person 1 die Datei, um die es geht, geöffnet hat, egal, ob mit/ohne Schreibschutz...dann...

...kannst du, als Person 2, der die Datei, auch nur Sekunden später als Person 1 öffnet = gar fast nix mehr machen, denn Datei ist ja schon von Person 1 geöffnet!
Das Einzige, was noch möglich ist - und das wird ja auch ausgeführt - Person 1 muss informiert werden, dass er die Datei schließen muss.
Erst, wenn Datei = zu, dann hast auch du wieder vollen Zugriff...außer...jetzt ist Person 3 schneller als du^^

Ciao
Thorsten
Anzeige
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 12:54:00
Ulf
Hi,
braucht Admin-Rechte:
Option Explicit


Private Const MAX_PREFERRED_LENGTH As Long = -1

Private Type FILE_INFO_3
fi3_id As Long
fi3_permissions As Long
fi3_num_locks As Long
fi3_pathname As Long
fi3_username As Long
End Type

Private Const PERM_FILE_READ = &H1 'user has read access
Private Const PERM_FILE_WRITE = &H2 'user has write access
Private Const PERM_FILE_CREATE = &H4 'user has create access

Private Declare Function NetFileEnum Lib "Netapi32" _
(ByVal servername As Long, _
ByVal basepath As Long, _
ByVal username As Long, _
ByVal level As Long, _
bufptr As Long, _
ByVal prefmaxlen As Long, _
entriesread As Long, _
totalentries As Long, _
resume_handle As Long) As Long

Private Declare Function NetApiBufferFree Lib "netapi32.dll" _
(ByVal Buffer As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(pTo As Any, uFrom As Any, _
ByVal lSize As Long)

Private Declare Function lstrlenW Lib "kernel32" _
(ByVal lpString As Long) As Long

Public strDateienOffen() As String

Public Function GetFileConnections(sServer As String) As Long
Dim bufptr As Long
Dim dwServer As Long
Dim dwEntriesread As Long
Dim dwTotalentries As Long
Dim dwResumehandle As Long
Dim dwDomain As Long
Dim fi3 As FILE_INFO_3
Dim success As Long
Dim nStructSize As Long
Dim cnt As Long
Dim strTemp As String
Const NERR_SUCCESS As Long = 0&
Const ERROR_MORE_DATA As Long = 234&
If Len(sServer) = 0 Then
sServer = vbNullString
Else
sServer = "\\" & sServer & vbNullString
End If
dwServer = StrPtr(sServer)
nStructSize = LenB(fi3)
success = NetFileEnum(dwServer, 0&, 0&, 3, bufptr, MAX_PREFERRED_LENGTH, dwEntriesread, dwTotalentries, dwResumehandle)
If success = NERR_SUCCESS And success > ERROR_MORE_DATA Then
For cnt = 0 To dwEntriesread - 1
CopyMemory fi3, ByVal bufptr + (nStructSize * cnt), nStructSize
ReDim Preserve strDateienOffen(cnt)
strDateienOffen(cnt) = GetPointerToByteStringW(fi3.fi3_username) & vbTab & GetPermissionType(fi3.fi3_permissions) & vbTab & GetPointerToByteStringW(fi3.fi3_pathname)
Next
GetFileConnections = dwEntriesread
End If
Call NetApiBufferFree(bufptr)
End Function

Public Function GetPointerToByteStringW(ByVal dwData As Long) As String
Dim strTemp() As Byte
Dim tmplen As Long
If dwData > 0 Then
tmplen = lstrlenW(dwData) * 2
If tmplen > 0 Then
ReDim strTemp(0 To (tmplen - 1)) As Byte
CopyMemory strTemp(0), ByVal dwData, tmplen
GetPointerToByteStringW = strTemp
End If
End If
End Function

Private Function GetPermissionType(ByVal dwPermissions As Long) As String
Dim strTemp As String
If dwPermissions And PERM_FILE_READ Then
strTemp = "read "
End If
If dwPermissions And PERM_FILE_WRITE Then
strTemp = strTemp & "write "
End If
If dwPermissions And PERM_FILE_CREATE Then
strTemp = strTemp & "create "
End If
GetPermissionType = strTemp & "access"
End Function

'Ggf. ANPASSEN
Public Sub untersuchen() 'ByVal strComputer As String, ByVal strFile As String)
Dim strFile As String
Dim strComputer As String
Dim lngAnzahl As Long
Dim lngZähler As Long
'ANPASSEN !!!
strComputer = "B350"
strFile = "mehrbenutzer.xlsx"
lngAnzahl = GetFileConnections(strComputer)
If lngAnzahl Then
For lngZähler = 0 To lngAnzahl - 1
If InStr(1, LCase(strDateienOffen(lngZähler)), strFile, vbTextCompare) Then
MsgBox "Offen:" & vbCrLf & strDateienOffen(lngZähler)
Exit Sub
End If
Next
End If
MsgBox "Nicht offen"
End Sub

hth
Ulf
Anzeige
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
19.02.2025 08:05:07
Willi
Hallo Ulf,

Admin-Rechte hab ich nicht, daher hat sich das wohl erledigt.
Scheinbar gibt es da keine einfache Lösung.
Trotzdem Danke an alle für die bereitwillige Hilfe!

Gruß,
Willi
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 11:55:06
Willi
Moin Thorsten,

doch, wenn Person 1 die Datei offen hat, aber in Schreibschutz ist, kann Person 2 die Datei komplett bearbeiten und auch speichern. Wenn Person 2 die Datei schließt oder in Schreibschutz wechselt, kann Person 1 wieder in den Bearbeitungsmodus wechseln und hat auch die zuletzt gespeicherte Dateiversion.
Dass eine 3. Person sofort in ReadOnly wechselt, will ich über Environ lösen.

Gruß,
Willi
Anzeige
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 09:52:30
Willi
Das hatte ich auch schon ausprobiert. Auch so bekomme ich die Meldung.

Gruß,
Willi
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 09:55:25
Onur
HAST du denn die Fehlerbehandlung zuvor aktiviert und weisst du, wie es geht ?
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 10:08:08
Willi
Die Fehlerbehandlung wird doch grade mit "On Error" aktiviert, oder nicht? Sonst wüsste ich nicht, wie man eine Fehlerbehandlung sonst noch aktiviert.

Ich bekomme auch keinen VBA-Fehler sondern die Meldung, dass die Datei grade von einem anderen Benutzer gesperrt ist. Ähnlich wie wenn ich die Datei öffne während ein anderer Benutzer die Datei schon offen hat. Sorry, dass das nicht ganz deutlich war.

Gruß,
Willi
Anzeige
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 10:12:25
Onur
Für "VBA gut" weisst du aber verdammt wenig....
SO muss es im VBA-Editor unter Optionen aussehen, damit OnError funktioniert:

Userbild
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 10:18:39
Willi
Das ist bei mir genau so eingestellt, funktioniert aber trotzdem nicht.

Gruß,
Willi
Anzeige
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 10:20:16
Onur
Poste bitte mal den Code oder die (Beispiels-) Datei...
AW: Prüfen, ob Datei von einem anderen User geöffnet ist
18.02.2025 12:31:28
Willi
So in etwa könnte der Code aussehen und der Benutzer an PC1 würde nicht unbedingt etwas mit bekommen, dass der Wchsel stattgefunden hat.

Public letzteNutzung As Date 'wird während der Bearbeitung ständig neu zugewiesen

Dim letzteZeitOnTime As Date 'Zeitvariable für OnTime Aufruf

Sub WechslZuReadOnly()

If Environ("Computername") = "PC1" Then
If Now - letzteNutzung >= TimeSerial(0, 15, 0) Then 'Wenn Dati 15 min nicht mehr benutzt wurde
ThisWorkbook.ChangeFileAccess (xlReadOnly)
Else
letzteZeitOnTime = letzteNutzung + TimeSerial(0, 15, 0)
Application.OnTime letzteZeitOnTime, "WechselZuReadOnly"
End If
End If

End Sub

Sub WechselZuReadWrite() 'wird bei Mausbewegung aufgerufen

If Environ("Computername") = "PC1" Then
If ThisWorkbook.ReadOnly = True Then
If ReadWriteMöglich = True Then 'Hier soll geprüft werden, ob ein wechsel in ReadWrite möglich ist (ReadWriteMöglich ist nur ein Platzhalter)
ThisWorkbook.ChangeFileAccess (xlReadWrite)
Else
'Code für Benachrichtigung PC 2, damit da die Datei gesschlossen oder in ReadOnly gewechselt wird
Application.OnTime Now + TimeSerial(0, 0, 3), "WechselZuReadWrite"
End If
End If
End If

End Sub


Bei mir sind noch einige andere Funktionen mit drin, deshalb hab ich nur das Prinzip des Wechsels dargestellt.

Gruß,
Willi
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige