|   |   | 
  | Gut zu wissen: Hilfreiche Tipps und Tricks aus  der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | 
|   |   | 
  | InnovateNext 26. in Hamburg, eine Veranstaltung am 18.11.2025
  | 
| 
Autor
 | 
Thema:  Makro Bauteilkomponente löschen (764 /  mal gelesen)
 | 
 
                        TechNick Mitglied Konstrukteur
  
  
        Beiträge: 17 Registriert: 19.11.2018 
                         | 
                        
                         
                                                 
                        erstellt am: 11. Dez. 2024 08:44       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Hallo werte Gemeinde, Ich möchte mir ein Makro basteln, welches in einer Baugruppe alle Instanzen von Komponente "Trennboden" löscht. Die Beispielkomponente  „Trennboden“ kann ein in einem Fall ein Teil und ein anders Mal eine Unterbaugruppe sein. Meist kann ich mir mit meinen begrenzten Kenntnissen in VBA und der SWX  API etwas zusammenlügen, aber hier fehlt mir so ziemlich alles. Wäre schön, wenn mir jemand etwas Anschubhilfe geben kann.  Ich bedanke mich schonmal im Voraus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        nahe Ehrenmitglied  
      
  
        Beiträge: 1796 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac 
                         | 
                        
                         
                                                 
                        erstellt am: 11. Dez. 2024 09:23       <-- editieren / zitieren -->           Unities abgeben:            Nur für TechNick  
                         | 
                        
                        TechNick Mitglied Konstrukteur
  
  
        Beiträge: 17 Registriert: 19.11.2018 
                         | 
                        
                         
                                                 
                        erstellt am: 11. Dez. 2024 11:40       <-- editieren / zitieren -->           Unities abgeben:           
                         | 
                        
                        Heiko Soehnholz Ehrenmitglied V.I.P. h.c. Dipl.-Ing. (FH) Maschinenbau
 
  
  
        Beiträge: 5626 Registriert: 03.07.2002 SOLIDWORKS 2001 - 2025 Elite AE Award 2023 SOLIDWORKS Premium, 3DEXPERIENCE, Simu, Flow, Plastics, Composer, MBD, Inspection, PDMP, Visualize, TopsWorks, DPS Tools, JobBox, MacroSheet, etc. Passungstabelle von Heinz WIN11 24H2 | HP ZBook 17 Fury G8 
                         | 
                        
                         
                                                 
                        erstellt am: 11. Dez. 2024 16:34       <-- editieren / zitieren -->           Unities abgeben:            Nur für TechNick  
                        
  Moin, dafür extra ein Makro programmieren? Oder willst du es hundertfach ausführen? Ansonsten kann man es manuell in wenigen Sekunden per Filter im FeatureManager erledigen... ------------------ Einen schönen Gruß von Heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        TechNick Mitglied Konstrukteur
  
  
        Beiträge: 17 Registriert: 19.11.2018 
                         | 
                        
                         
                                                 
                        erstellt am: 12. Dez. 2024 12:39       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Moin, nochmal Danke an Heinz. Mit Hilfe des ersten Links bin ich auf folgenden Beitrag hier im Forum gestoßen. https://ww3.cad.de/foren/ubb/Forum2/HTML/033438.shtml#000004Das Beispiel habe ich auf das nötigste für meinen Anwendungsfall eingestampft, aber … -> siehe unten Zum Hintergrund: Ich hab ein Makro, welches ein Bauteil (Teil  oder Baugruppe) mehrfach in eine Baugruppe einfügt. Die Lage jedes einzelnen Bauteils werden mittels Excel auf Basis der Eingaben des Konstrukteurs berechnet. Gefällt dem Konstrukteur am Ergebnis im SWX etwas nicht, ändert er die Eingabedaten im Excel und drückt erneut den Button zum Platzieren der Bauteile. Bevor die Bauteile erneut eingefügt werden, müssen die vorhandenen Bauteile (alle Instanzen) natürlich gelöscht werden. Das Makro zum Einfügen der Bauteile gibt es mehrfach für verschiedenste Bauteile (Teil  oder Baugruppe) in entsprechend modifizierter Form. In diesem Makro soll nun der Aufruf einer Routine zum Löschen von Bauteilen vorangestellt werde. Und jetzt kommt das ABER: Meine Routine zum Löschen von Bauteilen funktioniert grundsätzlich, jedoch muss der Name der zu löschenden Komponente als Variable (CompName) an die Routine übergeben werden. Und an dieser Kleinigkeit komme ich gerade nicht weiter. Option Explicit Dim swApp As SldWorks.SldWorks Dim swPartDoc As ModelDoc2 Dim boolstatus As Boolean Dim CompName As String Sub main()     Set swApp = Application.SldWorks         Set swPartDoc = swApp.ActiveDoc         'CompName = "Trennboden"         Dim swRootComp As SldWorks.Component2     Set swRootComp = swPartDoc.ConfigurationManager.ActiveConfiguration.GetRootComponent         TraverseComponent swRootComp     End Sub Sub TraverseComponent(comp As SldWorks.Component2)         Dim vChildComps As Variant             vChildComps = comp.GetChildren         Dim i As Integer         For i = 0 To UBound(vChildComps)             Dim swChildComp As SldWorks.Component2         Set swChildComp = vChildComps(i)                  If swChildComp.Name2 Like "Trennboden*" Then             boolstatus = swPartDoc.Extension.SelectByID2(swChildComp.Name2, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)             swPartDoc.EditDelete         Else             TraverseComponent swChildComp         End If             Next     End Sub
  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        nahe Ehrenmitglied  
      
  
        Beiträge: 1796 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac 
                         | 
                        
                         
                                                 
                        erstellt am: 13. Dez. 2024 08:54       <-- editieren / zitieren -->           Unities abgeben:            Nur für TechNick  
                        
  Wenn ich Dich richtig verstehe sollte das reichen Sub TraverseComponent(comp As SldWorks.Component2, CompName as string) .... Aufruf mit TraverseComponent swRootComp, CompName Übrigens keine Ahnung ob das Auswirkungen hat Ich würde vorsichtig sein,  einzelne Elemente die man über eine Schleife durchläuft zu löschen. Weil man dadurch ja die Anzahl der zu durchlaufenden Elemente verändert Besser wäre es, die Elemente im Schleifendurchlauf zu markieren und  erst danach zu löschen. ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        TechNick Mitglied Konstrukteur
  
  
        Beiträge: 17 Registriert: 19.11.2018 
                         | 
                        
                         
                                                 
                        erstellt am: 17. Dez. 2024 11:24       <-- editieren / zitieren -->           Unities abgeben:           
                        
  Moin, Danke Heinz für den Hinweis. So in etwa hatte ich das auch schon im Blick, nur zunächst nicht konsequent umgesetzt. Nun funktioniert es … nur fast. Option Explicit Dim swApp As SldWorks.SldWorks Dim swPartDoc As ModelDoc2 Dim boolstatus As Boolean Dim CompName As String Sub main()     Set swApp = Application.SldWorks     Set swPartDoc = swApp.ActiveDoc     CompName = "Trennboden"     Dim swRootComp As SldWorks.Component2     Set swRootComp = swPartDoc.ConfigurationManager.ActiveConfiguration.GetRootComponent     TraverseComponent swRootComp, CompName End Sub Sub TraverseComponent(comp As SldWorks.Component2, CompName As String)     Dim vChildComps As Variant     vChildComps = comp.GetChildren     Dim i As Integer     For i = 0 To UBound(vChildComps)         Dim swChildComp As SldWorks.Component2         Set swChildComp = vChildComps(i)                 'If swChildComp.Name2 Like "Trennboden*" Then                               If swChildComp.Name2 = CompName Then             boolstatus = swPartDoc.Extension.SelectByID2(swChildComp.Name2, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)             swPartDoc.EditDelete         Else             TraverseComponent swChildComp, CompName         End If           Next End Sub Während die If-Anweisung mit: If swChildComp.Name2 Like "Trennboden*" Then Funktioniert, tut es die Anweisung: If swChildComp.Name2 = CompName Then nicht mehr. Darf ich nochmal um Hilfestellung bitten? Wie eingangs geschrieben, meine Kenntnisse in VBA und der SWX  API sind leider begrenzt
  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                        
                        nahe Ehrenmitglied  
      
  
        Beiträge: 1796 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac 
                         | 
                        
                         
                                                 
                        erstellt am: 17. Dez. 2024 14:45       <-- editieren / zitieren -->           Unities abgeben:            Nur für TechNick  
                        
  Hallo TechNick, Du verwendest auch zwei verschiedene Vergleichsmethoden ein mal "like"  ein mal "=" Wenn es mit like funktioniert würde ich einfach If swChildComp.Name2 like CompName & "*" verwenden ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP  | 
                       
   
 |  | 
 
                        TechNick Mitglied Konstrukteur
  
  
        Beiträge: 17 Registriert: 19.11.2018 
                         | 
                        
                         
                                                 
                        erstellt am: 17. Dez. 2024 15:15       <-- editieren / zitieren -->           Unities abgeben:           
                         |