Ik ben ook aan het drogen! Kunt u de macro bewerken, voeg de Execution en Local Variables vensters (zie afbeelding), klik dan net na Sub main() en druk op F8 zodat het bugs?
Kortom, verscheur de macro stap voor stap. En controleer in het lokale variabelevenster de waarde van sModelName wanneer deze crasht:
Ik heb net tests opnieuw gedaan door de basiscode te kopiëren en het werkt niet elke keer ... Ik heb 5 tests gedaan en ik had 2 keer waar het goed werkt, anderen waar ik de PDF / DWG niet heb, of anders start het gewoon niet!
Ik begrijp niet waarom het niet elke keer werkt!
Anders hoef ik in theorie het bestandspad niet meer te wijzigen
Hallo; @Antoine_Ruelle , Als u uw MEP nader bekijkt, lijkt het erop dat u de eigenschap " Revisie " niet gebruikt. Dat zal de onderstaande fout verklaren:
Goedenavond Ja, het gaat naar de functie om de bestandsnaaminformatie te kunnen ophalen door de extensie te verwijderen. Zoals het er nu uitziet, werkt de code die door @sbadenis wordt aangeboden op SW2022.
Hallo @tous Antoine kijkt ondertussen naar deze macro, Verwijdert regels 4 en 5 na " sub main ". En wijst de exacte naam van de revisie-eigenschap toe in plaats van " hint "
Inderdaad, @Maclane voor het revisiegedeelte heb ik er ook over nagedacht, vandaar de wijziging die ik had voorgesteld met het verwijderen van deze eigenschap en het toevoegen van mappen. Voor eigenschappen is het inderdaad raar om " : " in de naam van de eigenschap te hebben opgenomen en dit kan inderdaad in sommige gevallen (macro of andere) een probleem zijn. Voorbeeld woning zonder:
Voor @Antoine_Ruelle bevestig ik dat de macro goed werkt op SW2023 (dus geen reden op 2022) zoals @Cyril_f ook zegt. Je kunt ook de oplossing van @Lynkoa15 proberen in de hoop dat het probleem deze keer niet optreedt.
Hallo, bedankt voor deze feedback @Maclane . Inderdaad, ik gebruik de revisie-eigenschap niet, ik realiseerde het me achteraf, omdat ik voor het opslaan in PDF/DWG dezelfde bestandsnaam heb als het SW-plan. Dus ik heb dit deel verwijderd. En ik heb nog steeds hetzelfde probleem, ik heb geen PDF/DWG
Voor de aanwijzing voerde hij met de hand in tekst een eigenschap van de kamer in die op de plattegrond wordt weergegeven. En nee, we gebruiken geen PDM
sbadenis - Voor wie is ": " Ik weet niet of dat echt het probleem is, want het werkte goed 2 keer op een rij. Vanmorgen heb ik een test gedaan zonder de ":" en ik kreeg weer de melding dat ik op lijn 118 een blok heb dat niet gedefinieerd is. Kunt u mij deze regel alstublieft uitleggen? " Stel swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors) in
Ik heb net weer een test gedaan voordat ik je antwoordde en het werkte
@Lynkoa15 Als ik het goed begrepen heb voor het mappad, moet ik ze als variabelen bepalen Const dxfSubFolder As String = "\dwg" Const pdfSubFolder As String = "\pdf" Const stepSubFolder As String = "\step" Om ze op te roepen in de opnamepaden?
In ieder geval bedankt voor je hulp, ik begin de VBA een beetje beter te begrijpen
Met deze regel kunt u een van de geopende documenten activeren in de stille modus (transparant voor de gebruiker).
Ja, het vereenvoudigt de code en roept variabelen aan in plaats van dezelfde tekst n keer in te voeren. En als u ooit besluit het pad te wijzigen, is het gemakkelijker om slechts één variabele te beheren dan om alle code te controleren.
Oké, dus waarom loopt de macro in sommige gevallen vast? Is het mogelijk dat het bestand al open is? Of dat hij het niet vindt?
En dus op welk niveau van de code moet ik de padvariabele specificeren om het te vertellen het pad van het betreffende bestand te nemen en "/pdf" toe te voegen om de juiste recordmap te hebben? Of welk deel van de code van de andere macro moet ik ophalen?
Ik heb net weer een test gedaan en het werkt niet, ik begrijp er niets meer van haha!! Hier is de code
Option Explicit
Public Enum swDocumentTypes_e
swDocNONE = 0 ' Used to be TYPE_NONE
swDocPART = 1 ' Used to be TYPE_PART
swDocASSEMBLY = 2 ' Used to be TYPE_ASSEMBLY
swDocDRAWING = 3 ' Used to be TYPE_DRAWING
End Enum
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim swConfig As SldWorks.Configuration
Dim vSheetNameArr As Variant
Dim vSheetName As Variant
Dim I As Long
Dim nDocType As Long
Dim op As Long
Dim suppr As Long
Dim lErrors As Long
Dim lWarnings As Long
Dim boolstatus As Boolean
Dim bRet As Boolean
Dim FileConnu As Boolean
Dim nbConnu As Integer
Dim sModelName As String
Dim sPathName As String
Dim TabConnu(10000) As String
Dim sConfigName As String
Const dxfSubFolder As String = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepSubFolder As String = "\step"
Sub Main()
Set swApp = Application.SldWorks
boolstatus = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Force la version AP214
boolstatus = swApp.SetUserPreferenceIntegerValue(swStepExportPreference, swAcisOutputGeometryPreference_e.swAcisOutputAsSolidAndSurface) 'Force l'export en format Solid/Surface Geometry
Set swModel = swApp.ActiveDoc
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en PDF
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".dwg", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en DWG
Call ExportStep ' Appelle le programe d'export STEP
End Sub
Function GetFilename(strPath As String) As String
Dim strTemp As String
strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)
End Function
Sub ExportStep() ' Vérification si c'est une piece ou un assemblage
Set swDraw = swModel
vSheetName = swDraw.GetSheetNames
vSheetNameArr = swDraw.GetSheetNames
For Each vSheetName In vSheetNameArr
bRet = swDraw.ActivateSheet(vSheetName): Debug.Assert bRet
Set swView = swDraw.GetFirstView 'Sélectionne le fond de plan
Set swView = swView.GetNextView 'Passe à la vue suivante pour exclure le fond de plan
While Not swView Is Nothing
' Determine si la vue est une pieces ou un assemblage
sModelName = swView.GetReferencedModelName
sModelName = LCase(sModelName)
sConfigName = swView.ReferencedConfiguration
FileConnu = False
If InStr(sModelName, "sldprt") > 0 Then
nDocType = swDocPART
ElseIf InStr(sModelName, "slasm") > 0 Then
nDocType = swDocASSEMBLY
Else
nDocType = swDocNONE
Exit Sub
End If
If nDocType = 1 Then
For I = 1 To nbConnu
If UCase(sModelName) & " - " & UCase(sConfigName) = TabConnu(I) Then
FileConnu = True
End If
Next
If Not FileConnu Then
nbConnu = nbConnu + 1
TabConnu(nbConnu) = UCase(sModelName) & " - " & UCase(sConfigName)
Call Export
End If
End If
Set swView = swView.GetNextView
Wend
Next vSheetName
End Sub
Sub Export()
Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors)
Set swModel = swApp.ActiveDoc
boolstatus = swModel.ShowConfiguration2(sConfigName)
Set swConfig = swModel.GetActiveConfiguration
sPathName = swModel.GetPathName & ".step"
If Dir(sPathName, vbHidden) <> "" Then 'Test l'existence du fichier
suppr = MsgBox("Le fichier " & sPathName & " existe déjà, voulez vous le supprimer?", vbYesNo) 'Message utilisateur confirmation de suppression oui/non
If suppr = vbYes Then 'Réponse Oui
Kill (sPathName) 'Suppression du fichier existant
swModel.SaveAs2 sPathName, 0, True, False 'Enregistrement du fichier
op = MsgBox("Le fichier a été enregistré sous " & sPathName & vbNewLine)
Else 'Réponse NON
MsgBox ("Fichier conservé") 'Message utilisateur
End If
Else
swModel.SaveAs2 sPathName, 0, True, False 'Enregistrement du fichier
op = MsgBox("Le fichier a été enregistré sous " & sPathName) 'Message utilisateur
End If
swApp.CloseDoc (sModelName)
Set swModel = swApp.ActiveDoc
End Sub
Probeer de bestanden te identificeren waarop de macro niet werkt (vooral als ze altijd hetzelfde zijn):
Verschillende wegen: De 3D en de lay-out bevinden zich niet in dezelfde map. 3D en blauwdruk hebben niet precies dezelfde naam. Een van de eigenschappen waar de macro naar op zoek is, bestaat niet. De doelbestanden (pdf/dwg en/of STEP) zijn al open of alleen-lezen... Bestands- en/of mapnamen hebben speciale tekens (accenten, punten,...)
Wees voorzichtig, ook macro's zijn gevoelig voor PAUZES... d.w.z. (om samen te vatten) ze maken onderscheid tussen kleine letters en hoofdletters) dit geldt voor bestandsnamen, maar ook voor extensies. …
het ideaal is om door uw macro te bladeren in stap-voor-stap modi (F8), met het venster met lokale variabelen zichtbaar, En eventueel met de muis over de variabelen in de regels code gaan om te controleren of ze de gevraagde gegevens ophalen. (vooral in "debug" node op breakpoints...
Subsidiaire vraag, hoe start je de macro uitvoering? een knop in solidworks of door de play-toets direct in de VBA-editor? Begin je macro altijd met de "Hoofd" routine?
Nou, ik keek, maar miste veel dingen om de submappen onder andere te maken. @Antoine_Ruelle , u had de door @sbadenis voorgestelde code getest (4e antwoord) die naar mijn mening perfect functioneel was?
Ja, en ik had een bericht overgeslagen, maar als ik je vraag of het werkt, antwoord je me met de vorige macro met de revisies. Neem de nieuwste versie zoals aangegeven door @Cyril_f en @Maclane en het zou moeten werken. Aan de andere kant, niet zeker of de code is geoptimaliseerd, wordt het haastig gedaan ten opzichte van die van @Cyril_f .
Ik heb altijd op hetzelfde bestand getest. de tekening van een pet. De tekening staat in een andere map dan de onderdelen, maar de bestanden hebben dezelfde naam.
Ik heb de code al bekeken door het stap voor stap te doen, en aangezien ik er niet al te veel van weet, weet ik niet hoe ik de problemen correct kan identificeren.
Om de macro te starten heb ik een knop gemaakt en ik heb het ook geprobeerd met de play toets.
Ja, voor de submappen heb ik op dit moment niets anders gedaan dan de 3 te definiëren variabelen plakken. Omdat ik elke keer probeer de code te laten werken. Ik heb de basiscode genomen zonder enige wijzigingen aan te brengen, behalve om de revisie in de bestandsnaam te verwijderen.
Het werkte een keer, ik verwijderde de gegenereerde bestanden en begon opnieuw en daar had ik de onderstaande fout
En nee, ik heb de code van het 4e antwoord nog niet getest @Cyril_f
Goed nieuws. Het enige dat overblijft is het valideren van het " Beste antwoord " om deze discussie af te sluiten.
En tot ziens voor nieuwe macro's... In de tussentijd raad ik je aan om verschillende sites te raadplegen (niet altijd in het Frans -Visual Basic- verplicht) maar vaak didactisch om aan de slag te gaan met programmeren: