Ich trockne auch! Können Sie das Makro bearbeiten, die Fenster "Ausführung" und "Lokale Variablen" hinzufügen (siehe Bild), dann direkt nach Sub main() klicken und F8 drücken, damit es Fehler macht?
Grundsätzlich wird das Makro Schritt für Schritt zerrissen. Und überprüfen Sie im lokalen Variablenfenster den Wert von sModelName, wenn es abstürzt:
Ich habe gerade Tests wiederholt, indem ich den Basiscode kopiert habe, und es funktioniert nicht jedes Mal ... Ich habe 5 Tests gemacht und ich hatte 2 Male, in denen es gut funktioniert, andere, bei denen ich das PDF / DWG nicht habe, oder es einfach nicht startet!
Ich verstehe nicht, warum es nicht jedes Mal funktioniert!
Ansonsten brauche ich theoretisch den Dateipfad nicht mehr zu ändern
Hallo; @Antoine_Ruelle , Wenn Sie sich Ihr MEP genauer ansehen, sieht es so aus, als würden Sie die Eigenschaft " Revision " nicht verwenden. Dies erklärt den folgenden Fehler:
Der " A " -Index in Ihrem MEP scheint nur Text zu sein...
Darüber hinaus haben Ihre Eigenschaften in Ihrer SLDPRT-Datei das folgende Format: " Text: " (Ich glaube nicht, dass die Verwendung von " : " in diesem Zusammenhang angemessen ist.
Guten Abend Ja, es geht zur Funktion, um die Dateinamensinformationen abrufen zu können, indem die Erweiterung entfernt wird. So wie es aussieht, funktioniert der von @sbadenis angebotene Code auf SW2022.
Hallo @tous Antoine schaut sich in der Zwischenzeit dieses Makro an, Löscht die Zeilen 4 und 5 nach " sub main ". Und Weist den genauen Namen der Revisionseigenschaft anstelle von " Hinweis " zu
In der Tat, @Maclane den Überarbeitungsteil betrifft, habe ich auch darüber nachgedacht, daher die Änderung, die ich mit der Entfernung dieser Eigenschaft und dem Hinzufügen von Ordnern vorgeschlagen hatte. Bei Immobilien ist es in der Tat seltsam, " : " in den Namen der Eigenschaft aufgenommen zu haben, und dies könnte in einigen Fällen (Makro oder andere) tatsächlich ein Problem sein. Beispielhafte Eigenschaft ohne:
Für @Antoine_Ruelle bestätige ich, dass das Makro auf SW2023 gut funktioniert (also kein Grund auf 2022), wie @Cyril.f auch sagt. Sie können auch die Lösung von @Lynkoa15 ausprobieren und hoffen, dass das Problem dieses Mal nicht auftritt.
Hallo, vielen Dank für dieses Feedback @Maclane . In der Tat verwende ich die Revisionseigenschaft nicht, ich habe es im Nachhinein erkannt, weil ich für das Speichern in PDF/DWG den gleichen Dateinamen wie der SW-Plan habe. Also habe ich diesen Teil entfernt. Und ich habe immer noch das gleiche Problem, ich habe kein PDF/DWG
Für den Hinweis trug er sich handschriftlich in eine Eigenschaft des Raumes ein, die auf dem Plan dargestellt ist. Und nein, wir verwenden kein PDM
sbadenis - Für wen ist ": " Ich weiß nicht, ob das wirklich das Problem ist, denn es hat 2 Mal hintereinander gut funktioniert. Heute Morgen habe ich einen Test ohne das ":" gemacht und ich habe wieder die Meldung bekommen, dass ich in Zeile 118 einen Block habe, der nicht definiert ist. Können Sie mir bitte diesen Satz erklären? " Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors) "
Ich habe gerade noch einmal einen Test gemacht, bevor ich Ihnen geantwortet habe, und es hat funktioniert
@Lynkoa15 Wenn ich den Ordnerpfad richtig verstanden habe, muss ich sie als Variablen bestimmen Const dxfSubFolder As String = "\dwg" Const pdfSubFolder As String = "\pdf" Const stepUnterordner als Zeichenfolge = "\schritt" Um sie in den Aufzeichnungspfaden aufzurufen?
Auf jeden Fall vielen Dank für Ihre Hilfe, ich fange an, die VBA ein wenig besser zu verstehen
Diese Zeile ermöglicht es Ihnen, eines der geöffneten Dokumente im unbeaufsichtigten Modus (für den Benutzer transparent) zu aktivieren.
Ja, es vereinfacht den Code und ruft Variablen auf, anstatt den gleichen Text n-mal einzugeben. Und wenn Sie sich jemals entscheiden, den Pfad zu ändern, ist es einfacher, nur eine Variable zu verwalten, als den gesamten Code zu überprüfen.
Okay, warum bleibt das Makro in manchen Fällen daran hängen? Ist es möglich, dass die Datei bereits geöffnet ist? Oder dass er es nicht findet?
Auf welcher Ebene des Codes sollte ich also die Pfadvariable angeben, um ihr mitzuteilen, dass sie den Pfad der betreffenden Datei annehmen und "/pdf" hinzufügen soll, um den richtigen Datensatzordner zu haben? Oder welchen Teil des Codes aus dem anderen Makro muss ich abrufen?
Ich habe gerade wieder einen Test gemacht und es funktioniert nicht, ich verstehe nichts mehr haha!! Hier ist der 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
Versuchen Sie, die Dateien zu identifizieren, bei denen das Makro nicht funktioniert (insbesondere wenn sie immer gleich sind):
Mehrere Wege: Das 3D und das Layout befinden sich nicht im selben Verzeichnis. 3D und Blueprint haben nicht genau den gleichen Namen. Eine der Eigenschaften, nach denen das Makro sucht, ist nicht vorhanden. Die Zieldateien (pdf/dwg und/oder STEP) sind bereits geöffnet oder schreibgeschützt... Datei- und/oder Verzeichnisnamen haben Sonderzeichen (Akzente, Punkte,...)
Seien Sie vorsichtig, auch Makros reagieren empfindlich auf BREAKS... d.h. (zusammenfassend lässt sich sagen) wird zwischen Klein- und Großbuchstaben unterschieden) dies gilt sowohl für Dateinamen als auch für Erweiterungen. …
Ideal ist es, Ihr Makro Schritt für Schritt (F8) zu durchsuchen, wobei das Fenster für lokale Variablen sichtbar ist. und fahren Sie möglicherweise mit der Maus über die Variablen in den Codezeilen, um zu überprüfen, ob sie die von ihnen angeforderten Daten abrufen. (insbesondere im "debug"-Knoten an Haltepunkten...
Nebenfrage, wie starten Sie die Makroausführung? eine Schaltfläche in SOLIDWORKS oder über die Play-Taste direkt im VBA-Editor? Starten Sie das Makro immer mit der Routine "Main"?
Nun, ich habe aber viele Dinge vermisst, um unter anderem die Unterordner zu erstellen. @Antoine_Ruelle , Sie haben den von @sbadenis vorgeschlagenen Code (4. Antwort) getestet, der meiner Meinung nach perfekt funktionierte?
Ja und ich hatte eine Nachricht übersprungen, aber wenn ich Sie frage, ob es funktioniert, antworten Sie mir mit dem vorherigen Makro mit den Überarbeitungen. Nehmen Sie die neueste Version, wie durch @Cyril.f und @Maclane angegeben, und sie sollte funktionieren. Auf der anderen Seite, nicht sicher, ob der Code optimiert ist, wird er in Eile von dem von @Cyril.f .
Ich habe immer mit der gleichen Datei getestet. das Zeichnen einer Mütze. Die Zeichnung befindet sich in einem anderen Ordner als die Teile, aber die Dateien haben denselben Namen.
Ich habe mir den Code bereits Schritt für Schritt angesehen, und da ich nicht allzu viel darüber weiß, weiß ich nicht, wie ich die Probleme richtig identifizieren soll.
Um das Makro zu starten, habe ich eine Schaltfläche erstellt und es auch mit der Play-Taste versucht.
Ja, für die Unterordner habe ich im Moment nichts anderes getan, als die 3 zu definierenden Variablen eingefügt zu haben. Denn ich versuche, den Code jedes Mal zum Laufen zu bringen. Ich habe den Basiscode genommen, ohne Änderungen vorzunehmen, außer die Revision im Dateinamen zu entfernen.
Es hat einmal funktioniert, ich habe die generierten Dateien gelöscht und neu gestartet und dort hatte ich den folgenden Fehler
Und nein, ich habe den Code der 4. Antwort noch nicht getestet @Cyril.f
Gute Nachricht. Alles, was bleibt, ist, die " Beste Antwort " zu validieren, um diese Diskussion zu schließen.
Und bis bald für neue Makros... In der Zwischenzeit rate ich Ihnen, verschiedene Websites zu konsultieren (nicht immer auf Französisch -Visual Basic- verpflichtet), aber oft didaktisch, um in die Programmierung einzusteigen: