| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: VBA: Stückliste mithilfe der Baugruppe erstellen (2727 mal gelesen)
|
Starbuzz Mitglied
Beiträge: 60 Registriert: 14.11.2014
|
erstellt am: 08. Jun. 2016 09:17 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe mir Codes zusammen gesucht und umgeschrieben, um bestimmte iProperties zu erstellen. Das klappt super. Ich drücke ein Button und mein Bauteil hat neue und ausgefüllte iProperties. Nun möchte ich aber, das er anhand der Informationen aus der Baugruppe mir eine Stückliste macht, also: Bezeichnung, Bauteilnummer, Fläche, Gewicht, Material, Menge...alle nach dem erwähnten VBA oben vorhanden! Ist das nur mithilfe einer Baugruppe, also ohne Zeichnung, möglich? Kann mir einer einen Ansatz geben? Excel Vorlage sieht folgendermaßen aus: Ab A3 (A4,A5,A6,...) -> Bezeichnung Ab B3 (B4,B5,B6...) ->Bauteilnummer usw. Ich möchte von euch nicht unbedingt ein fertiges. Aber ein Ansatz diesbezüglich wäre super! Das mit dem Abspeichern kriege ich z.B. schon hin
Grüße Starbuzz
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 08. Jun. 2016 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für Starbuzz
Hallo Starbuzz, ich weiß nicht, ob ich dich jetzt einfach nur nicht verstehe, oder ich vielleicht zu einfach denke. Du möchtest die iProperties der einzelnen Bauteile in deiner Baugruppe in einer Excel-Liste ausgeben? Dazu hätte ich folgenden Ansatz: Code: Public Sub props() Dim oAssDoc As AssemblyDocument Set oAssDoc = ThisApplication.ActiveDocumentDim oPartDoc As ComponentOccurrence Dim oSubdoc As PartDocument Dim oExcel As Excel.Application Set oExcel = GetObject(, "Excel.Application") '<---- wenn Excel schon offen. Sonst : set oExcel=createobject("Excel.Application") Dim oWorkbook As Excel.workbook Set oWorkbook = oExcel.Workbooks.Item(1) '<--- wenn Excel neu geöffnet : set oWorkbook=oExcel.Workbooks.Open("PFAD") Dim i As Integer Dim q As Integer Dim oPropSet As propertyset Dim oProp As Property i = 4 For Each oPartDoc In oAssDoc.ComponentDefinition.Occurrences oSubdoc = ThisApplication.Documents.Open(oPartDoc.ReferencedDocumentDescriptor.FullDocumentName) Set oPropSet = oSubdoc.PropertySets("DAS IN DEINEM FALL RICHTIGE EINSETZEN") For Each oProp In oPropSet With oWorkbook.ActiveSheet If oProp.Name = "Bezeichnung" Then .Cells(i, 1).Value = oProp.Value '<--- Zelle (A,4) ElseIf oProp.Name = "Bauteilnummer" Then .Cells(i, 2).Value = oProp.Value '<---- Zelle (B,4) End If End With Next oWorkbook.Save oSubdoc.Close i = i + 1 Next End Sub
------------------ MFG Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Starbuzz Mitglied
Beiträge: 60 Registriert: 14.11.2014
|
erstellt am: 09. Jun. 2016 08:21 <-- editieren / zitieren --> Unities abgeben:
Hallo, vielen Dank für deine Antwort. Also ich möchte eine Excel Stückliste von einer Baugruppe haben, mit Bezeichnung, Gewicht etc. der darin enthaltenden Bauteile. Ich habe deinen Code versucht. Anfangs hatte ich das Problem, das ich unter Verweise die Microsoft excel object library nicht ausgewählt hatte. Aber nun kommt die Fehlermeldung bei "oSubdoc = ThisApplication.Documents.Open(oPartDoc.ReferencedDocumentDescriptor.FullDocumentName)" => "Fehler beim Kompilieren. Unzulässige Verwendung einer Eigenschaft". Was hat das genau zu bedeuten? Ist das nicht richtig definiert oder so? Wäre nett wenn du mir da noch helfen könntest... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Big-Daddy Mitglied Konstrukteur
Beiträge: 51 Registriert: 08.04.2015 IV 2022 Prof.
|
erstellt am: 09. Jun. 2016 16:19 <-- editieren / zitieren --> Unities abgeben: Nur für Starbuzz
|
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 10. Jun. 2016 10:37 <-- editieren / zitieren --> Unities abgeben: Nur für Starbuzz
Versuchs mal indem du die Zeile Hiermit ersetzt. Code: oSubdoc = ThisApplication.Documents.Open(oPartDoc.ReferencedDocumentDescriptor.FullDocumentName,False)
Mit dem False am Ende wird die Datei unsichtbar geöffnet. Habe ich im Code oben vergessen. Vielleicht behebt das schon den Fehler. ------------------ MFG Chris Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
metalgod Mitglied Technischer Zeichner, Mädchen für alles
Beiträge: 32 Registriert: 23.09.2015 Win10x64 Prof. Intel Core i7-8700K 3,70GHz, 16GB Ram Inventor Prof. 2018 64-Bit Visual Studio 2015 Express
|
erstellt am: 10. Jun. 2016 14:10 <-- editieren / zitieren --> Unities abgeben: Nur für Starbuzz
Hallo Starbuzz, Zitat: oSubdoc = ThisApplication.Documents.Open(oPartDoc.ReferencedDocumentDescriptor.FullDocumentName)
Fehlt da nicht die "Set"-Anweisung? Mit der Zeile bekommt man eine Fehlermeldung, falls man auf eine Unterbaugruppe stößt, da oSubdoc als PartDocument und nicht als AssemblyDocument deklariert ist. Man könnte oSubdoc als Document deklarieren, das wird für beide gelten. Hier habe ich auch eine rekursive Methode eingefügt, sodass auch die Unterbaugruppen aufgelistet werden: Code: Option ExplicitPublic Sub ExcelBG() '' Quell-Baugruppe: Dim oberDok As AssemblyDocument Set oberDok = ThisApplication.ActiveDocument '' Neue Excel-Instanz erstellen: Dim XL As New Excel.Application '' Neue Excel-Arbeitsmappe erstellen: Dim WB As Workbook Set WB = XL.Workbooks.Add() '' Aktuelle Tabelle: Dim WS As WorkSheet Set WS = WB.ActiveSheet '' Startzelle auswählen: Dim StartZelle As Range Set StartZelle = WS.Cells(2, 4) '' Aktion: Call Rekurs(oberDok.ComponentDefinition.Occurrences, coll, WS, StartZelle, 0) '' Excel sichtbar machen: XL.Visible = True 'evtl. Header einfügen und / oder Excel-Arbeitsmappe speichern. End Sub Private Sub Rekurs(ByVal Occs As ComponentOccurrences, ByVal coll As ObjectCollection, ByRef WS As WorkSheet, ByRef RNG As Range, ByRef i As Integer) Dim Occ As ComponentOccurrence For Each Occ In Occs *** '' Bezug auf Dokument: Dim D As Document Set D = Occ.Definition.Document i = i + 1 '' Zellen mit Properties füllen: WS.Cells(RNG.row + i, RNG.Column + 0) = i WS.Cells(RNG.row + i, RNG.Column + 1) = D.PropertySets("{32853F0F-3444-11D1-9E93-0060B03C1CA6}").ItemByPropId(29).value 'Bezeichnung WS.Cells(RNG.row + i, RNG.Column + 2) = D.PropertySets("{32853F0F-3444-11D1-9E93-0060B03C1CA6}").ItemByPropId(5).value 'Bauteilnummer WS.Cells(RNG.row + i, RNG.Column + 3) = "Masse-property" WS.Cells(RNG.row + i, RNG.Column + 4) = "bla-bla-property" '' Bei Baugruppen wird Sub erneut aufrufen: If Occ.SubOccurrences.Count > 0 Then Call Rekurs(Occ.SubOccurrences, coll, WS, RNG, i) End If Next End Sub
*** Damit noch Sub fehlerfrei läuft, sollte man hier noch eine If-Schleife einfügen, die Elemente, die evtl. keinen Dokument haben auslässt. Das können Schweißelemente, unterdrückte Elemente, Elemente die Fehlen o.ä. sein. (folgende Stichpunkte sollen dabei behilflich sein: ComponentOccurrence.IsSubstituteOccurrence, ComponentOccurrence.Suppressed, ObjectTypeEnum.kWeldsComponentDefinitionObject, ReferenceStatusEnum.kMissingReference) ------------------ alex [Diese Nachricht wurde von metalgod am 10. Jun. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Chris 31 Mitglied Konstrukteur und Mädchen für alles
Beiträge: 575 Registriert: 23.04.2013 Inventor 2013/2015 Windows 7 64 bit 16GB RAM nVidia Quadro 600
|
erstellt am: 14. Jun. 2016 08:49 <-- editieren / zitieren --> Unities abgeben: Nur für Starbuzz
|
Starbuzz Mitglied
Beiträge: 60 Registriert: 14.11.2014
|
erstellt am: 14. Jun. 2016 10:49 <-- editieren / zitieren --> Unities abgeben:
|
Starbuzz Mitglied
Beiträge: 60 Registriert: 14.11.2014
|
erstellt am: 22. Jun. 2016 10:55 <-- editieren / zitieren --> Unities abgeben:
Da melde ich mich mal wieder Also ich habe das erste Beispiel getestet und nun hat es geklappt! Zwei Fragen habe ich aber noch: 1)Kann man die Propertie-Eigenschaften, oder wie sie sich nennen, zusammenfassen? Ich habe z.B. Set oPropSet = oSubdoc.PropertySets("Inventor User Defined Properties") Aber ich möchte auch, das er die "Design Tracking Properties" nutzt. 2)Wie kann ich das definieren, das er beim 2. Bauteil z.B. ab Zelle A5 weiter macht?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
metalgod Mitglied Technischer Zeichner, Mädchen für alles
Beiträge: 32 Registriert: 23.09.2015 Win10x64 Prof. Intel Core i7-8700K 3,70GHz, 16GB Ram Inventor Prof. 2018 64-Bit Visual Studio 2015 Express
|
erstellt am: 23. Jun. 2016 08:40 <-- editieren / zitieren --> Unities abgeben: Nur für Starbuzz
Hallo Starbuzz, Zitat: 1)Kann man die Propertie-Eigenschaften, oder wie sie sich nennen, zusammenfassen?
Durch Umwege schon (z.B. man könnte ObjectCollection anlegen und diese mit Properties aus PropertySets füllen, hat aber wenig Sinn). Nachem die Properties zusammengefasst werden, wie soll es dann weitergehen?
Zitat: 2)Wie kann ich das definieren, das er beim 2. Bauteil z.B. ab Zelle A5 weiter macht?
Damit werden beim 2. Bauteil 3 Zeilen übersprungen:
Code: If i = 2 Then i = i + 3 End If
------------------ alex Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Starbuzz Mitglied
Beiträge: 60 Registriert: 14.11.2014
|
erstellt am: 27. Jun. 2016 10:27 <-- editieren / zitieren --> Unities abgeben:
Naja ich habe bereits vorhandene Properties (Design Tracking Properties) und einmal die selbsterstellten (nventor User Defined Properties). Ich möchte das er bei dem VBA Code durch beide möglichen Propertie Eigenschaften nach Properties X usw. sucht. Also: Set oPropSet = oSubdoc.PropertySets("Inventor User Defined Properties") Oder Set oPropSet = oSubdoc.PropertySets("Design Tracking Properties") -------------------------------------------------------- Außerdem, gibt es ein Befehl o.ä. bei dem er Bauteile nicht doppelt aufzählt? Z.B. Schrauben?
Vielen Dank aber auf jeden Fall schonmal für alles hier
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
metalgod Mitglied Technischer Zeichner, Mädchen für alles
Beiträge: 32 Registriert: 23.09.2015 Win10x64 Prof. Intel Core i7-8700K 3,70GHz, 16GB Ram Inventor Prof. 2018 64-Bit Visual Studio 2015 Express
|
erstellt am: 28. Jun. 2016 14:01 <-- editieren / zitieren --> Unities abgeben: Nur für Starbuzz
Ich persönlich würde direkten Verweis auf die iProperties, die man braucht, einer Suche alleine aus Leistungsgründen vorziehen. Zitat: Außerdem, gibt es ein Befehl o.ä. bei dem er Bauteile nicht doppelt aufzählt? Z.B. Schrauben?
Man könnte eine Collection anlegen, in welche als Key ein Wert gespeichert wird, der jedes Bauteil eindeutig identifiziert z.B. Zeichnungsnummer oder besser kompletten Dokumentpfad. Beim durchlaufen der Bauteile kann es geprüft werden, ob Bauteilpfad in der Collection vorhanden ist oder nicht. Es kommt etwas spät, aber um Stückliste zu erstellen ist BOM besser geeignet.
Code: Private Sub BOM_Test() Dim oDok As AssemblyDocument Set oDok = ThisApplication.ActiveDocument Dim oBOM As BOM Set oBOM = oDok.ComponentDefinition.BOM '' Stücklistenansicht "Strukturiert" aktivieren, falls deaktiviert: If Not oBOM.StructuredViewEnabled Then oBOM.StructuredViewEnabled = True '' "Alle Ebenen" aktivieren: If oBOM.StructuredViewFirstLevelOnly Then oBOM.StructuredViewFirstLevelOnly= False '' Bezug auf Stücklistenansicht "Strukturiert": Dim bView As BOMView Set bView = oBOM.BOMViews.Item("Strukturiert") '' Alle Zeilen durchlaufen und Bezug auf referenziertes Dokument setzen: Dim aktRow As BOMRow For Each aktRow In bView.BOMRows Dim CD As ComponentDefinition Set CD = aktRow.ComponentDefinitions(1) Dim D As Document Set D = CD.Document Debug.Print aktRow.ItemNumber & " " & D.FullFileName Next End Sub
------------------ alex [Diese Nachricht wurde von metalgod am 29. Jun. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Joe25 Mitglied
Beiträge: 20 Registriert: 02.06.2016
|
erstellt am: 08. Jul. 2016 09:00 <-- editieren / zitieren --> Unities abgeben: Nur für Starbuzz
Guten Morgen, ich würde gern die Strukturierte und die Bauteile Stückliste einer Baugruppe in die gleiche Excel Datei speichern. Tabellenblatt 1 = Strukturiert Tabellenblatt 2 = Bauteile Ist das auch Möglich ohne die BOM. Also die einzelnen Zellen nur mit Iproperties zu füllen (wie oben). Bisher mache ich dies über Ilogic und zwei getrennte Excel Dateien, aber Ilogic exportiert mir ja die Reihenfolge der BOM nicht exakt wie ich sie in der Baugruppe definiere. Ich dachte mit VBA könnte ich alle Probleme auf einmal erschlagen. Die Excel Datei würde ich gern auf ein anderes Laufwerk speichern. Hat mir jemand ein Ansatz? Ich steh grad voll auf dem Schlauch. [Diese Nachricht wurde von Joe25 am 08. Jul. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|