Eksport makra, PDF i aktywna strona DXF

Cześć,
Nie mając dużej wiedzy z zakresu makro i kodu VBA, chcę wyeksportować aktualną stronę w PDF i DXF pod następującą nazwą pliku:
Nazwa pliku Ustawienie plan_Indice page_Nom révision_Numéro page_Date dnia.

Po wielu wyszukiwaniach i próbach napisania makra doszedłem do wyniku, który mnie nie satysfakcjonuje – nie mogę pobrać wszystkich pożądanych danych: numeru i nazwy strony.
Czy ktoś może mi pomóc?

Załączam mój kod:

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

Bardzo dziękuję za Twoją opinię.
Manu

Zrzut ekranu z nazwą strony i jej numerem?
Nie jest uwzględnione w nazwie arkusza ani w kolejności, w jakiej się pojawiają?

1 polubienie

Cześć Manu,

Oto, co jest stosowane w tego typu leczeniu.


… Proszę bardzo, proszę bardzo, no właśnie...
@+
AR.

Aby uzyskać nazwę arkusza:

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

Aby zmienić nazwę arkusza:

            swDraw.GetCurrentSheet.SetName "nom de la feuille"

Dla N° albo i (inkrement), albo otrzymujesz N° w nazwie arkusza (jeśli to konieczne)

1 polubienie

:smile:Myślałem, że ta rozmowa coś mi mówi, to eksport pakietu Macro DXF arkusz po arkuszu - #23 autorstwa Cyril_f prawda?
Poprzednie propozycje nie były odpowiednie?
Poza Leaf Name, która jest nową prośbą, próbowałeś modyfikować swoje makro?
Mimo to propozycje @sbadenis są dość istotne... :grin:

1 polubienie

Cześć,
To rzeczywiście kontynuacja tego tematu. Różnica polega na tym, że tutaj chcę wyodrębnić aktywny arkusz na ekranie, a nie wszystkie arkusze mojego rysunku.
Makra do wyodrębniania wszystkich moich rysunków arkusz po arkuszu działa dobrze, z wyjątkiem tego, że jest stosunkowo długie (ale zdałem sobie sprawę, że nawet bez przechodzenia przez makro zajmuje tyle samo czasu, więc problem nie leży w makrze, lecz na pewno w ciężarze moich rysunków) i nie mogę umieścić numeru arkusza na samym początku nazwy plik, nie rozumiem, dlaczego to nie działa, ale jestem z tego zadowolony.
Aby wrócić do tego tematu dla aktywnej karty, przetestuję to, co mi przekażesz. Załączam zrzut ekranu z przykładem nazw liści.

A odpowiadając na A_R, znam BatchConverter dobrze, bo był używany w mojej poprzedniej firmie, ale po zmianie firmy z bardzo małą strukturą, wcale nie jest na planie inwestowanie w licencję na narzędzia myCad.

Dziękuję za opinię i czas, który poświęciłeś na odpowiedź
To forum bardzo mi pomaga

Manu

1 polubienie

Witam ponownie,

Więc po próbie, jeśli użyję przesłanego kodu:

    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

Generuje to nazwę ostatniej strony mojego pliku, a nie nazwę bieżącej strony:
image
Tutaj H6(3), podczas gdy aktywna strona to H1(2)

Próbowałem zmodyfikować kod w ten sposób:

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

To daje mi odpowiedź " True " w nazwie pliku zamiast w nazwie strony:
image

A dla numeru strony generuje się liczbę równą całkowitej liczbie stron w dokumencie. Rozumiem więc, że " i " jest uważane za całkowitą liczbę stron.

Jak zrobić to w makrze, żeby " i " odpowiadało aktualnej stronie, a nie całkowitej liczbie stron?

Jeśli to będzie zbyt skomplikowane, zmienię nawyki i włączę numer strony bezpośrednio z nazwą strony (ale jeśli z jakiegokolwiek powodu będę musiał usunąć lub dodać stronę, będę musiał zmienić nazwy wszystkich stron...)

Z pomocą claude.ai oto uzyskany kod funkcjonalny:

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

Więc dziękuję Claude, który, przyznaję, coraz częściej używam do takich modyfikacji robionych w kilka sekund.
Nawet jeśli czasem się zbuguje, a w tym przypadku trzeba wiedzieć, jak zrozumieć kod, żeby poprawnie go poprawić.
Ale w tym przypadku kod zapewnia i działa za pierwszym razem.
Dla informacji, cała twoja gra ze swView jest bezużyteczna.

Edycja: dla zainteresowanych tym zapytaniem:
Cześć, mam ten kod w VBA, który chcę zmodyfikować, chciałbym odzyskać nazwę arkusza w nazwie eksportu oraz numer arkusza (aktywnego), wiedząc, że pierwszy arkusz będzie oznaczony numerem 1, a następnie początkowym kodem, który wkleiłem.

2 polubienia

Na górze działa to świetnie!!

Bardzo dziękuję!!

1 polubienie