Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

freigebenen Datei prüfen ob bereits geöffnet
#11
'
(23.06.2017, 08:34)Storax schrieb:
Code:
Option Explicit

Private Declare Function lOpen Lib "kernel32" Alias "_lopen" _
   (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
Private Declare Function lClose Lib "kernel32" _
   Alias "_lclose" (ByVal hFile As Long) As Long
Private Const OF_SHARE_EXCLUSIVE = &H10
Private Function FileIsOpen(strFullPath_FileName As String) As Boolean
   Dim hdlFile As Long
   Dim lastErr As Long
   hdlFile = -1
   hdlFile = lOpen(strFullPath_FileName, OF_SHARE_EXCLUSIVE)
   If hdlFile = -1 Then
       lastErr = Err.LastDllError
   Else
       lClose (hdlFile)
   End If
   FileIsOpen = (hdlFile = -1) And (lastErr = 32)
End Function
Sub CheckFileOpen()
   If FileIsOpen("Full File Name") Then
       MsgBox "File Is open"
   Else
       MsgBox "File Is Not open"
   End If
End Sub

Hallo Storax,

dein Code funktioniert bei mir nur richtig wenn die Datei nicht freigegeben ist. Sobald ich eine "freigegebene" Datei nehme wird diese nicht gefunden und es kommt die Meldung "File Is Not open".

Und ich möchte nur wissen ob die Datei auf meinem Rechner bereits geöffnet ist.

Ich stelle mir das so vor:

1) prüfen ob die Datei "Test1" geöffnet ist.
2) wenn bereits geöffnet dann soll nichts weiter passieren und das "Programm" kann weiter abgearbeitet werden.
3) wenn die Datei noch nicht offen ist soll diese geöffnet werden.

ich habe mir noch einmal den Vorschlag von Fennek vorgenommen, bekomme hier aber einen Fehler "Fehler beim Kompilieren - Next ohne For".

Code:
Sub geoeffnet_neu()
For Each WB In Workbooks
 If WB.Name = "Test.xlsm" Then
  MsgBox "geöffent"
Else
 Workbooks.Open "O:\Test.xlsm"
Next WB
End If
End Sub
 
Kann mir hier jemand weiter helfen?

Danke und Gruß
Antworten Top
#12
Hallo SOS,

da ich durch den Code von Storax etwas dazugelernt habe, wiederhole ich hier den Code aus #6:


Code:
Sub Test()
iPath = "c:\temp\"
iFile = "myN.xlsm"
If Not WB_open(iFile) Then Workbooks.Open (iPath & iFile)
End Sub

Function WB_open(ByVal WB As String) As Boolean
  For Each WBK In Workbooks
      If WBK.Name = WB Then WB_open = True: Exit For
  Next WBK
End Function

Wie beschrieben, war der erste Code aus dem Gedächtnis geschrieben, also ungeprüft. Der Code hier ist getestet.

mfg
Antworten Top
#13
Da hat Fennek ja Recht, man sollte die vorgegebene Situation auch testen.  Mein Code oben kompiliert, erkennt aber nicht, ob eine freigegebene Datei geöffnet ist.
Und man sollte das Ausgangsposting genauer lesen Dodgy

Mit den "üblichen" Tests, ob eine Datei geöffnet ist, kommt man hier anscheinend nicht weiter, jedenfalls habe ich nichts gefunden  bzw. fällt mir ein.

Aber andererseits gibt es die Property UserStatus.
Code:
Sub Tester_SharedFile()

Const SHARED_FILE = "Fulle File Name"
Dim arrUser As Variant
Dim i As Long
Dim wkb As Workbook
   
   Application.ScreenUpdating = False
   Set wkb = Workbooks.Open(SHARED_FILE)
   
   If wkb.MultiUserEditing Then
       arrUser = wkb.UserStatus
       If UBound(arrUser) > 1 Then
           wkb.Close False
           MsgBox "Shared file already open", vbOKOnly, SHARED_FILE
       End If
   End If

End Sub

Mit diesem Code öffne ich die freigegebene Datei und prüfe, ob sie in einer anderen Instanz oder auf einem anderem Rechner (falls die Datei auf einem Netzlaufwerk liegt) schon geöffnet ist. Falls das der Fall ist, schließe ich sie wieder, sonst bleibt sie geöffnet. Das könnte hier schon ausreichend sein.
Antworten Top
#14
Hallo,

vorsichtige Frage:

beim Öffnen einer *.xls? Datei wird im selben Ordner eine Kopie angelegt, mit einem $. Dies könnte man mit einem "dir" doch abfragen.

mfg

(mein PC ist im Moment down, deshalb nur die Umschreibung)
Antworten Top
#15
Das hatte ich auch gedacht, doch die gibt es für freigegebene Dateien wohl nicht, jedenfalls nicht bei meinem Test.
Sobald Du die Freigabe wieder zurücknimmst, wird auch wieder die temporäre Datei mit ~$dateiname angelegt
MS macht also bei Freigaben irgendetwas anderes .. ich weiss nur nicht genau was :s
Antworten Top
#16
Zitat:1) prüfen ob die Datei "Test1" geöffnet ist.
2) wenn bereits geöffnet dann soll nichts weiter passieren und das "Programm" kann weiter abgearbeitet werden.
3) wenn die Datei noch nicht offen ist soll diese geöffnet werden.

Das ist doch exakt was getobject macht:

Code:
Sub M_snb()
   getobject "G:\OF\tetxt1.xlsx"
end sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#17
Hallo snb

ich habe deinen Code mal ausprobiert weil mich interessierte was dabei passiert.  Ein seltsamer Effekt?

Er öffnet mir die Datei im Vba Editor, kann Makros bearbeiten, sehe aber in Excel 2007 keine Tabellen!!
Und wie kann man das Object wieder schliessen, ohne die gerade geöffnete Datei -mit- zuzumachen??

mfg  Gast 123
Antworten Top
#18
Hallo,

wie wäre es mit dieser API?


Code:
Declare Function LockFile Lib "kernel32.dll" ( _
                ByVal hFile As Long, _
                ByVal dwFileOffsetLow As Long, _
                ByVal dwFileOffsetHigh As Long, _
                ByVal nNumberOfBytesToLockLow As Long, _
                ByVal nNumberOfBytesToLockHigh As Long) As Long


Bei http://www.activevb.de/rubriken/apikatal...kfile.html gab es leider kein Beispiel für die Nutzung.

mfg
Antworten Top
#19
Die Funktion macht am Ende auch nichts anderes wie die von mir oben gennante Fkt, nämlich sie versucht die Datei exklisiv zu öffenen.
Und das scheint, warum auch immer, bei freigegebenen Dateien zu gehen.

Im Moment verstehe ich es nicht Undecided 

Ich habe mit VB.NET folgenden Code versucht

Code:
Imports System.IO
Module Module1

   Sub Main()

       Dim bExist As Boolean
       bExist = isFileOpen("Full Filename")
       If bExist = True Then
           Console.WriteLine("The file is already open")
       Else
           Console.WriteLine("The file isn't open")
       End If
       Console.ReadLine()

   End Sub

   Function isFileOpen(ByRef sName As String) As Boolean
       Dim blnRetVal As Boolean = False
       Dim fs As FileStream

       Try
           fs = File.Open(sName, FileMode.Open, FileAccess.Read, FileShare.None)
       Catch ex As Exception
           blnRetVal = True
       Finally
           If Not IsNothing(fs) Then : fs.Close() : End If
       End Try

       Return blnRetVal
   End Function
End Modul

Das gelcihe Ergebnis. Ist die Datei nicht freigegeben, funktioniert es wie erwartet. Ist die Datei freigegeben und geöffnet, wird es nicht erkannt.

Also im Moment - keine Ahnung :20: :22:
Antworten Top
#20
(24.06.2017, 19:31)Gast 123 schrieb: Er öffnet mir die Datei im Vba Editor, kann Makros bearbeiten, sehe aber in Excel 2007 keine Tabellen!!
Und wie kann man das Object wieder schliessen, ohne die gerade geöffnete Datei -mit- zuzumachen??


Code:
Sub M_snb()
   with getobject("G:\OF\text1.xlsx")              '  öffne visible=false
      msgbox .sheets.count                         ' deine Code
      .close 0                                     '  schliesse ungeändert / unabhänglich von andere Dateien
   end with
End sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste