Registriert seit: 23.05.2017
Version(en): 2013
23.06.2017, 09:41
(Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2017, 09:41 von S05.)
'
(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ß
Registriert seit: 06.12.2015
Version(en): 2016
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
Registriert seit: 25.04.2016
Version(en): 2013
23.06.2017, 16:03
(Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2017, 16:03 von Storax.)
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
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.
Registriert seit: 06.12.2015
Version(en): 2016
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)
Registriert seit: 25.04.2016
Version(en): 2013
23.06.2017, 17:18
(Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2017, 17:19 von Storax.)
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
Registriert seit: 29.09.2015
Version(en): 2030,5
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
Registriert seit: 12.03.2016
Version(en): Excel 2003
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
Registriert seit: 06.12.2015
Version(en): 2016
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
Registriert seit: 25.04.2016
Version(en): 2013
25.06.2017, 08:35
(Dieser Beitrag wurde zuletzt bearbeitet: 25.06.2017, 08:36 von Storax.)
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
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:
Registriert seit: 29.09.2015
Version(en): 2030,5
25.06.2017, 11:29
(Dieser Beitrag wurde zuletzt bearbeitet: 25.06.2017, 11:30 von snb.)
(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
|