Makro-Export PDF & DXF aktive Seite

Hallo,
Da ich nicht viel Kenntnisse in Makro- und VBA-Code habe, möchte ich die aktuelle Seite als PDF und DXF mit folgendem Dateinamen exportieren:
Dateiname: Einstellung plan_Indice page_Nom révision_Numéro der Tages-page_Date.

Nach mehreren Suchen und Versuchen, ein Makro zu schreiben, bin ich zu einem Ergebnis gekommen, das mich nicht zufriedenstellt: Ich kann nicht alle gewünschten Daten abrufen: Nummer und Name der Seite.
Kann mir jemand helfen?

Angehängt ist mein 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

Vielen Dank für dein Feedback.
Manu

Ein Screenshot eines Seitennamens und seiner Nummer?
N° im Namen des Blattes oder in der Reihenfolge, in der sie erscheinen?

1 „Gefällt mir“

Hallo Manu,

Hier ist, was für diese Art von Behandlung verwendet wird.


… Da hast du es, da hast du es, da hast du es...
@+
AR.

Um den Namen eines Blattes zu erhalten:

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

Um den Namen des Blattes zu ändern:

            swDraw.GetCurrentSheet.SetName "nom de la feuille"

Für das N° entweder das i (Inkrement) oder du bekommst das N° im Namen des Blatts (falls nötig)

1 „Gefällt mir“

:smile:Ich dachte, dieses Gespräch sagt mir etwas: Es ist die Macro DXF Exportsuite Blatt für Blatt – #23 von Cyril_f oder?
Waren die vorherigen Vorschläge nicht geeignet?
Abgesehen vom Blattnamen, der eine neue Anfrage ist, hast du versucht, dein Makro zu ändern?
Das gesagt, sind @sbadenis Vorschläge sehr relevant... :grin:

1 „Gefällt mir“

Hallo,
Dies ist tatsächlich die Fortsetzung dieses Themas. Der Unterschied ist, dass ich hier das aktive Blatt auf dem Bildschirm extrahieren möchte und nicht alle Blätter meiner Zeichnung.
Das Makro, um alle meine Blatt-für-Blatt-Zeichnungen zu extrahieren, funktioniert gut, außer dass es relativ lang ist (aber ich habe festgestellt, dass es auch ohne das Makro genauso lange dauert, sodass das Problem nicht beim Makro, sondern sicherlich an der Schwere meiner Zeichnungen liegt) und dass ich die Blattnummer nicht ganz am Anfang des Namens der Ich kann nicht verstehen, warum es nicht funktioniert, aber ich bin zufrieden damit.
Um auf dieses Thema für das aktive Blatt zurückzukommen, werde ich testen, was du mir überträgst. Und angehängt ist ein Screenshot eines Beispiels für die Blattnamen.

Und um A_R zu beantworten: Ich kenne BatchConverter gut, weil es in meiner vorherigen Firma verwendet wurde, aber nachdem ich mit einer sehr kleinen Struktur das Unternehmen gewechselt habe, steht es überhaupt nicht auf der Agenda, in eine Lizenz für myCad-Tools zu investieren.

Danke für dein Feedback und die Zeit, die du dir in jeglichen Fällen für meine Antworten nimmst.
Dieses Forum ist mir eine große Hilfe

Manu

1 „Gefällt mir“

Hallo nochmal,

Also nach dem Versuch, ob ich den übertragenen Code benutze:

    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

Dadurch wird der Name der letzten Seite meiner Datei erzeugt und nicht der aktuelle Seite:
image
Hier H6(3), während die aktive Seite H1(2) war.

Ich habe versucht, den Code wie folgt zu ändern:

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

Das gibt mir die Antwort " True " im Dateinamen statt im Seitennamen:
image

Und für die Seitenzahl erzeugt es eine Zahl, die der Gesamtzahl der Seiten im Dokument entspricht. Ich verstehe also, dass das " i " als Gesamtseitenzahl gilt.

Wie mache ich das im Makro, sodass das " i " der aktuellen Seite entspricht und nicht der Gesamtzahl der Seiten?

Wenn das zu komplex ist, ändere ich meine Gewohnheiten und integriere die Seitenzahl direkt in den Seitennamen (aber falls ich aus irgendeinem Grund eine Seite löschen oder hinzufügen muss, muss ich den Namen aller Seiten ändern...)

Mit Hilfe von claude.ai ist hier der erhaltene Funktionscode:

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

Also danke, Claude, von dem ich zugeben muss, dass ich für diese Art von Modifikation, die in wenigen Sekunden vorgenommen wird, immer mehr benutze.
Auch wenn es manchmal Fehler macht und man in diesem Fall wissen muss, wie man den Code versteht, damit er richtig korrigiert wird.
Aber in diesem Fall funktioniert Code beim ersten Versuch und funktioniert es.
Zur Info: Dein ganzes Spiel mit swView ist nutzlos.

Nachtrag: Für diejenigen, die an der Anfrage interessiert sind:
Hallo, ich habe diesen Code in VBA, den ich ändern möchte. Ich möchte den Namen des Sheets im Exportnamen sowie die Nummer des Sheets (aktiv) wiederherstellen, in dem Wissen, dass das erste Sheet mit der Nummer 1 und dann dem ursprünglichen Code, den ich eingefügt habe, nummeriert wird.

2 „Gefällt mir“

Oben funktioniert es wunderbar!!

Vielen Dank!!

1 „Gefällt mir“