Nagrywanie makr pdf z obsługą błędów

Witam, obecnie używam następującego kodu do zapisania MEP w formacie PDF

longstatus = Part.SaveAs3(ŚcieżkaPliku + NazwaPliku + ".PDF", 0, 0)

 

Nie ma problemów z tej strony, z wyjątkiem sytuacji, gdy wspomniany plik PDF jest już otwarty, a zatem nie jest w tej chwili nadpisywany, solidworks i blokuje się i czeka w nieskończoność, aż plik pdf zostanie ponownie nadpisany, nie wiem, czy mój problem jest bardzo zrozumiały, ale jeśli ktoś ma rozwiązanie, jestem zainteresowany :)

Musisz przejść przez zarządzanie błędami w swoim makrze

lub pętlę z okresem ważności.

łatwo go znaleźć na forach programistycznych

2 polubienia

Osobiście użyłem do tego długiego programu VBA... więc nie zamierzam Wam wszystkiego przynosić ;)

Ale jeśli chodzi o część, która Cię interesowała, moja linia była nieco inna, ale zastanawiałem się, czy chcę pisać na już istniejącym pliku i wskazałem, że nie można pisać, jeśli jest już otwarty.

 

Więc myślę, że powinno z tym działać :)

 

boolstatus = swpdfext. Zapisz jako(nazwaPDF, 0, 0, swPDF, IErrors, IWarnings)

 

z

Dim swpdfext jako SldWorks.ModelDocExtension

Przyciemnij swPDF jako SldWorks.ExportPdfData

Dim swpdfext jako SldWorks.ModelDocExtension

Przyciemnij IErrory tak długo

Dim IWarnings tak długo

Dim boolstatus As Boolean

 

Ustaw swpdfext = swdoc. Rozszerzenie

Ustaw swPDF = swapp. GetExportFileData(1)

Ustaw swpdfext = swdoc. Rozszerzenie

 

namePDF = Ścieżka pliku & nowa_nazwa & ".pdf"

FilePath jest folderem rekordów

Newname to nazwa twojego pliku

A jeśli plik PDF jest otwierany tylko do odczytu. Zgniatanie nie powinno stanowić problemu.

 Dziękuję todescocoin37coin i Bart☺

za twoje odpowiedzi, ale nic nie pomaga, makro zawiesza się tak długo, jak plik PDF nie jest zamknięty, próbowałem obsługi błędów, ale też nie reaguje :/

Witam

Myślę, że poniższy link powinien być w stanie Ci pomóc:

http://www.cpearson.com/excel/IsFileOpen.aspx

Witam

Można to zrobić na przykład:

        protected virtual bool IsFileLocked(plik FileInfo )
        {
            Strumień FileStream = null;
            próbować
            {
                stream = plik. Open(FileMode.Otwórz program FileAccess. Odczyt, FileShare. Brak);
            }
            catch (IOException)
            {
                zwraca wartość true;
            }
            w końcu
            {
                if (strumień != null)
                    Strumień. Zamknij();
            }
            return false;
        }

wywoływane w następujący sposób:

           Dokument ModelDoc2 (Dokument Modelu) 2 SWPart = null;
            SWPart = ((ModelDoc2)(SolidWorksMacro.swapp. ActiveDoc));
            Tworzenie pliku PDF na komputerze
            nazwa ciąguPDF = ciąg. Pusty;
            namePDF = System. Środowisko. GetFolderPath(System.Środowisko. Folder specjalny. Komputer stacjonarny) + "\\test.pdf";
            
            Nazwa FileInfoPDFinfo = nowy FileInfo(nazwaPDF);
            if (IsFileLocked(namePDFinfo))
            {
                Skrzynka wiadomości. Show("Tylko do odczytu");
                powrót;
            }
            ŚWW. Zapisz jako(nazwaPDF);

 

Przepraszam, że to C# (więc do przetłumaczenia na vba), ale zasada jest następująca:

1°) Utwórz funkcję, która pozwala dowiedzieć się, czy plik jest używany.

2°) Przetestuj, czy plik jest używany przed zapisaniem go jako PDF.

Pozdrowienia

 Dziękuję Cyril.f 

 

Daje to następujący kod

Jeśli IsFileOpen(ŚcieżkaPliku + NazwaPliku + ". DWG") = Prawda Wtedy
MsgBox "Plik i ścieżka pliku + nazwa pliku +". Plik DWG jest obecnie używany przez użytkownika i dlatego nie można go nadpisać."
Inaczej
longstatus = Part.SaveAs3(ŚcieżkaPliku + NazwaPliku + ". DWG", 0, 0)
Zakończ jeżeli:

do dostosowania zgodnie z DWG lub PDF, nie zapominając o dodaniu modułu z zawartością linku Cyryla.f