SW2020 Makro / Probleme im VBA-Code

Hallo ihr alle

Als Designer/Redakteur von Beruf und ein kleiner Programmierer mit Leidenschaft habe ich mich stärker als ich mit VBA-Makrocodierung beschäftigt. 

Mein Ziel ist es, die Wiederherstellungsstange in allen Teilen einer Baugruppe absenken zu können. Zu diesem Zweck möchte ich, dass das Makro die Teile (mit oder ohne Bildschirmanzeige) nacheinander auswählt und öffnet und dann in der Fortsetzungsleiste im Baum nach unten bewegt und das Teil speichert. Wenn es in meinem Set eine Teilmenge geben sollte, möchte ich, dass er diese Teilmenge öffnet (wie bei den Teilen, mit Anzeige oder nicht) und die Teile nacheinander erneut öffnet, um den ersten Schritt erneut zu starten.

Hier ist ein kleines Diagramm:

SW ASSEMBLY-----> Teile und Ass öffnen (die nicht gelöscht werden) -------> Wenn es sich um ein Teil --------> handelt, dann gehen Sie in der Resume-Leiste nach unten + Speichern + Schließen

                                                                                                                                Ich

                                                                                                                                I-----> Wenn es sich um eine Baugruppe handelt, Machen Sie es wie in Feld 2

hier ist der Code und wo ich bin, es ist ein Code, den ich im Web gefunden habe, der aber anscheinend ein wenig "in Eile" in diesem Forum codiert wurde: https://forum.solidworks.com/thread/159206

Mein Code wurde so gut wie möglich korrigiert:                            Das Problem mit meinem Code ist, dass es überall Fehler gibt... Fehler 91, dann manchmal 13.... Ich bin verloren und bräuchte die Hilfe von einem von                                                                                       euch, der davon weiß!! Danke im Voraus;)

Dim swApp als SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim swModel1 als SldWorks.ModelDoc2

Dim swAssembly als SldWorks.AssemblyDoc

Dim CompNum As Integer

Dim CompNum1 als Ganzzahl

Komponenten als SldWorks.Component2 dimmen

Komponenten1 als SldWorks.Component2 dimmen

Dim-Komponente als SldWorks.Component2

Dim-Komponente1 als SldWorks.Component2

Sub main()


    Legen Sie swApp = Application.SldWorks fest

    Festlegen von swModel = swApp.ActiveDoc

    Legen Sie swAssembly = swModel fest
        
    ' Anzahl der Komponenten abrufen, ohne untergeordnete Komponenten in Unterbaugruppen

    CompNum = swAssembly.GetComponentCount(True)
    
    components = swAssembly.GetComponents(True)
    
    Dim i als Integer
    
    Für i = 0 Bis CompNum
 
        Komponente = Komponenten(i)

swModel1 = Komponente. GetModelDoc2 (Englisch)

          'Teil aus Baugruppenfunktion öffnen (wenn Unterbaugruppe, erstellen Sie eine weitere for-Schleife mit der gleichen Prozedur)

Wenn swModel1.GetType = swDocPART dann

   Legen Sie swModel = swApp.ActivateDoc3(-Komponente. Name2, False, swRebuildOnActivation_e.swUserDecision, 0)

    boolstatus = Teilen. FeatureManager.EditRollback(swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, "")
    boolstatus = Teilen. BearbeitenNeu aufbauen3()

swModel.SaveAs (Komponente. GetPathName)

 swApp.CloseDoc-Komponente. GetPathName (Englisch)

Festlegen von swModel = swApp.ActiveDoc

 ElseIf swModel1.GetType = swDocASSEMBLY Dann

CompNum1 = swModel1.GetComponentCount(Wahr)

components1 = swModel1.GetComponents(True)

    Sun j As Integer
    
    Für j = 0 TB CompNum1

            Komponente1 = Komponente1(j)

swModel1 = Komponente1. GetModelDoc2 (Englisch)


   Legen Sie swModel = swApp.ActivateDoc3(-Komponente. Name2, False, swRebuildOnActivation_e.swUserDecision, 0)

    boolstatus = Teilen. FeatureManager.EditRollback(swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, "")
    boolstatus = Teilen. BearbeitenNeu aufbauen3()
    

swModel.SaveAs (Komponente. GetPathName)

 swApp.CloseDoc-Komponente. GetPathName (Englisch)

Nächster

Ende, wenn

Nächster

Ende Sub

 

Hallo. Versuchen Sie Folgendes:

Option Explicit
Dim swApp As SldWorks.SldWorks
Sub main()
    Dim swModel As SldWorks.ModelDoc2
    Dim swConf As SldWorks.Configuration
    Dim swRootComp As SldWorks.Component2
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent3(True)
    TraverseComponent swRootComp
End Sub

Sub TraverseComponent(swComp As SldWorks.Component2)
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swCompConfig As SldWorks.Configuration
    Dim i As Long
    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp
    Next i
    RollBack swComp
End Sub

Sub RollBack(swComp As SldWorks.Component2)
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swComp.GetModelDoc2
    swApp.ActivateDoc3 swComp.Name2, False, swRebuildOnActivation_e.swRebuildActiveDoc, Empty
    If swModel.GetType <> swDocumentTypes_e.swDocPART Then Exit Sub
    swModel.FeatureManager.EditRollback swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, Empty
    swModel.EditRebuild3
    swModel.Save3 swSaveAsOptions_e.swSaveAsOptions_Silent, Empty, Empty
    swApp.CloseDoc swModel.GetPathName
End Sub

 

3 „Gefällt mir“

Hallo JeromP,

Ihr Code funktioniert einwandfrei!! Es ist kürzer als meins und verwendet Funktionen, soweit ich sehen kann, wo haben Sie die notwendigen Ressourcen gefunden, wenn es nicht zu aufdringlich ist?

In jedem Fall vielen Dank für Ihre schnelle und effiziente Hilfe!!  

Hallo @JeromeP ,

wirklich schönes Makro; Wäre es möglich, es so zu modifizieren, dass es die Blockierungsleiste hinuntergeht?

Wenn ja, öffne ich eine neue Frage zu dieser Frage?

@theo.hecht: Kein Problem. Den hier gefundenen Code habe ich angepasst: Traverse_Assembly_at_Component_and_Feature_Level_Example

@ac Cobra 427: Ich bin mir nicht sicher, was die Verriegelungsstange ist. Dieses Makro bewegt sich  in der Wiederherstellungsleiste nach unten. Ist die Blockierungsleiste eine andere als diese?

Bearbeiten: Ich habe gerade die Blockierungsleiste gefunden.

Um ihn zu senken, ersetzen Sie: swModel.FeatureManager.EditRollback swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, Leer

von: swModel.FeatureManager.EditFreeze2 swMoveFreezeBarTo_e.swMoveFreezeBarToEnd, Empty, True, True

 

Hallo

Die Blockleiste ist die gelbe Leiste, die in Bauteildateien zu finden ist, die zu verwendende Funktion ist EditFreeze2.

Herzliche Grüße

1 „Gefällt mir“

Ja, das habe ich gerade gesehen. Ich habe meine vorherige Antwort bearbeitet.

@JeromeP Vielen Dank ! :)

Herzliche Grüße

  @JeromeP ja, es ist eine Leiste, die die Funktionen sperrt, was die Rekonstruktion der Teile verhindert. Diese sparen Zeit beim Öffnen von ASMs. Auf der anderen Seite habe ich den Code-Schnipsel ersetzt und es funktioniert nicht. Ich werde eine Frage öffnen, damit es einfacher ist, wenn jemand nach dieser Art von Makro sucht