Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Benutzernamen von bereits geöffneter Datei auslese


Betrifft: Benutzernamen von bereits geöffneter Datei auslese von: Oisse
Geschrieben am: 20.06.2017 11:48:17

Hallo Zusammen,
mir stellt sich gerade folgendes Problem:
Aus einer freigegebenen Arbeitsmappe heraus werden in eine andere Mappe Daten verschoben. Ist die Mappe, in die verschoben werden soll, jedoch von jemand anderem geöffnet, dann wird sie logischerweise nur im Lesemodus geöffnet und die Daten können nicht eingetragen werden.
Zwar habe ich das mittlerweile hinbekommen, dass eine Fehlermeldung kommt, wenn sich die Mappe im Lesemodus befindet und der Vorgang auch abgebrochen wird, allerdings komme ich einfach nicht an den Namen desjenigen heran, der die Mappe im beschreibbaren Modus geöffnet hat. Wie bitte mache ich das?
Mein Code sieht bisher so aus:

Set wkb = ThisWorkbook              'Workbooks(wkb)
   
   sFile = "Auswertung Artikelliste.xlsm"
   AusW = ThisWorkbook.Path & "\" & sFile
   If WkbExists(sFile) = False Then
      If Dir(AusW) = "" Then
         MsgBox "Datei " & AusW & " wurde nicht gefunden!"
         Exit Sub
      Else
         Workbooks.Open AusW
         Workbooks(sFile).Activate
         user1 = Workbooks(sFile).WriteReservedBy
         If ActiveWorkbook.ReadOnly = True Then
             MsgBox "Die Mappe 'Auswertung Artikelliste' ist von " & user1 & " geöffnet." & Chr( _
10) & _
            "Ein Übertrag ist daher nicht möglich." & Chr(10) & _
            "Der Vorgang wird abgebrochen.", vbOKOnly, "Achtung!"
            Unload UserForm1
            Exit Sub
        End If
      End If
   Else
      Workbooks(sFile).Activate
      user1 = Workbooks(sFile).WriteReservedBy
        If ActiveWorkbook.ReadOnly = True Then
             MsgBox "Die Mappe 'Auswertung Artikelliste' ist von " & user1 & " geöffnet." & Chr( _
10) & _
            "Ein Übertrag ist daher nicht möglich." & Chr(10) & _
            "Der Vorgang wird abgebrochen.", vbOKOnly, "Achtung!"
            Unload UserForm1
            Exit Sub
        End If
   End If

Da die freigegebene Arbeitsmappe natürlich von mehreren Kollegen benutzt wird, wäre es daher mehr als hilfreich zu wissen, wer die andere Mappe ursprünglich geöffnet hat.
Vielen Dank schon mal für eure Hilfe.
Gruß Oisse

  

Betrifft: AW: Benutzernamen von geöffneter Datei auslese von: Rudi Maintaire
Geschrieben am: 20.06.2017 12:32:04

Hallo,
teste mal

Option Explicit

Sub TestMakro()
  Dim strFile As String
  With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .InitialFileName = "*"
    .Title = "Datei prüfen"
    If .Show = -1 Then
      strFile = .SelectedItems(1)
      Pruefen strFile
    End If
  End With
End Sub

Private Sub Pruefen(strFileToOpen As String)
  Do While IsFileOpen(strFileToOpen)
    If MsgBox(strFileToOpen & " ist von " & LastUser(strFileToOpen) & " geöffnet." _
      & vbLf & "Bitte schließen lassen.", _
        vbOKCancel + vbInformation, "Datei geöffnet") = vbCancel Then End
  Loop
End Sub

Function IsFileOpen(strFullPathFileName As String) As Boolean
  '// VBA version to check if File is Open
  '// We can use this for ANY FILE not just Excel!
  '// Ivan F Moala
'// http://www.xcelfiles.com

  
  Dim hdlFile As Long
  '// Error is generated if you try
  '// opening a File for ReadWrite lock >> MUST BE OPEN!
On Error GoTo FileIsOpen:
  hdlFile = FreeFile
  Open strFullPathFileName For Random Access Read Write Lock Read Write As hdlFile
  IsFileOpen = False
  Close hdlFile
  Exit Function
FileIsOpen:
  '// Someone has it open!
  IsFileOpen = True
  Close hdlFile
End Function

Function LastUser(strPath As String) As String
'// Code by Helen from http://www.
 _
    visualbasicforum.com/index.php?s=
  
  '// This routine gets the Username of the File In Use
  '// Credit goes to Helen for code & Mark for the idea
  '// Insomniac for xl97 inStrRev
  '// Amendment 25th June 2004 by IFM
  '// : Name changes will show old setting
  '// : you need to get the Len of the Name stored just before
  '// : the double Padded Nullstrings
  Dim strXl As String
  Dim strFlag1 As String, strflag2 As String
  Dim i As Integer, j As Integer
  Dim hdlFile As Long
  Dim lNameLen As Byte
  
  strFlag1 = Chr(0) & Chr(0)
  strflag2 = Chr(32) & Chr(32)
  hdlFile = FreeFile
  Open strPath For Binary As #hdlFile
  strXl = Space(LOF(hdlFile))
  Get 1, , strXl
  Close #hdlFile
  j = InStr(1, strXl, strflag2)
  #If Not VBA6 Then
    '// Xl97
    For i = j - 1 To 1 Step -1
      If Mid(strXl, i, 1) = Chr(0) Then Exit For
    Next
    i = i + 1
  #Else
    '// Xl2000+
    i = InStrRev(strXl, strFlag1, j) + Len(strFlag1)
    #End If
    
    '// IFM
    lNameLen = Asc(Mid(strXl, i - 3, 1))
    LastUser = Mid(strXl, i, lNameLen)
    
End Function

Gruß
Rudi


  

Betrifft: AW: Benutzernamen von geöffneter Datei auslese von: Oisse
Geschrieben am: 20.06.2017 13:16:16

Hallo Rudi und besten Dank für deinen Code.
Ich habe ihn in ein Modul kopiert und durchlaufen lassen.
Wenn ich dann die entsprechende Mappe auswähle kommt die Meldung:
"Auswertung Artikelliste.xlsm ist von"
und dann kommen lauter unverständliche Zeichen.
Muss ich bei der Funktion LastUser noch was verändern?
Kann so nicht erkennen, was das wäre.
Gruß Oisse


  

Betrifft: AW: Benutzernamen von geöffneter Datei auslese von: mmat
Geschrieben am: 20.06.2017 17:39:33

Hallo,

ich weiss zwar nicht, wie dein Problem zu lösen ist, aber die Funktion LastUser isses wohl nicht. Jedenfalls nicht so.

Das Ding liest die ganze Datei in eine Zeichenfolge und sucht dann nach zwei Blanks, die das Ende eines Namens markieren sollen ?? Und was ist mit den ganzen anderen Blanks die zufälligerweise in dem Ding rumschwirren??

Daneben sind noch ein paar andere ungereimtheiten in dem Code. Vergiß das Ding.

Wenn du wissen willst, wer auf deiner Datei sitzt, dann such nach einer entsprechenden API-Funktion.

vg, MM


  

Betrifft: AW: Benutzernamen von geöffneter Datei auslese von: Oisse
Geschrieben am: 20.06.2017 18:18:20

Danke für die Antwort
Und wenn ich es mit ActiveWorkbook.BuiltinDocumentProperties(7) probiere?
Mit Index 7 wird der letzte Autor angezeigt.
Kann das momentan leider nicht testen, weil ich keine zweite Person vor Ort habe, die die Mappe mal öffnen könnte um zu sehen, ob´s damit funktioniert. (Der Autor wird angezeigt, das bin ich aber momentan eben alleine).
Gruß Oisse


  

Betrifft: AW: Benutzernamen von geöffneter Datei auslese von: mmat
Geschrieben am: 20.06.2017 18:25:04

Also, grundsätzlich kann der sich ja nur verewigen, wenn er mal auf speichern drückt. Ansonsten bleibt die Datei, die er/sie/es gerade sperrt vollkommen unverändert.

Habe zumindest ein Beispiel gefunden und weiter unten drangeklemmt, wie man gucken kann, ob die Datei überhaupt gesperrt ist. Ansonsten verrät Excel ja den Schuldigen, wenn man die Zieldatei manuell öffnet.


  

Betrifft: AW: Benutzernamen von geöffneter Datei auslese von: mmat
Geschrieben am: 20.06.2017 18:20:50

Es geht auch ohne API-Funktion:

Option Explicit

Public Function IsFileLocked(PathName As String) As Boolean
On Error GoTo ErrHandler
  Dim i As Integer
 
  If Dir(PathName, vbNormal) <> "" Then
    i = FreeFile()
    Open PathName For Random Access Read Write Lock Read Write As #i
    Lock i 'Redundant but let's be 100% sure
    Unlock i
    Close i
  Else
    Err.Raise 53
  End If
 
ExitProc:
  On Error GoTo 0
  Exit Function
 
ErrHandler:
  Select Case Err.Number
    Case 70 'Unable to acquire exclusive lock
      IsFileLocked = True
    Case Else
      MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
  End Select
  Resume ExitProc
End Function

Sub guckste()
  MsgBox IsFileLocked("D:\A\tess.zip")
End Sub
Da weiss man zwar immer noch nicht, wer das ist, aber immerhin kann man die Notbremse ziehen.


  

Betrifft: AW: Benutzernamen von geöffneter Datei auslese von: Oisse
Geschrieben am: 20.06.2017 20:26:22

Dankeschön, auch für die Info mit dem Speichern.
Vielleicht liegt da ja schon ein gewisser Schlüssel. Wenn bei demjenigen, nachdem per VBA was in der Auswertung gemacht hat, gleich auch per Makro gespeichert wird, ist der Name ja vorhanden.
Ich werde das mal testen, bin aber jetzt eine Woche weg. Deswegen kann ich dann erst berichten.
Herzliche Grüße
Oisse


  

Betrifft: AW: Benutzernamen von geöffneter Datei auslese von: Hajo_Zi
Geschrieben am: 21.06.2017 07:40:18

Hallo Ossi,

warum Offen? Soll jemand vorbei kommen?
Du willst doch testen. In einer Woche ist der Beitrag raus.
GrußformelHomepage


Beiträge aus den Excel-Beispielen zum Thema "Benutzernamen von bereits geöffneter Datei auslese"