Corel FORUM
Forum użytkowników programów firmy Corel. Grafika wektorowa, rastrowa i obróbka zdjęć cyfrowych

Makra - Makro do sprawdzania czy plik jest otwarty

TheMan258 - 18 Marzec 2021, 22:53
Temat postu: Makro do sprawdzania czy plik jest otwarty
Witam,
czy jest jakiś sposób, aby makro sprawdziło (np wyświetliło komunikat) podczas zapisywania pliku czy dokument jest otwarty na innym komputerze? (Coś podobnego do zaimplementowanego corelowskiego komunikatu przy próbie nadpisania otwartego pliku)

Pracuję w firmie na współdzielonym dysku i zdarza się tak, że ktoś zapomni sobie wyłączyć jakiś plik, przez co nie jestem w stanie go edytować lub makro, które próbuję użyć potrafi zawiesić corela przez to, że któryś z plików jest otwarty gdzie indziej i corel nie jest w stanie go sobie nadpisać. Przeszukałem cały internet, ale są takie macra tylko do excela. Za wszelką pomoc bardzo dziękuję :poklon bo są tutaj prawdziwi magicy od kodowania :ok

Martin Nez - 19 Marzec 2021, 15:41

Witam,
W Corelu X8 wyskakuje mi okienko informujące o tym, że ktoś używa otwieranego pliku (załącznik). Jeśli używasz tej lub nowszej wersji możliwe, że zaznaczyłeś ptaszek na dole, możesz to odblokować w menu Narzędzia > Opcje > Ostrzeżenia > "Ostrzegaj, gdy pliki są tylko do odczytu".

Pozdr,
MN

TheMan258 - 19 Marzec 2021, 20:13

Martin Nez napisał/a:
Witam,
W Corelu X8 wyskakuje mi okienko informujące o tym, że ktoś używa otwieranego pliku (załącznik). Jeśli używasz tej lub nowszej wersji możliwe, że zaznaczyłeś ptaszek na dole, możesz to odblokować w menu Narzędzia > Opcje > Ostrzeżenia > "Ostrzegaj, gdy pliki są tylko do odczytu".

Pozdr,
MN

Dziękuję za odpowiedź jednak to nie rozwiązuje mojego problemu.
Przy normalnym zapisywaniu pliku w Corelu x5 też ten komunikat się pokazuje, ale problem pojawia się przy zapisaniu przez makro wówczas corel wysypuje się wtedy. Myślę o dodaniu warunku do makra, lecz nie potrafię znaleźć odpowiedzi, co dopisać i czy w ogóle w VBA można coś takiego dodać.

Martin Nez - 19 Marzec 2021, 22:38

Bez kodu makra nie pomogę. ;-) Samego sprawdzania czy plik nie jest gdzieś otwarty nie da się zrobić, ponieważ... jest otwarty u Ciebie. :-) Wrzuć kod, spróbujemy poprawić makro, aby się nie zawieszało.
Pozdr,
MN

maroQ - 27 Czerwiec 2021, 22:07

TheMan258 napisał/a:
czy jest jakiś sposób, aby makro sprawdziło (np wyświetliło komunikat) podczas zapisywania pliku czy dokument jest otwarty na innym komputerze?


Znalazłem gotowy kod więc załączam razem z instrukcją:
Kod:
Function IsFileOpen(fName As String) As Boolean
'''
''' Zrodlo: https://www.ozgrid.com/forum/index.php?thread/62861-is-file-open-on-network/&postID=577730#post577730
'''
    Dim ff As Integer, errNum As Integer
   
    On Error Resume Next 'start obslugi bledow
   
    ff = FreeFile '@see: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/freefile-function
   
    Open fName For Input Lock Read As #ff '@see: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/open-statement
    Close ff
   
    errNum = Err 'numer bledu
   
    On Error GoTo 0 'czyszczenie bufora bledow i powrot do normalnej pracy
   
    IsFileOpen = (errNum <> 0)
End Function

Sub test()
    Dim file As String
    file = "D:\CorelVBA\Beznazwy-1.cdr"
   
    If IsFileOpen(file) Then
        Debug.Print "Niestety plik """ & file & """ jest w uzyciu"
        MsgBox "Niestety plik """ & file & """ jest w uzyciu", vbCritical, "Test otwierania pliku"
    Else
        Debug.Print "Plik """ & file & """ jest nieuzywany"
        MsgBox "Plik """ & file & """ jest nieuzywany", vbInformation, "Test otwierania pliku"
    End If
End Sub


Mechanizm sprawdza tylko czy plik jest otwarty, ale nie sprawdza czy przez kogoś czy bezpośrednio w Corelu. Operuje na funkcji Open z VB.

Problem w tym, że w VBA czyli VB6 nie było jeszcze obsługi blokady pliku na takim poziomie jak np. w .NET
Możliwe, że z poziomu VSTA albo samodzielniej aplikacji pisanej w VB.NET typu exe, dało by się dowiedzieć czegoś więcej.
VB jest fajny do prostych zadań. Poza tym kod makra pisany w VB nawet zabezpieczony da się dość łatwo odszyfrować.

TheMan258 - 18 Wrzesień 2021, 13:36

Bardzo dziękuję za odpowiedź :-) . Problem został rozwiązany jednak w trochę inny sposób mianowicie za pomocą obsługi błędów. Jeśli dokument jest otwarty na innym komputerze to makro zapisze w tej samej lokalizacji otwarty plik z nazwą dokumentu plus dodatkowo wstawi jedynkę.
Kod:
Err: ActiveDocument.SaveAs "Dowolna ścieżka" + Left$(Namefile, Len(Namefile) - 4) & " 1" & ".cdr", SaveOptions

Drobna uwaga jeśli plik będzie bez nazwy to pojawi się błąd.


Powered by phpBB modified by Przemo © 2003 phpBB Group