Verbetering van PDF-macro's

Hallo

Om het onderwerp van de PDF-macro (http://www.lynkoa.com/forum/cao/macro-d-enregistrement-pdf-dans-dossier-actuel#answer-617678) op te volgen, wil ik nu een "bug" verbeteren, die het gebruik van de macro niet blokkeert, maar op de lange termijn enigszins irritant is.

Wanneer een .PDF plan in de werkplaats wordt geopend voor overleg en ik een wijziging moet aanbrengen. op ditzelfde vliegtuig direct op Solidworks, en ik gebruik deze PDF-macro, crasht Solidworks en sluit het, omdat het het PDF-bestand niet kan overschrijven omdat het al open is.

Wanneer ik echter probeer het plan op te slaan door te .PDF met behulp van "Bestand"-"Bewaar sous-.PDF", verschijnt het bericht "Dit bestand is alleen-lezen" en zorgt ervoor dat Solidworks niet crasht.

Zou het mogelijk zijn om een regel code in mijn macro op te halen waarmee ik dit bericht kan krijgen als het bestand al open is, en Solidworks niet laat crashen?

Hier is de macro die .PL me had voorgesteld (nogmaals bedankt!):

 

Sub hoofd()

Stel swApp = Toepassing.SldWorks in

Deel instellen = swApp.ActiveDoc

Hiermee haalt u het volledige pad van het huidige document op, inclusief de bestandsnaam:
PathName = UCase(Deel.GetPathName)


myModelView dimmen als object
Stel myModelView = Deel.ActiveView in
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Deel.EditRebuild3()
Deel.WeergaveZoomtofit2
Deel.WeergaveZoomtofit2
Deel.WeergaveZoomtofit2
longstatus = Part.SaveAs3(Vervangen(UCase(PathName), "SLDDRW", "PDF"), 0, 0)
Einde Sub

 

Bij voorbaat dank voor uw hulp,

Vriendelijke groeten

Allan.

Hallo

U moet controleren of het bestand open is om een waarschuwing msgbox te maken.

Zie deze pagina :

https://support.microsoft.com/en-us/kb/153058

En hier is de code:

Sub hoofd()
Stel swApp = Toepassing.SldWorks in
Deel instellen = swApp.ActiveDoc
Hiermee haalt u het volledige pad van het huidige document op, inclusief de bestandsnaam:
PathName = UCase(Deel.GetPathName)
myModelView dimmen als object
Stel myModelView = Deel.ActiveView in
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Deel.EditRebuild3()
Deel.WeergaveZoomtofit2
Deel.WeergaveZoomtofit2
Deel.WeergaveZoomtofit2
    Als GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF") en vbReadOnly dan
        MsgBox "Alleen-lezen bestand"
    Anders
        longstatus = Part.SaveAs3(Vervangen(UCase(PathName), "SLDDRW", "PDF"), 0, 0)
    Einde als
Einde Sub

 

 

1 like

Hallo

Hier is degene die we gebruiken, het slaat het bestand met zijn naam op in de tekenmap.


macro_pdf.swp

Hartelijk dank voor uw antwoord .PL, maar de macro werkt niet, blijkbaar is er een probleem met deze regel: Als GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF") En vbReadOnly Dan

Door een kijkje te nemen op de link die je me ook hebt gegeven, zag ik dat er een punt zou moeten zijn voor de ReadOnly, maar ik probeerde het toe te voegen en het veranderde niets.

Bij voorbaat dank, en sorry voor mijn totale onwetendheid in VBA-codering...

Er ontbrak een haakje tussen GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF") en AND,

Hier is de nieuwe code:

 

Code verwijderen

Ik heb de code gewijzigd voor het geval het PDF-bestand niet bestaat, hier is het:

Sub hoofd()
Stel swApp = Toepassing.SldWorks in
Deel instellen = swApp.ActiveDoc
Hiermee haalt u het volledige pad van het huidige document op, inclusief de bestandsnaam:
PathName = UCase(Deel.GetPathName)
myModelView dimmen als object
Stel myModelView = Deel.ActiveView in
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Deel.EditRebuild3()
Deel.WeergaveZoomtofit2
Deel.WeergaveZoomtofit2
Deel.WeergaveZoomtofit2

Als Dir(Replace(UCase(PathName), "SLDDRW", "PDF")) <> "" dan
    Als GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF")) en vbReadOnly dan
        MsgBox "Alleen-lezen bestand"
    Anders
        longstatus = Part.SaveAs3(Vervangen(UCase(PathName), "SLDDRW", "PDF"), 0, 0)
    Einde als

Einde als
Einde Sub

Bedankt .PL je je best doet voor mij, helaas werkt de macro nog steeds niet, hij genereert helemaal niets.

Ik probeer mijn best te doen om je tijd niet te verspillen, dus ik ging terug naar de haakjes enz., maar ik zie niets, sorry, de code lijkt me goed...

Is er sprake van een fout of gebeurt er niets?

Sorry, kleine fout van mijn kant, het zal me leren om niet genoeg te testen!

Nu zou het moeten werken!

Sub hoofd()
Stel swApp = Toepassing.SldWorks in
Deel instellen = swApp.ActiveDoc
Hiermee haalt u het volledige pad van het huidige document op, inclusief de bestandsnaam:
PathName = UCase(Deel.GetPathName)
myModelView dimmen als object
Stel myModelView = Deel.ActiveView in
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Deel.EditRebuild3()
Deel.WeergaveZoomtofit2
Deel.WeergaveZoomtofit2
Deel.WeergaveZoomtofit2

Als Dir(Replace(UCase(PathName), "SLDDRW", "PDF")) <> "" dan
    Als GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF")) en vbReadOnly dan
        MsgBox "Alleen-lezen bestand"
    Anders
        longstatus = Part.SaveAs3(Vervangen(UCase(PathName), "SLDDRW", "PDF"), 0, 0)
    Einde als

    Anders
        longstatus = Part.SaveAs3(Vervangen(UCase(PathName), "SLDDRW", "PDF"), 0, 0)

Einde als
Einde Sub

Bedankt voor deze nieuwe macro, het werkt inderdaad, maar onder bepaalde voorwaarden, en om dit op te lossen weet ik niet of ik degene ben die iets moet repareren of dat de macro kan worden verbeterd.

 

Als ik een tekening open en een nieuwe PDF maak, geen bestand.

Aan de andere kant, wanneer ik de PDF van de tekening probeer te genereren terwijl deze open is, crasht Solidworks zoals voorheen.

Dit probleem wordt opgelost wanneer ik de PDF open nadat ik het selectievakje "Attributen: Alleen-lezen" in de eigenschappen heb aangevinkt. Op dit punt werkt de macro en verschijnt het bericht "Alleen-lezen bestand" wanneer ik de PDF probeer te genereren. Pas na het sluiten van de PDF, in een poging om te regenereren, verschijnt nog steeds het bericht  "Alleen-lezen bestand", alsof het bestand open blijft, terwijl dat niet het geval is. Ik slaag erin het probleem op te lossen door "Attributen: Alleen-lezen" in de eigenschappen uit te vinken, en dan wil de PDF regenereren.

 

Is het aan mij om lees-/schrijfrechten in te stellen of moet de macro worden aangepast?

Dank u voor uw hulp.

 

Heb je de mijne kunnen testen?

Hallo Manu67, ik kon je macro niet testen, want als ik op de link van je antwoord klik, opent het een onbeschrijfelijke code voor mij, ik heb hetzelfde probleem voor alle bijlagelinks in het bericht op het forum.

Goedenavond

Als ik me niet vergis, is het alleen-lezen attribuut niet direct uitneembaar op pdf-bestanden.

We moeten kijken naar de bestandsverwijderingsfuncties van de bestandsmethode (zie: http://warin.developpez.com/access/fichiers/#LI-D-2) en de gewenste behandeling toepassen op basis van het resultaat (als fout --> alleen-lezen bestand).

Dit is de macro die we gebruiken:

 

Dim swApp als SldWorks.SldWorks
Dim swModel als ModelDoc2
Dim lErrors zo lang
Dim lWaarschuwingen zo lang mogelijk

Sub hoofd()

Stel swApp = Toepassing.SldWorks in
Stel swModel = swApp.ActiveDoc in
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & " rev." & swModel.GetCustomInfoValue("", "Revisie") & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings

Einde Sub


Functie GetFilename(strPath As String) Als String
    Dim strTemp als snaar
    strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
    GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)
Functie beëindigen

Hallo

Hier is degene die werkt en ik heb het net getest:

Dim swApp als SldWorks.SldWorks
Dim swModel als ModelDoc2
Dim lErrors zo lang
Dim lWaarschuwingen zo lang mogelijk

Sub hoofd()

Stel swApp = Toepassing.SldWorks in
Stel swModel = swApp.ActiveDoc in
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & " rev." & swModel.GetCustomInfoValue("", "Revisie") & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings

Einde Sub

Functie GetFilename(strPath As String) Als String
Dim strTemp als snaar
strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)
Functie beëindigen

Hallo

 

Ik heb precies hetzelfde probleem, ik ga je oplossing testen om te zien of het werkt en ik zou de bankschroef nog verder willen duwen. Wanneer een pdf-plan wordt geopend in Windows Verkenner in het voorbeeldvenster, ziet de back-up er goed uit, maar is het pdf-bestand onleesbaar. Een verklaring?

 

Kom op, ik zal je codes testen!

Kleine feedback na tests. 

 

Wat mij betreft, de PL-code werkt niet. 

manu67, ik heb je code niet geprobeerd omdat ik het niet begrijp (en omdat ik graag begrijp wat ik doe...)

 

Dus ik deed wat onderzoek en ik kwam met dit:

https://support.microsoft.com/en-us/kb/291295

Om hiermee af te ronden (want fout opgave 75): http://stackoverflow.com/questions/12599322/check-if-a-file-is-already-open-vba

Het werkt goed, het detecteert of de PDF op een andere computer is geopend. Aan de andere kant heb ik de geopende pdf's gewoon op een ander werkstation laten staan en het vertelt me nog steeds dat ze open zijn... om te zien of het vanzelf terugkomt, of het aan de server ligt....