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
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)
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...
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
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: 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:
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.