Macro-export PDF & DXF actieve pagina

Hallo,
Omdat ik niet veel kennis heb van macro- en VBA-code, wil ik de huidige pagina exporteren in PDF en DXF met de volgende bestandsnaam:
Bestandsnaam Instellen plan_Indice page_Nom révision_Numéro van de page_Date van de dag.

Na meerdere zoekopdrachten en pogingen om een macro te schrijven, kwam ik uit op een resultaat dat mij niet bevredigt; ik kan niet alle gewenste gegevens ophalen: nummer en naam van de pagina.
Kan iemand mij helpen?

Bijgevoegd is mijn code:

Option Explicit
Dim swApp               As SldWorks.SldWorks
Dim swModel             As SldWorks.ModelDoc2
Dim swDrawModel         As SldWorks.ModelDoc2
Dim swDraw              As SldWorks.DrawingDoc
Dim swCustProp          As CustomPropertyManager
Dim swView              As SldWorks.View
Dim swExportPDFData     As SldWorks.ExportPdfData
Dim sFileName           As String
Dim sPathname           As String
Dim Revision            As String
Dim resolvedRevision    As String
Dim sSheetName          As String
Dim sSheetNumber        As String
Dim dateNow             As String
Dim nErrors             As Long
Dim nWarnings           As Long

Sub main()
    Set swApp = Application.SldWorks
    Set swDrawModel = swApp.ActiveDoc
    Set swDraw = swDrawModel
        
        ' Vérifier si une mise en plan est ouverte
        If swDrawModel Is Nothing Then
                MsgBox "Il n'y a pas de document de mise en plan ouvert."
                Exit Sub
        End If

        If swDrawModel.GetType <> swDocDRAWING Then
                MsgBox "Ouvrez d'abord une mise en plan, puis réessayez "
                Exit Sub
        End If

        If swDrawModel.GetPathName = "" Then
                MsgBox "Enregistrez d'abord le dessin, puis réessayez !"
                Exit Sub
        End If

    Set swView = swDraw.GetFirstView

    Set swView = swView.GetNextView

        ' Déterminer s'il y a une vue existante
        If swView Is Nothing Then
                MsgBox "Insérez d'abord une vue, puis réessayez !"
                Exit Sub
        End If

        ' On récupère le nom du fichier de la mise en plan
    sPathname = Replace(swDraw.GetPathName, ".SLDDRW", "")     ' Récupère le nom du fichier et enlève l'extension .SLDDRW
      
        ' On récupère les valeurs qui nous intéresse dans les propriétés personnalisées du plan
    Set swCustProp = swDraw.Extension.CustomPropertyManager("")
    swCustProp.Get2 "Révision", Revision, resolvedRevision      ' Récupère l'indice de Révision du fichier Mise en Plan
    
        ' On récupère la date du jour et on la met dans un format pouvant se mettre dans le nom d'un fichier
    dateNow = Replace(Date, "/", ".")
    
        ' On récupère les données de la feuille active
    'sSheetName = swDraw.ActivateSheet.GetSheetNames    ' Récupère le nom de la feuille active
    'sSheetNumber = swDraw.GetCurrentSheet              ' Récupère le numéro de la feuille active
     
        'Obtenir et définir le nom du fichier
    sFileName = sPathname & " - " & resolvedRevision & " - " & dateNow      'Code fonctionnel mais sans le numéro et le nom de la page
    'sFileName = sPathname & " - " & resolvedRevision & " - " & sSheetNumber & " - " & sSheetName  & " - " & dateNow        'Code non-fonctionnel voulu

    Set swExportPDFData = swApp.GetExportFileData(1)

    swExportPDFData.SetSheets swExportData_ExportCurrentSheet, ""

    swExportPDFData.ViewPdfAfterSaving = False

    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, swDxfActiveSheetOnly

        'Enregistrer au format DXF

    swDraw.Extension.SaveAs sFileName & ".DXF", 0, 0, Nothing, nErrors, nWarnings

        'Enregistrer au format PDF

    swDraw.Extension.SaveAs sFileName & ".PDF", 0, 0, swExportPDFData, nErrors, nWarnings

    End Sub

Hartelijk dank voor je feedback.
Manu

Een screenshot van een paginanaam en het nummer?
Wordt het vermeld in de naam van het blad of in de volgorde waarin ze verschijnen?

1 like

Hallo Manu,

Dit is wat er voor dit soort behandeling wordt gebruikt.


… Daar ga je, daar ga je, daar ga je...
@+
AR.

Om de naam van een vel te krijgen:

vSheetName = swDraw.GetSheetNames
'On boucle sur les feuilles
For i = 0 To UBound(vSheetName)
        sheetName = vSheetName(i)
        'Debug.Print "Nom de feuille:" & sheetName

Next i

Om de naam van het blad te veranderen:

            swDraw.GetCurrentSheet.SetName "nom de la feuille"

Voor de N° is het ofwel de i (increment), of je krijgt de N° in de naam van het blad (indien nodig)

1 like

:smile:Ik dacht dat dit gesprek me iets vertelde, het is de Macro DXF exportsuite sheet voor sheet - #23 per Cyril_f toch?
Waren de eerdere voorstellen niet geschikt?
Behalve de Bladnaam, die een nieuw verzoek is, heb je geprobeerd je macro aan te passen?
Dat gezegd hebbende, zijn @sbadenis's voorstellen behoorlijk relevant... :grin:

1 like

Hallo,
Dit is inderdaad het vervolg op dit onderwerp. Het verschil is dat ik hier het actieve blad op het scherm wil extraheren en niet alle bladen van mijn tekening.
De macro om al mijn sheet-voor-sheet tekeningen te extraheren werkt goed, behalve dat het relatief lang is (maar ik realiseerde me dat het zelfs zonder de macro te doorlopen, het net zo lang duurt, dus het probleem ligt niet bij de macro maar zeker bij de zwaarte van mijn tekeningen) en dat ik het bladnummer niet helemaal aan het begin van de naam van de bestand te maken, ik snap niet waarom het niet werkt, maar ik ben er tevreden mee.
Om terug te komen op dit onderwerp voor het actieve blad, ik zal testen wat je aan mij overbrengt. En bijgevoegd is een screenshot van een voorbeeld van de bladnamen.

En om A_R te beantwoorden: ik ken BatchConverter goed omdat het in mijn vorige bedrijf werd gebruikt, maar omdat ik van bedrijf ben veranderd met een zeer kleine structuur, staat het helemaal niet op de agenda om te investeren in een licentie voor myCad-tools.

Dank je wel voor je feedback en de tijd die je in elk geval aan mij besteedt
Dit forum is een grote hulp voor mij

Manu

1 like

Hallo weer,

Dus na het proberen of ik de verzonden code gebruik:

    vSheetName = swDraw.GetSheetNames           ' Récupère le nom de la feuille active
            'On boucle sur les feuilles
                For i = 0 To UBound(vSheetName)
                        sSheetName = vSheetName(i)
                Next i

Dit genereert de naam van de laatste pagina van mijn bestand en niet de naam van de huidige pagina:
image
Hier H6(3) terwijl de actieve pagina H1(2) was

Ik heb geprobeerd de code als volgt aan te passen:

vSheetName = swDraw.GetSheetNames           ' Récupère le nom de la feuille active
            'On boucle sur les feuilles
                For i = 0 To UBound(vSheetName)
                        sSheetName = swDraw.ActivateSheet(vSheetName(i))
                Next i

Dit geeft me het antwoord " True " in de bestandsnaam in plaats van de paginanaam:
image

En voor het paginanummer genereert het een getal gelijk aan het totale aantal pagina's in het document. Dus ik begrijp dat de " i " wordt beschouwd als het totale aantal pagina's.

Hoe doe ik dit in de macro, zodat de " i " overeenkomt met de huidige pagina en niet met het totale aantal pagina's?

Als dit te complex is, verander ik mijn gewoonten en integreer ik het paginanummer direct in de naam van de pagina (maar als ik om welke reden dan ook een pagina moet verwijderen of toevoegen, moet ik de naam van alle pagina's veranderen...)

Met behulp van claude.ai is hier de functionele code verkregen:

Option Explicit
Dim swApp               As SldWorks.SldWorks
Dim swModel             As SldWorks.ModelDoc2
Dim swDrawModel         As SldWorks.ModelDoc2
Dim swDraw              As SldWorks.DrawingDoc
Dim swCustProp          As CustomPropertyManager
Dim swView              As SldWorks.View
Dim swExportPDFData     As SldWorks.ExportPdfData
Dim sFileName           As String
Dim sPathname           As String
Dim Revision            As String
Dim resolvedRevision    As String
Dim sSheetName          As String
Dim sSheetNumber        As String
Dim dateNow             As String
Dim nErrors             As Long
Dim nWarnings           As Long

Sub main()
    Set swApp = Application.SldWorks
    Set swDrawModel = swApp.ActiveDoc
    Set swDraw = swDrawModel
        
    ' Vérifier si une mise en plan est ouverte
    If swDrawModel Is Nothing Then
        MsgBox "Il n'y a pas de document de mise en plan ouvert."
        Exit Sub
    End If
    If swDrawModel.GetType <> swDocDRAWING Then
        MsgBox "Ouvrez d'abord une mise en plan, puis réessayez "
        Exit Sub
    End If
    If swDrawModel.GetPathName = "" Then
        MsgBox "Enregistrez d'abord le dessin, puis réessayez !"
        Exit Sub
    End If

    ' -------------------------------------------------------
    ' Récupération du nom de la feuille active
    ' -------------------------------------------------------
    Dim swSheet         As SldWorks.Sheet
    Dim vSheetNames     As Variant
    Dim i               As Integer

    Set swSheet = swDraw.GetCurrentSheet()
    sSheetName = swSheet.GetName()              ' Nom de la feuille active

    ' Récupération du numéro de la feuille active (index 1-based)
    vSheetNames = swDrawModel.GetSheetNames()   ' Tableau de tous les noms de feuilles
    sSheetNumber = "1"                          ' Valeur par défaut
    For i = 0 To UBound(vSheetNames)
        If vSheetNames(i) = sSheetName Then
            sSheetNumber = CStr(i + 1)          ' i=0 ? feuille n°1
            Exit For
        End If
    Next i

    Debug.Print "Feuille active : " & sSheetName & " (n°" & sSheetNumber & ")"
    ' -------------------------------------------------------

    ' On récupère le nom du fichier de la mise en plan
    sPathname = Replace(swDraw.GetPathName, ".SLDDRW", "")
    sPathname = Replace(sPathname, ".slddrw", "")   ' Sécurité casse minuscule

    ' On récupère les valeurs des propriétés personnalisées
    Set swCustProp = swDraw.Extension.CustomPropertyManager("")
    swCustProp.Get2 "Révision", Revision, resolvedRevision

    ' On récupère la date du jour formatée
    dateNow = Replace(Date, "/", ".")

    ' Construction du nom de fichier avec numéro et nom de feuille
    sFileName = sPathname & " - " & resolvedRevision & _
                " - F" & sSheetNumber & " - " & sSheetName & _
                " - " & dateNow

    ' Export PDF
    Set swExportPDFData = swApp.GetExportFileData(1)
    swExportPDFData.SetSheets swExportData_ExportCurrentSheet, ""
    swExportPDFData.ViewPdfAfterSaving = False

    ' Export DXF (feuille active uniquement)
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, swDxfActiveSheetOnly

    ' Enregistrer au format DXF
    swDraw.Extension.SaveAs sFileName & ".DXF", 0, 0, Nothing, nErrors, nWarnings

    ' Enregistrer au format PDF
    swDraw.Extension.SaveAs sFileName & ".PDF", 0, 0, swExportPDFData, nErrors, nWarnings

End Sub
'``

'**Les deux points clés du changement :**

'GetCurrentSheet()` retourne l'objet `Sheet` de la feuille active, dont on tire le nom via `.GetName()`.

'GetSheetNames()` retourne un tableau `Variant` de tous les noms de feuilles dans l'ordre. On boucle dessus pour trouver la position de la feuille active, en ajoutant 1 car le tableau est indexé à 0.

'Le nom de fichier généré aura la forme :
'``
'C:\...\MonDessin - RevA - F2 - Feuille2 - 23.02.2026.PDF

Dus dank je Claude, aan wie ik toegeef dat ik steeds meer gebruik voor dit soort aanpassingen die in een paar seconden worden gemaakt.
Zelfs als het soms bugs en in dit geval moet je weten hoe je de code moet begrijpen om het correct te kunnen corrigeren.
Maar in dit geval levert code en werkt het bij de eerste poging.
Ter info, je hele spel met swView is nutteloos.

Bewerking: voor degenen die geïnteresseerd zijn in de query:
Hallo, ik heb deze code in VBA die ik wil aanpassen; ik wil graag de naam van het blad terughalen in de exportnaam, evenals het nummer van het blad (actief), wetende dat het eerste blad genummerd zal zijn als 1 en daarna de initiële code die ik heb geplakt.

2 likes

Bovenaan werkt het geweldig!!

Hartelijk dank!!

1 like