| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Makro nur in der Baugruppe ausführen (633 / mal gelesen)
|
Kath878 Mitglied Konstrukteur
Beiträge: 12 Registriert: 31.08.2018 Inventor 2021, Vault 2021
|
erstellt am: 16. Mai. 2022 12:26 <-- editieren / zitieren --> Unities abgeben:
Hallo liebes Forum, kann mir jemand helfen, diesen Code anzupassen? Es funktioniert sehr gut, jedoch möchte ich, dass dieser nur in der Baugruppe ausgeführt wird, nicht beim Speichern einer Datei. Da kommt immer ein Fehler, weil er ein Problem hiermit hat: Set oDoc = ThisApplication.ActiveDocument Meine VBA-Kenntisse sind leider nicht besonders. Public Sub BOMSort() ' Set a reference to the assembly document. ' This assumes an assembly document is active__Setzen Sie einen Verweis auf das Baugruppendokument. ' Dies setzt voraus, dass ein Baugruppendokument aktiv ist. Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument ' Set a reference to the BOM___Setzen Sie einen Verweis auf die Stückliste Dim oBOM As BOM Set oBOM = oDoc.ComponentDefinition.BOM Dim FirstLevelOnly As Boolean 'If MsgBox("First level only?", vbYesNo) = vbYes Then ' FirstLevelOnly = True ' Else ' FirstLevelOnly = False ' End If ' Make sure that the structured view is enabled___Stellen Sie sicher, dass die strukturierte Ansicht aktiviert ist. oBOM.StructuredViewEnabled = True
' Set a reference to the "Structured" BOMView___Setzen Sie einen Verweis auf die „Structured“ BOMView Dim oStructuredBOMView As BOMView Set oStructuredBOMView = oBOM.BOMViews.Item("Strukturiert") Call oStructuredBOMView.Sort("Bauteilnummer") Call oStructuredBOMView.Renumber(1, 1) ' Set a reference to the "onlyParts" BOMView__Setzen Sie einen Verweis auf die BOMView "onlyParts". Dim oonlyPartsBOMView As BOMView Set oonlyPartsBOMView = oBOM.BOMViews.Item("nur Bauteile") Call oonlyPartsBOMView.Sort("Bauteilnummer") Call oonlyPartsBOMView.Renumber(1, 1) End Sub Danke
------------------ Gruß Kathrin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 16. Mai. 2022 13:10 <-- editieren / zitieren --> Unities abgeben: Nur für Kath878
Hallo Ergänz mal diese Zeile: Code:
Public Sub BOMSort()'##################Schnipp########### If Not ThisApplication.ActiveDocument.DocumentType = kAssemblyDocumentObject Then Exit Sub '##################Schnipp########### ' Set a reference to the assembly document.
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kath878 Mitglied Konstrukteur
Beiträge: 12 Registriert: 31.08.2018 Inventor 2021, Vault 2021
|
erstellt am: 16. Mai. 2022 14:12 <-- editieren / zitieren --> Unities abgeben:
Dankeschön. hab es hier eingefügt ' Set a reference to the BOM___Setzen Sie einen Verweis auf die Stückliste Dim oBOM As BOM Set oBOM = oDoc.ComponentDefinition.BOM If Not ThisApplication.ActiveDocument.DocumentType = kAssemblyDocumentObject Then Exit Sub Ich hoffe, das war richtig. ------------------ Gruß Kathrin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 16. Mai. 2022 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für Kath878
Hallo Äh nö. Das muss ganz nach oben. Sonst steigt dein Code bereits bei
Code: Set oDoc = ThisApplication.ActiveDocument
aus. Die Abfrage des Dokumententyps direkt an den Anfang der Sub. Wie löst du beim Speichern ein VBA Makro aus? Auto-Makros sollten in VBA schon seit Jahren nicht mehr funktionieren. ------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kath878 Mitglied Konstrukteur
Beiträge: 12 Registriert: 31.08.2018 Inventor 2021, Vault 2021
|
erstellt am: 16. Mai. 2022 14:59 <-- editieren / zitieren --> Unities abgeben:
So richtig? Wie gesagt meine Kenntnisse sind hierzu nicht besonders gut. Public Sub BOMSort() ' Set a reference to the assembly document. ' This assumes an assembly document is active__Setzen Sie einen Verweis auf das Baugruppendokument. ' Dies setzt voraus, dass ein Baugruppendokument aktiv ist. If Not ThisApplication.ActiveDocument.DocumentType = kAssemblyDocumentObject Then Exit Sub Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument Ich lass den Makro über eine Regel ausführen InventorVb.RunMacro("Anwendungsprojekt", "StücklisteSortieren", "BOMSort") ------------------ Gruß Kathrin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 16. Mai. 2022 15:54 <-- editieren / zitieren --> Unities abgeben: Nur für Kath878
Da wird die Zeile ihren Zweck erfüllen. Mir stellt sich die Frage, warum sie nötig ist. Im Ereignisauslöser kann man die Regel so definieren, dass sie nur bei Assemblies ausgeführt wird. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 16. Mai. 2022 16:09 <-- editieren / zitieren --> Unities abgeben: Nur für Kath878
Hallo Jepp, passt. Über iLogic ein VBA Makro aufrufen ist nur so mittelprächtig. Es wäre besser das bei Gelegenheit mal komplett in iLogic zu übertragen. Macht der Kollege KraBBy mit mehr Freizeit sicher mal die nächsten Tage und erklärt dir auch gleich wie du deinen Ereignisauslöser richtig auswählst.
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kath878 Mitglied Konstrukteur
Beiträge: 12 Registriert: 31.08.2018 Inventor 2021, Vault 2021
|
erstellt am: 16. Mai. 2022 16:14 <-- editieren / zitieren --> Unities abgeben:
Danke vielmals. Die Regel ist eigentlich bei den Ereignisauslösern, nur bei der Baugruppe "vor dem Speichern aktiviert". Für mich sind das alles halbe bis ganze böhmische Dörfer. Ich bin schon froh, wenn ich ein Makro finde und es irgendwie zum laufen kriege. Winzige Anpassungen bekomme ich hin, dann aber hört es auf. Das wäre natürlich ein Traum ... Über iLogic ein VBA Makro aufrufen ist nur so mittelprächtig. Es wäre besser das bei Gelegenheit mal komplett in iLogic zu übertragen. Macht der Kollege KraBBy mit mehr Freizeit sicher mal die nächsten Tage und erklärt dir auch gleich wie du deinen Ereignisauslöser richtig auswählst.
------------------ Gruß Kathrin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 16. Mai. 2022 17:30 <-- editieren / zitieren --> Unities abgeben: Nur für Kath878
na wenn mich Ralf schon einteilt Hier der Code in iLogic
Code: ' für Assembly-Dokumente, BOM ' Strukturiert UND nurBauteile wird aktiviert ' je sortiert nach BauteilNr. ' neu nummeriert ' ' übertragen von VBA nach iLogic Const bDebug As Boolean = True 'KraBBy: Schalter, um einige Meldungen in dieser Regel etc. Zentral ein/auszuschalten
'KraBBy: Dateiname merken (wird für Meldungen benutzt) Dim sFileName As String = ThisDoc.FileName(False)
'DokumentTyp prüfen If Not TypeOf ThisDoc.Document Is AssemblyDocument Then If bDebug Then MsgBox("falscher Doc-Type" & vbCrLf & sFileName, vbOKOnly, "BOMSort - Abbruch") Exit Sub End If 'ThisDoc.Document verwendet statt 'ThisApplication.ActiveDocument ' weil die Regel ggf. auch bei untergeordneten Bgr. ausgeführt wird/werden soll ' (ThisDoc liefert das Document, in dem die Regel gerade läuft) ' Set a reference to the assembly document. ' This assumes an assembly document is active__Setzen Sie einen Verweis auf das Baugruppendokument. ' Dies setzt voraus, dass ein Baugruppendokument aktiv ist. Dim oDoc As AssemblyDocument = ThisDoc.Document 'KraBBy: Set entfernt und auf 1 Zeile zusammengezogen ' Set a reference to the BOM___Setzen Sie einen Verweis auf die Stückliste Dim oBOM As BOM = oDoc.ComponentDefinition.BOM 'Dim FirstLevelOnly As Boolean 'If MsgBox("First level only?", vbYesNo) = vbYes Then ' FirstLevelOnly = True ' Else ' FirstLevelOnly = False ' End If ' Make sure that the structured view is enabled___Stellen Sie sicher, dass die strukturierte Ansicht aktiviert ist. oBOM.StructuredViewEnabled = True
' Set a reference to the "Structured" BOMView___Setzen Sie einen Verweis auf die „Structured“ BOMView Dim oStructuredBOMView As BOMView oStructuredBOMView = oBOM.BOMViews.Item("Strukturiert") 'KraBBy: kann man auch 2zeilig stehen lassen; dann muss nur das "Set" weg Call oStructuredBOMView.Sort("Bauteilnummer") Call oStructuredBOMView.Renumber(1, 1) 'KraBBy: Call wäre nicht nötig, stört (mich) aber auch nicht 'KraBBy hinzu: "nur Bauteile" ggf. aktivieren oBOM.PartsOnlyViewEnabled = True ' Set a reference to the "onlyParts" BOMView__Setzen Sie einen Verweis auf die BOMView "onlyParts". Dim oonlyPartsBOMView As BOMView oonlyPartsBOMView = oBOM.BOMViews.Item("nur Bauteile") Call oonlyPartsBOMView.Sort("Bauteilnummer") Call oonlyPartsBOMView.Renumber(1, 1 ) If bDebug Then MsgBox("Fertig" & vbCrLf & sFileName, vbOKOnly, "BOMsort")
Hat in meinem kleinen Test als externe Regel funktioniert. Nach dem ausprobieren kannst Du die erste Codezeile ändern auf Const bDebug As Boolean = False ' statt True Dann kommen keine MsgBoxen mehr. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 16. Mai. 2022 17:54 <-- editieren / zitieren --> Unities abgeben: Nur für Kath878
Jetzt bin ich noch über einen Fehler gestolpert. In einer leeren Bgr. (ohne Komponenten) schlägt die Regel fehl. Der Aufruf von ...BOMView.Renumber( klappt nicht. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 16. Mai. 2022 18:57 <-- editieren / zitieren --> Unities abgeben: Nur für Kath878
jetzt schaut mein Vorschlag etwas anders aus Code: ' für Assembly-Dokumente, BOM ' Strukturiert UND nurBauteile wird aktiviert ' je sortiert nach BauteilNr. ' neu nummeriert ' ' übertragen von VBA nach iLogicClass ThisRule Const bDebug As Boolean = True 'KraBBy: Schalter, um einige Meldungen in dieser Regel etc. Zentral ein/auszuschalten Sub Main() 'KraBBy: Dateiname merken (wird für Meldungen benutzt) Dim sFileName As String = ThisDoc.FileName(False) 'DokumentTyp prüfen If Not TypeOf ThisDoc.Document Is AssemblyDocument Then If bDebug Then MsgBox("falscher Doc-Type" & vbCrLf & sFileName, vbOKOnly, "BOMSort - Abbruch") Exit Sub End If 'ThisDoc.Document verwendet statt 'ThisApplication.ActiveDocument ' weil die Regel ggf. auch bei untergeordneten Bgr. ausgeführt wird/werden soll ' (ThisDoc liefert das Document, in dem die Regel gerade läuft) ' Set a reference to the assembly document. ' This assumes an assembly document is active__Setzen Sie einen Verweis auf das Baugruppendokument. ' Dies setzt voraus, dass ein Baugruppendokument aktiv ist. Dim oDoc As AssemblyDocument = ThisDoc.Document ' Set a reference to the BOM___Setzen Sie einen Verweis auf die Stückliste Dim oBOM As BOM = oDoc.ComponentDefinition.BOM ' Make sure that the structured view is enabled___Stellen Sie sicher, dass die strukturierte Ansicht aktiviert ist. oBOM.StructuredViewEnabled = True ' Set a reference to the "Structured" BOMView___Setzen Sie einen Verweis auf die „Structured“ BOMView Dim oStructuredBOMView As BOMView oStructuredBOMView = oBOM.BOMViews.Item("Strukturiert") 'KraBBy hinzu: "nur Bauteile" ggf. aktivieren oBOM.PartsOnlyViewEnabled = True ' Set a reference to the "onlyParts" BOMView__Setzen Sie einen Verweis auf die BOMView "onlyParts". Dim oonlyPartsBOMView As BOMView oonlyPartsBOMView = oBOM.BOMViews.Item("nur Bauteile") 'Aufruf des Sub unten, für beide BOMView Call BOMViewBearb(oStructuredBOMView, sFileName & vbCrLf & "BOM: Strukturiert") 'KraBBy: Call wäre nicht nötig, stört (mich) aber auch nicht Call BOMViewBearb(oonlyPartsBOMView, sFileName & vbCrLf & "BOM: nur Bauteile") If bDebug Then MsgBox("Fertig" & vbCrLf & sFileName, vbOKOnly, "BOMsort") End Sub Sub BOMViewBearb(oBomView As BOMView, sViewName As String) 'Code zum Sortieren und Nummerieren hier in ein Sub ausgelagert, um das nur einmal zu tippen ' sViewName wird für Fehlermeldung verwendet Try Call oBomView.Sort("Bauteilnummer") Call oBomView.Renumber(1, 1) Catch ex As Exception Dim sMsg As String = sViewName & vbCrLf & vbCrLf sMsg += "Fehler beim Sortieren/Nummerieren der BOM:" & vbCrLf sMsg += ex.Message If bDebug Then MsgBox(sMsg, vbOKOnly, "BOMSort - Fehler") End Try End Sub
End Class
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kath878 Mitglied Konstrukteur
Beiträge: 12 Registriert: 31.08.2018 Inventor 2021, Vault 2021
|
erstellt am: 17. Mai. 2022 07:36 <-- editieren / zitieren --> Unities abgeben:
|