Hot News aus dem CAD.de-Newsletter:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Stückliste in Baugruppe sortieren und in csv- oder Excel-Datei exportieren

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   Stückliste in Baugruppe sortieren und in csv- oder Excel-Datei exportieren (630 mal gelesen)
Honigbär
Mitglied
Angestellter


Sehen Sie sich das Profil von Honigbär an!   Senden Sie eine Private Message an Honigbär  Schreiben Sie einen Gästebucheintrag für Honigbär

Beiträge: 124
Registriert: 22.10.2006

CATIA V5 R24
Solid Edge Version 17
Pro-E Wildfire 4.0
Autodesk Inventor Professional 2014
MathCAD 13
Intel Centrino 2 (Pentium III Xeon) 2,53 GHz
6GB RAM
Win 7 Ultimate (64 Bit)
ATI Mobility Radeon HD 4650
SSD von Samsung (Festplatte)

erstellt am: 12. Jul. 2018 15:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,

mein Ziel ist folgendes:
Ich will die Stückliste in der Baugruppe (iam-Datei) im Reiter "Strukturiert" sortieren (Fertigungsteile zuerst, danach Kaufteile und zuletzt Normteile aus der Inventor-Bibliothek). Damit VBA das sortieren und zuordnen kann, gibt es einen entsprechenden Hinweis in der Spalte "Bestandsnummer".
Anschließend soll dies als csv- oder Excel Datei exportiert werden.

Mit ein bisschen Recherche habe ich diesen Code gefunden (von hier), um erstmal eine Basis zu haben mit der ich arbeiten kann:

Code:

Option Explicit
Dim PMarke As String
Dim PMarkeH As String
Dim AXArray(5000, 20) As String
Dim iZeile As Integer

Public Sub Btn_Stuecklistenerstellung_Click()

    Dim oAsmDoc As AssemblyDocument
    Set oAsmDoc = ThisApplication.ActiveDocument
    Dim oBOM As BOM
    Set oBOM = oAsmDoc.ComponentDefinition.BOM
    oBOM.StructuredViewFirstLevelOnly = False
    oBOM.StructuredViewEnabled = True
    Dim oStructuredBOMView As BOMView
    Set oStructuredBOMView = oBOM.BOMViews.Item("Strukturiert")
    Dim byWert As Byte
    Dim oPfad As String
    Dim uFolder, FileName, oFolderAXS As String
   
    'ExportPfad zuweisen
    oFolderAXS = "C:\ExportAX\"

    'Hinweisfenster ob der Stücklistenexport gestartet werden soll
    byWert = MsgBox("Soll die Stückliste exportiert werden?", vbOKCancel, "Stücklistenexport")
    If byWert = 2 Then Exit Sub

    Erase AXArray  'AXArray wird gelöscht
    iZeile = 2      'Zeile 0 und 1 werden separat erzeugt
 
    'die Teileliste aus der .iam wird angepasst und in das AXArray geschrieben
    addRow "", oStructuredBOMView.BOMRows, True
 
    'Ordner und Datei für das Exportfile wird erstellt
    uFolder = Mid(AXArray(2, 2), 3, 3)
    oPfad = oFolderAXS & uFolder
    Call CreateFolder.CreateFolder(oPfad)
    FileName = oPfad & "\" & Mid(AXArray(2, 2), 3, Len(AXArray(2, 2)) - 2) & " Rev" & AXArray(2, 9) & ".txt"
   
    'AXArray wird in eine .txt Datei exportiert
    Open FileName For Output As #1
        Dim i As Integer
        For i = 1 To iZeile  '1= mit Spaltenüberschriften, 2= ohne Spaltenüberschriften
            Print #1, AXArray(i, 1) & "|" & AXArray(i, 2) & "|" & AXArray(i, 3) & "|" & AXArray(i, 4) & "|" & AXArray(i, 5) _
            & "|" & AXArray(i, 6) & "|" & AXArray(i, 7) & "|" & AXArray(i, 8) & "|" & AXArray(i, 9) _
            & "|" & AXArray(i, 10) & "|" & AXArray(i, 11) & "|" & AXArray(i, 12) & "|" & AXArray(i, 13) _
            & "|" & AXArray(i, 14) & "|" & AXArray(i, 15) & "|" & AXArray(i, 16) & "|" & AXArray(i, 17) _
            & "|" & AXArray(i, 18) & "|" & AXArray(i, 19) & "|" & AXArray(i, 20)
        Next i
    Close #1 'Export-Datei schließen
 
  'Hinweisfenster oder Notepad zum Ende des Exports anzeigen
    'MsgBox "Stücklistenexport war erfolgreich!", vbOKOnly, "Stücklistenexport"
    Shell ("notepad.exe " + FileName)
End Sub

Private Function addRow(Parent As String, oBomRows As BOMRowsEnumerator, Optional header As Boolean = False)
    Dim oPart As Document
    Set oPart = ThisApplication.ActiveDocument
    Dim oBomRow As BOMRow
    Dim TName As String
    Dim oFileNameIDW As String
    Dim oTextBSZ, Temp As String
    Dim HauptBG, UnterBG, TNummer As String
    Dim NameEng, NameFra, oRevNum As String
    On Error Resume Next
   
    'Header wird erstellt (nur beim 1. drchlauf)
    If header = True Then
        'Zeile 1 = Spaltenüberschriften
        AXArray(1, 1) = "Pos"
        AXArray(1, 2) = "HauptBG"
        AXArray(1, 3) = "Anz"
        AXArray(1, 4) = "Teilenummer"
        AXArray(1, 5) = "Benennung"
        AXArray(1, 6) = "Englisch"
        AXArray(1, 7) = "Französisch"
        AXArray(1, 8) = "Unterbenennung"
        AXArray(1, 9) = "Rev"
        AXArray(1, 10) = "Erstelldatum"
        AXArray(1, 11) = "Material/Norm"
        AXArray(1, 12) = "MatNummer"
        AXArray(1, 13) = "Länge"
        AXArray(1, 14) = "Breite"
        AXArray(1, 15) = "Werkstoff"
        AXArray(1, 16) = "Rohteilgewicht"
        AXArray(1, 17) = "Bauteilgewicht"
        AXArray(1, 18) = "Artikelstatus"
        AXArray(1, 19) = "Zusatztext"
        AXArray(1, 20) = "Speicherort"
       
        'Zeile 2 = Die oberste Hauptbaugruppe wird erstellt
        Temp = BulTools.Translate(oPart.PropertySets(1).Item("Title").Value, NameEng, NameFra)
        PMarkeH = oPart.PropertySets(4).Item("Produktmarke").Value
        HauptBG = oPart.PropertySets(3).Item("Part Number").Value
       
        AXArray(2, 1) = "0"
        AXArray(2, 2) = PMarkeH & HauptBG
        AXArray(2, 3) = "1"
        AXArray(2, 4) = PMarkeH & HauptBG
        AXArray(2, 5) = oPart.PropertySets(1).Item("Title").Value
        AXArray(2, 6) = NameEng
        AXArray(2, 7) = NameFra
        AXArray(2, 8) = oPart.PropertySets(1).Item("Subject").Value
        AXArray(2, 9) = oPart.PropertySets(1).Item("Revision Number").Value
        AXArray(2, 10) = Left(oPart.PropertySets(3).Item("Creation Time").Value, 10)
        AXArray(2, 11) = ""
        AXArray(2, 12) = ""
        AXArray(2, 13) = ""
        AXArray(2, 14) = ""
        AXArray(2, 15) = ""
        AXArray(2, 16) = ""
        AXArray(2, 17) = Round(oPart.PropertySets(3).Item("Mass").Value / 1000, 1)
        AXArray(2, 18) = oPart.PropertySets(4).Item("Artikelstatus").Value
        AXArray(2, 19) = ""
        AXArray(2, 20) = oPart.ComponentDefinitions(1).Document.FullDocumentName
    End If
   
    'Prüft ob die Unterbaugruppe schon in der Stückliste ist, wenn ja wird sie kein 2. Mal ins Array geschrieben
    Dim i As Integer
    Dim InPartList As Boolean
    InPartList = False
    PMarke = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Produktmarke").Value
    For i = 2 To iZeile
        If AXArray(i, 2) = PMarke & Parent And Not AXArray(i, 2) = "" Then
            InPartList = True
        End If
    Next i

    'geamte Teileliste durchlaufen
    For Each oBomRow In oBomRows
        'Prüfen ob das Teil von der AX-Stückliste ausgeschlossen ist
        If oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("NoAXBom").Value = False Then
            'prüfen ob das Teiln schon in der Stückliste enthalten ist
            If InPartList = False Then
               
                'Variablen werden zurückgesetzt
                iZeile = iZeile + 1
                NameEng = ""
                NameFra = ""
                PMarke = ""
                TNummer = ""
                TName = ""
               
                'prüfen ob es ein "Parent" gibt, wenn nicht ist die Hauptbaugruppe der "Parent"
                UnterBG = Parent
                If UnterBG = "" Then UnterBG = HauptBG
               
                ' Stückliste wird zusammengestellt in in das Array geschrieben
                TNummer = oBomRow.ComponentDefinitions(1).Document.PropertySets(3).Item("Part Number").Value
                TName = oBomRow.ComponentDefinitions(1).Document.PropertySets(1).Item("Title").Value
                oRevNum = oBomRow.ComponentDefinitions(1).Document.PropertySets(1).Item("Revision Number").Value
                PMarke = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Produktmarke").Value
                If PMarke = "" Then PMarke = BulTools.ProduktMa(TNummer)
                Temp = BulTools.Translate(TName, NameEng, NameFra)
               
                'Zusatztext für Brennschnitte aus der .idw auslesen
                oFileNameIDW = Left(oBomRow.ComponentDefinitions(1).Document.FullDocumentName, Len(oBomRow.ComponentDefinitions(1).Document.FullDocumentName) - 3) & "idw"
                oTextBSZ = BulTools.iPropTextBSZ(oFileNameIDW)
                                 
                'AXArray wird mit Daten gefüllt
                AXArray(iZeile, 1) = oBomRow.ItemNumber
                AXArray(iZeile, 2) = PMarkeH & UnterBG
                AXArray(iZeile, 3) = oBomRow.ItemQuantity
                AXArray(iZeile, 4) = PMarke & TNummer
                AXArray(iZeile, 5) = TName
                AXArray(iZeile, 6) = NameEng
                AXArray(iZeile, 7) = NameFra
                AXArray(iZeile, 8) = oBomRow.ComponentDefinitions(1).Document.PropertySets(1).Item("Subject").Value
                AXArray(iZeile, 9) = oRevNum
                AXArray(iZeile, 10) = Left(oBomRow.ComponentDefinitions(1).Document.PropertySets(3).Item("Creation Time").Value, 10)
                AXArray(iZeile, 11) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Material/Norm").Value
                AXArray(iZeile, 12) = ""
                AXArray(iZeile, 13) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Länge").Value
                AXArray(iZeile, 14) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Breite").Value
                AXArray(iZeile, 15) = oBomRow.ComponentDefinitions(1).Document.PropertySets(3).Item("Material").Value
                AXArray(iZeile, 16) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Gewicht").Value
                AXArray(iZeile, 17) = Round(oBomRow.ComponentDefinitions(1).Document.PropertySets(3).Item("Mass").Value / 1000, 1)
                AXArray(iZeile, 18) = oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("Artikelstatus").Value
                AXArray(iZeile, 19) = oTextBSZ
                AXArray(iZeile, 20) = oBomRow.ComponentDefinitions(1).Document.FullDocumentName
               
                'Materialnummer aus ExcelTabelle auslesen (Material/Norm und Material)
                AXArray(iZeile, 12) = BulTools.RMNummer(AXArray(iZeile, 11), AXArray(iZeile, 15))
            End If
           
            'Baugruppen mit der Kennung "NoAxBomDissolve = True" werden nicht aufgelöst
            If oBomRow.ComponentDefinitions(1).Document.PropertySets(4).Item("NoAxBomDissolve").Value = False Then
                If Not oBomRow.ChildRows Is Nothing Then addRow TNummer, oBomRow.ChildRows, False
            End If
        End If
ForNext:
    Next
End Function


Nun will dieser Code aber nicht und meldet mir in der Zeile "Call CreateFolder.CreateFolder(oPfad)" -im Code fett und unterstrichen markiert- "Compile error: Variable not defined".
Wenn ich aber "Dim CreateFolder As String" definiere, dann erhalte ich die Meldung "Compile error: Invalid qualifier"

Wie muss ich CreateFolder jetzt korrekt deklarieren?

------------------

Du bist die Aufgabe - Franz Kafka

[Diese Nachricht wurde von Honigbär am 12. Jul. 2018 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Tacker
Mitglied
TZ, Tech. MB, Softwareentwickler


Sehen Sie sich das Profil von Tacker  an!   Senden Sie eine Private Message an Tacker  Schreiben Sie einen Gästebucheintrag für Tacker

Beiträge: 164
Registriert: 23.09.2010

IV 2015 IV 2017 Pro
i7-7700K 4x4.2GHz
32GB DDR4-2400
GTX 1060 6GB DDR5

erstellt am: 12. Jul. 2018 16:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Moin  ,

Also... gut ist die Vorlage nicht, aber man kann das ja verbessern.

Bezüglich CreateFolder ist folgendes zu sagen: Das geht über das Filesystem des Zielsystems (der lokale Rechner) und da sollte einiges mehr beachtet werden als nur die Funktion aufzurufen.
Zuerst brauchst du die Referenz zum Microsoft Scripting Runtime. Findest im VBA Browser unter Extras→Verweise.
Anschließend zuerst ein Beispiel:

Code:

Sub CreateFolder()
    Dim rootDirectory As String
    Dim folderToBeCreated As String
    Dim path As String
    ' Set the root directory path
    ' where you want to create
    ' your folder
        rootDirectory = "C:\ProgramData"
    ' give a valid name for your folder
        folderToBeCreated = "\MyFolder1"
    ' Path for MkDir VBA function
    ' would be the concatination
    ' of above two
        path = rootDirectory & folderToBeCreated
    ' Check the root directory and folder path
    ' before creating it directly
        If Len(Dir(rootDirectory, vbDirectory)) = 0 Then 'check if RootDirectory Exists?
            If Len(Dir(path, vbDirectory)) = 0 Then ' full path should not exist already
                VBA.MkDir (path) ' or VBA.MkDir ("C:\Vishwa\MyFolders\MyFolder1")
                MsgBox "Folder is created successfully"
            Else
                MsgBox "Folder is already existing in the root directory"
            End If
        Else
            MsgBox "Root directory does not exist"
        End If
End Sub

So sollte das aussehen. Gefunden hier http://learnexcelmacro.com/wp/2016/11/how-to-create-folders-in-windows-via-excel-vba/
Wurde aber abgeändert.
Das ganze kannst in eine Funktion abändern.

Code:

Private Function CreateFolder(Byval rootDirectory as string,byval folderToBeCreated as string) as Boolean
    'Dim rootDirectory As String
    'Dim folderToBeCreated As String
    Dim path As String
    ' Set the root directory path
    ' where you want to create
    ' your folder
        'rootDirectory = "C:\ProgramData"
    ' give a valid name for your folder
        'folderToBeCreated = "\MyFolder1"
    ' Path for MkDir VBA function
    ' would be the concatination
    ' of above two
        path = rootDirectory & folderToBeCreated
    ' Check the root directory and folder path
    ' before creating it directly
        If Len(Dir(rootDirectory, vbDirectory)) = 0 Then 'check if RootDirectory Exists?
            If Len(Dir(path, vbDirectory)) = 0 Then ' full path should not exist already
                VBA.MkDir (path) ' or VBA.MkDir ("C:\Vishwa\MyFolders\MyFolder1")
                Return True
                MsgBox "Folder is created successfully"
            Else
                Return True
                MsgBox "Folder is already existing in the root directory"
            End If
        Else
            Return False
            MsgBox "Root directory does not exist"
        End If
End Sub

Das ist jetzt noch nicht perfekt, aber tut seinen Dienst. Fehlerbehandlung fehlt beispielsweise noch.
Aufrufen kannst das (Private Function CreateFolder....) in deinem Code dann so:

Code:

if CreateFolder("C:\ProgramData","\MyFolder1") = False then
  'Erstellung schlug fehl, beenden
    Exit sub
end if

oder auch so

Code:

Dim rootDirectory as String
Dim folderToBeCreated as String
rootDirectory = "C:\ProgramData"
folderToBeCreated = "\MyFolder1"
If CreateFolder(rootDirectory,folderToBeCreated) = False then
  'Erstellung schlug fehl, beenden
    Exit sub
end if

Zu deinem Versuch CreateFolder als String zu Deklarieren, vielleicht wäre sogar die Anleitung hilfreich, richtet sich an VBA und Inventor API Neulinge. http://download.autodesk.com/us/community/mfg/Part_1.pdf
Ich weis, objektorientiertes Programmieren ist nicht selbsterklärend, hatte damit auch so meine Probleme, aber da muss man halt durch.
Klingt blöd, aber wenn man das Grundprinzip verstanden hat ist es logisch.

Ein String ist eine Variable die nur Text enthält. Ein String wird nie die Funktion bereithalten einen Ordner zu erstellen.
Hierzu ein Tutorial über die grundlegenden Datentypen: https://www.vba-tutorial.de/variablen/datentypen.htm

Ich hoffe ich konnte ein bisschen helfen

Gruß

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Honigbär
Mitglied
Angestellter


Sehen Sie sich das Profil von Honigbär an!   Senden Sie eine Private Message an Honigbär  Schreiben Sie einen Gästebucheintrag für Honigbär

Beiträge: 124
Registriert: 22.10.2006

CATIA V5 R24
Solid Edge Version 17
Pro-E Wildfire 4.0
Autodesk Inventor Professional 2014
MathCAD 13
Intel Centrino 2 (Pentium III Xeon) 2,53 GHz
6GB RAM
Win 7 Ultimate (64 Bit)
ATI Mobility Radeon HD 4650
SSD von Samsung (Festplatte)

erstellt am: 13. Jul. 2018 11:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Danke für deine Hilfe und die Links.

Ich bekomme jetzt in derselben Zeile (Call CreateFolder.CreateFolder(oPfad)) die Meldung "Compile error: Argument not optional" und "Return True" bzw. "Return False" wird im Code rot markiert.

Dann habe ich im Netz gelesen, dass es "set Return True" heißen muss, aber da bekomme ich dann die Meldung "Compile error: Expected: identifier".

Bin ganz durcheinander. Wie löse ich das Problem jetzt am besten?  

------------------

Du bist die Aufgabe - Franz Kafka

[Diese Nachricht wurde von Honigbär am 13. Jul. 2018 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Tacker
Mitglied
TZ, Tech. MB, Softwareentwickler


Sehen Sie sich das Profil von Tacker an!   Senden Sie eine Private Message an Tacker  Schreiben Sie einen Gästebucheintrag für Tacker

Beiträge: 164
Registriert: 23.09.2010

IV 2015 IV 2017 Pro
i7-7700K 4x4.2GHz
32GB DDR4-2400
GTX 1060 6GB DDR5

erstellt am: 13. Jul. 2018 17:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Moin 

da ist mir ein Fehler unterlaufen, entschuldige.
"Return" gibt es in VBA nicht, ich arbeite meist mit VB.NET, da gibt es das.

Ich würde vorschlagen wir vergessen das bisherige Beispiel und bauen etwas neues auf.
Ich hab aus der API mal ein Beispiel geholt:

Code:

Public Sub BOMQuery()
    ' Set a reference to the assembly document.
    ' This assumes an assembly document is active.
    Dim oDoc As AssemblyDocument
    Set oDoc = ThisApplication.ActiveDocument

    Dim FirstLevelOnly As Boolean
    If MsgBox("First level only?", vbYesNo) = vbYes Then
        FirstLevelOnly = True
    Else
        FirstLevelOnly = False
    End If
   
    ' Set a reference to the BOM
    Dim oBOM As BOM
    Set oBOM = oDoc.ComponentDefinition.BOM
   
    ' Set whether first level only or all levels.
    If FirstLevelOnly Then
        oBOM.StructuredViewFirstLevelOnly = True
    Else
        oBOM.StructuredViewFirstLevelOnly = False
    End If
   
    ' Make sure that the structured view is enabled.
    oBOM.StructuredViewEnabled = True
   
    'Set a reference to the "Structured" BOMView
    Dim oBOMView As BOMView
    Set oBOMView = oBOM.BOMViews.Item("Strukturiert")
       
    Debug.Print "Item"; Tab(15); "Quantity"; Tab(30); "Part Number"; Tab(70); "Description"
    Debug.Print "----------------------------------------------------------------------------------"

    'Initialize the tab for ItemNumber
    Dim ItemTab As Long
    ItemTab = -3
    Call QueryBOMRowProperties(oBOMView.BOMRows, ItemTab)
End Sub

Private Sub QueryBOMRowProperties(oBOMRows As BOMRowsEnumerator, ItemTab As Long)
    ItemTab = ItemTab + 3
    ' Iterate through the contents of the BOM Rows.
    Dim i As Long
    For i = 1 To oBOMRows.Count
        ' Get the current row.
        Dim oRow As BOMRow
        Set oRow = oBOMRows.Item(i)

        'Set a reference to the primary ComponentDefinition of the row
        Dim oCompDef As ComponentDefinition
        Set oCompDef = oRow.ComponentDefinitions.Item(1)

        Dim oPartNumProperty As Property
        Dim oDescripProperty As Property

        If TypeOf oCompDef Is VirtualComponentDefinition Then
            'Get the file property that contains the "Part Number"
            'The file property is obtained from the virtual component definition
            Set oPartNumProperty = oCompDef.PropertySets _
                .Item("Design Tracking Properties").Item("Part Number")

            'Get the file property that contains the "Description"
            Set oDescripProperty = oCompDef.PropertySets _
                .Item("Design Tracking Properties").Item("Description")

            Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _
                oPartNumProperty.Value; Tab(70); oDescripProperty.Value
        Else
            'Get the file property that contains the "Part Number"
            'The file property is obtained from the parent
            'document of the associated ComponentDefinition.
            Set oPartNumProperty = oCompDef.Document.PropertySets _
                .Item("Design Tracking Properties").Item("Part Number")

            'Get the file property that contains the "Description"
            Set oDescripProperty = oCompDef.Document.PropertySets _
                .Item("Design Tracking Properties").Item("Description")

            Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _
                oPartNumProperty.Value; Tab(70); oDescripProperty.Value
           
            'Recursively iterate child rows if present.
            If Not oRow.ChildRows Is Nothing Then
                Call QueryBOMRowProperties(oRow.ChildRows, ItemTab)
            End If
        End If
    Next
    ItemTab = ItemTab - 3
End Sub


Den Sub (BOMQuery) starten.
Das Fenster "Direktbereich" aktivieren. Dort siehst du dann die Ausgabe.
Das funktioniert über den Befehl Debug.Print()

Wenn das soweit bei dir funktioniert kümmern wir uns darum die Spalte "Bestandsnummer" auszulesen um anschließend zu sortieren.
Die Ergebnisse müssen wir nur noch als .csv exportieren, dafür hab ich bereits etwas Fertiges rumliegen.

Gruß

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Honigbär
Mitglied
Angestellter


Sehen Sie sich das Profil von Honigbär an!   Senden Sie eine Private Message an Honigbär  Schreiben Sie einen Gästebucheintrag für Honigbär

Beiträge: 124
Registriert: 22.10.2006

CATIA V5 R24
Solid Edge Version 17
Pro-E Wildfire 4.0
Autodesk Inventor Professional 2014
MathCAD 13
Intel Centrino 2 (Pentium III Xeon) 2,53 GHz
6GB RAM
Win 7 Ultimate (64 Bit)
ATI Mobility Radeon HD 4650
SSD von Samsung (Festplatte)

erstellt am: 16. Jul. 2018 09:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Willkommen in der neuen Woche 

Habe mir den Code kopiert und leicht angepasst.
Eine Fehlermeldung erhalte ich in der Zeile

Code:

If FirstLevelOnly Then
  oBOM.StructuredViewFirstLevelOnly = True
Else


mit der Meldung "Run-time error '5': Invalid procedure call or argument"

Eine Frage dazu. oBOM wird als BOM deklariert. Was ist BOM für ein Datentyp?

------------------

Du bist die Aufgabe - Franz Kafka

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Tacker
Mitglied
TZ, Tech. MB, Softwareentwickler


Sehen Sie sich das Profil von Tacker an!   Senden Sie eine Private Message an Tacker  Schreiben Sie einen Gästebucheintrag für Tacker

Beiträge: 164
Registriert: 23.09.2010

IV 2015 IV 2017 Pro
i7-7700K 4x4.2GHz
32GB DDR4-2400
GTX 1060 6GB DDR5

erstellt am: 16. Jul. 2018 13:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Moin  

wie hast du den Code modifiziert?
Konnte nicht nachstellen wie in der Zeile ein Fehler auftritt.
Ist eine Baugruppe geöffnet?

Die API definiert BOM so:
"Description
The BOM object represents the Bill Of Materials (BOM) data of a document."

Zu Deutsch: BOM = Stückliste

oBOM ist ein Objekt des Typs BOM
/EDIT:
Um das noch klarer zu machen: "oBOM" ist einfach nur ein Variablenname, das könnte auch "Stückliste","Teileliste", "A" oder auch "umpalumpa" sein.
Bei der Initialisierung einer Variable definieren wir den Typ: "Dim umpalumpa as BOM" dass die Variable namens "umpalumpa" eine BOM/Stückliste ist. Der Variablenname ist Variabel, jedoch sollte es eindeutig und zuordenbar sein.
Bei oBOM weis jeder, der sich mit Inventor & VBA auskennt, dass diese Variable die Stückliste ist, würde die Variable jetzt nur "A" heißen, wäre das nicht so einfach zuordenbar und der Code wird schwer lesbar.
Edit/

Die Programmierer von Inventor haben diesen Typ erzeugt, der Typ BOM kommt nicht von VBA.
Durch die Schnittstelle erhält der VBA Editor Zugriff auf dieses Objekt.
Wenn du in dem VBA Editor den Objektkatalog aufrufst und dort nach BOM suchst, wirst du die Klasse BOM finden.
Verzeichnet unter der Bibliothek von Inventor.
Wenn du die Klasse BOM markierst siehst du unter Elemente von 'BOM' die enthaltenen Objekte (Subs, Funktionen, Klassen, Events, elementare Datentypen)

Falls du dich wunderst woher VBA hier überhaupt Zugriff auf Inventor hat: Da es der VBA Editor von Inventor ist, wurde es so voreingestellt. Unter Extras→Verweise findest du "Autodesk Inventor Object Library". Unter Excel wurde der VBA Editor so eingestellt, dass man direkt Zugriff auf Excel hat, bei Outlook für Outlook usw.

Gruß

[Diese Nachricht wurde von Tacker am 16. Jul. 2018 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 95
Registriert: 19.09.2007

Inventor Professional 2016
Win7

erstellt am: 20. Jul. 2018 15:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Hier mein Versuch, das Problem etwas weiter in Richtung einer Lösung zu bringen.

Es ist enthalten:
"Bestandsnummer" auslesen
BOM-Zeilen in ein Array zu schreiben
das Array zu sortieren
den Inhalt in ein CSV-File zu schreiben

In den Subs BOMQuery und QueryBOMRowProperties habe ich versucht, eingefügte Codeblöcke mit '-> einzuleiten, das meiste sollte unverändert sein.

Code:

Option Explicit
'
'-> Variablen
Private gaStr_CSV() As String  'g: global a: Array Str: String
'
' Benötigte API-Deklaration
' für Sub QuickSort_s
Private Declare PtrSafe Sub CopyMemoryPtr Lib "kernel32" _
  Alias "RtlMoveMemory" ( _
  ByVal DestPtr As LongPtr, _
  ByVal SourcePtr As LongPtr, _
  ByVal Bytes As Long)
'  KraBBy: PtrSafe hinzu, DestPtr und SourcePtr umdeklariert von Long zu LongPtr
'

Public Sub BOMQuery()
    ' Set a reference to the assembly document.
    ' This assumes an assembly document is active.
    Dim oDoc As AssemblyDocument
    Set oDoc = ThisApplication.ActiveDocument

    Dim FirstLevelOnly As Boolean
    If MsgBox("First level only?", vbYesNo) = vbYes Then
        FirstLevelOnly = True
    Else
        FirstLevelOnly = False
    End If
 
    ' Set a reference to the BOM
    Dim oBOM As BOM
    Set oBOM = oDoc.ComponentDefinition.BOM
 
    ' Set whether first level only or all levels.
    If FirstLevelOnly Then
        oBOM.StructuredViewFirstLevelOnly = True
    Else
        oBOM.StructuredViewFirstLevelOnly = False
    End If
 
    ' Make sure that the structured view is enabled.
    oBOM.StructuredViewEnabled = True
 
    'Set a reference to the "Structured" BOMView
    Dim oBOMView As BOMView
    Set oBOMView = oBOM.BOMViews.Item("Strukturiert")
     
    Debug.Print "Item"; Tab(15); "Quantity"; Tab(30); "Part Number"; Tab(70); "Description"
    Debug.Print "----------------------------------------------------------------------------------"
   
    '-> initialize Array für Header (Kopfzeile)
    Dim sHeaderCSV(1) As String
    sHeaderCSV(0) = "Stock Number; Part Number; Item; Quantity; Description"
    sHeaderCSV(1) = "----------------------------------------------------------------------------------"
    '-> init Array mit Listeneinträgen
    ReDim gaStr_CSV(0)
   

    'Initialize the tab for ItemNumber
    Dim ItemTab As Long
    ItemTab = -3
    'Elemente der BOM durcharbeiten, rekursiv
    Call QueryBOMRowProperties(oBOMView.BOMRows, ItemTab)
   
    '-> Array mit den BOM-Einträgen sortieren
    'Call QuickSort_s(gaStr_CSV)
    Call QuickSort(gaStr_CSV)
    'gibt es Unterschiede im Ergebnis der beiden Algorithmen?
       
    '-> Datei schreiben
    Dim str_CSVdatei As String
    str_CSVdatei = "C:\temp\Test.csv"
    Call Write2File(str_CSVdatei, gaStr_CSV, sHeaderCSV)
   
    '-> Datei öffnen
    Dim ws As Object
    Set ws = CreateObject("WScript.Shell")  'Umweg, weil ich es mit dem integrierten Shell-Befehl nicht geschafft hab
    ws.Run Chr(34) & str_CSVdatei & Chr(34) 'öffnet die geschriebene Datei mit der in Windows zugeordneten Anwendung
    Set ws = Nothing    'Aufräumen
End Sub


Private Sub QueryBOMRowProperties(oBOMRows As BOMRowsEnumerator, ItemTab As Long)
    ItemTab = ItemTab + 3
    ' Iterate through the contents of the BOM Rows.
    Dim i As Long
    For i = 1 To oBOMRows.Count
        ' Get the current row.
        Dim oRow As BOMRow
        Set oRow = oBOMRows.Item(i)

        'Set a reference to the primary ComponentDefinition of the row
        Dim oCompDef As ComponentDefinition
        Set oCompDef = oRow.ComponentDefinitions.Item(1)

        Dim oPartNumProperty As Property
        Dim oDescripProperty As Property
       
    '-> hinzu Property "Bestandsnummer"
        Dim oStockNoProp As Property

        If TypeOf oCompDef Is VirtualComponentDefinition Then
            'Get the file property that contains the "Part Number"
            'The file property is obtained from the virtual component definition
            Set oPartNumProperty = oCompDef.PropertySets _
                .Item("Design Tracking Properties").Item("Part Number")

            'Get the file property that contains the "Description"
            Set oDescripProperty = oCompDef.PropertySets _
                .Item("Design Tracking Properties").Item("Description")

            Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _
                oPartNumProperty.Value; Tab(70); oDescripProperty.Value
           
        ' -> hinzu
            Set oStockNoProp = oCompDef.PropertySets.Item("Design Tracking Properties").Item("Stock Number")
            Call writeLine2Array(oStockNoProp.Value & ";" & oPartNumProperty.Value & ";" & oRow.ItemNumber & ";" _
                & oRow.ItemQuantity & ";" & oDescripProperty.Value)
        Else
            'Get the file property that contains the "Part Number"
            'The file property is obtained from the parent
            'document of the associated ComponentDefinition.
            Set oPartNumProperty = oCompDef.Document.PropertySets _
                .Item("Design Tracking Properties").Item("Part Number")

            'Get the file property that contains the "Description"
            Set oDescripProperty = oCompDef.Document.PropertySets _
                .Item("Design Tracking Properties").Item("Description")

            Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _
                oPartNumProperty.Value; Tab(70); oDescripProperty.Value
           
        '-> hinzu
            Set oStockNoProp = oCompDef.Document.PropertySets _
                .Item("Design Tracking Properties").Item("Stock Number")
            Call writeLine2Array(oStockNoProp.Value & ";" & oPartNumProperty.Value & ";" & oRow.ItemNumber & ";" _
                & oRow.ItemQuantity & ";" & oDescripProperty.Value)
         
            'Recursively iterate child rows if present.
            If Not oRow.ChildRows Is Nothing Then
                Call QueryBOMRowProperties(oRow.ChildRows, ItemTab)
            End If
        End If
    Next
    ItemTab = ItemTab - 3
End Sub

Private Sub Write2File(strFile As String, ByRef strData() As String, ByRef strHeader() As String)
'Schreibt den Inhalt eines Strings in eine neue Datei
   
    Dim i As Long 'Zähler für Schleife
    Dim ret As VbMsgBoxResult
   
    'Existiert die Datei bereits?
    If "" = Dir(strFile) Then
        'alles gut, unten gehts weiter
    Else
        ret = MsgBox(strFile & vbCrLf & "Datei existiert bereits." _
            & String(2, vbCrLf) & "Überschreiben?", vbYesNo + vbQuestion, "Sub Write2File")
        If vbYes = ret Then
            Kill strFile  'Datei löschen
        Else
            MsgBox "Keine Datei erstellt.", vbOKOnly, "Abgebrochen"
            Exit Sub
        End If
    End If
   
    ' Datei erstellen und befüllen
    Dim F
    F = FreeFile    'liefert nächsten freien Index
On Error GoTo ErrHandler
    Open strFile For Output As #F
On Error GoTo 0
    'Schleife durch String-Arrays - Header
    For i = LBound(strHeader) To UBound(strHeader)
        Print #F, strHeader(i)  'Alternativ Write
    Next 'i
    'Inhalt
    For i = LBound(strData) To UBound(strData)
        Print #F, strData(i)
    Next 'i
    Close #F    'Datei schließen
   
On Error GoTo 0
    Exit Sub

    'Fehlerbehandlung
ErrHandler:
    MsgBox Err.Description, vbCritical, Err.Number
End Sub

Private Sub writeLine2Array(strElement As String)
' fügt dem bestehenden Array ein weiteres Element hinzu
' wird am Ende angehängt
' gaStr_CSV    globale Variable (Modulebene)

    Dim idx As Long
    On Error Resume Next
    idx = UBound(gaStr_CSV) 'derzeit höchster Index
    ' liefert einen Fehler, falls Array noch nicht initialisiert ist
    If Not 0 = Err.Number Then
        'Array ist noch leer
        Err.Clear
        ReDim gaStr_CSV(0)
        idx = 0
    ElseIf 0 = idx And "" = gaStr_CSV(0) Then 'Array ist initialisiert, aber noch leer
        idx = 0 '-> erster Index wird benutzt/gefüllt
    Else 'Standardfall, Array hat schon Inhalte
        idx = idx + 1  'künftig höchster Index
        ReDim Preserve gaStr_CSV(idx)  'Array um 1 vergrößern
    End If
   
    On Error GoTo 0
    gaStr_CSV(idx) = strElement 'höchsten Index befüllen

End Sub

' Sortieralgorithmus QuickSort_s speziell für Strings
' https://www.vbarchiv.net/tipps/details.php?id=959
'
'hierzu gehört auch die Deklaration CopyMemoryPtr im Modul ganz oben
'
Public Sub QuickSort_s(ByRef vSort() As String, _
  Optional ByVal lngStart As Variant, _
  Optional ByVal lngEnd As Variant)

  ' Wird die Bereichsgrenze nicht angegeben,
  ' so wird das gesamte Array sortiert

  If IsMissing(lngStart) Then lngStart = LBound(vSort)
  If IsMissing(lngEnd) Then lngEnd = UBound(vSort)

  Dim i As Long
  Dim j As Long
  Dim X As String
  Dim n As Long
  Dim nPtr As LongPtr  'KraBBy: war Long

  On Error Resume Next
  i = lngStart: j = lngEnd
  n = ((lngStart + lngEnd) \ 2)
  X = vSort(n)

  ' Array aufteilen
  Do

    Do While (StrComp(vSort(i), X, vbTextCompare) = -1): i = i + 1: Loop
    Do While (StrComp(vSort(j), X, vbTextCompare) = 1): j = j - 1: Loop

    If (i <= j) Then
      ' Wertepaare miteinander tauschen
      nPtr = StrPtr(vSort(i))
      CopyMemoryPtr VarPtr(vSort(i)), VarPtr(vSort(j)), Len(nPtr)
      CopyMemoryPtr VarPtr(vSort(j)), VarPtr(nPtr), Len(nPtr)
      i = i + 1: j = j - 1
    End If
  Loop Until (i > j)

  ' Rekursion (Funktion ruft sich selbst auf)
  If (lngStart < j) Then QuickSort_s vSort, lngStart, j
  If (i < lngEnd) Then QuickSort_s vSort, i, lngEnd
  On Error GoTo 0
End Sub


' QuickSort-Algorithmus, allgemein: DatenTyp Variant
' https://www.vbarchiv.net/tipps/details.php?id=372
'
' vSort() : zu sortierendes Array
' lngStart, lngEnd: zu sortierender Bereich
' ==========================================
Public Sub QuickSort(vSort As Variant, _
  Optional ByVal lngStart As Variant, _
  Optional ByVal lngEnd As Variant)

  ' Wird die Bereichsgrenze nicht angegeben,
  ' so wird das gesamte Array sortiert

  If IsMissing(lngStart) Then lngStart = LBound(vSort)
  If IsMissing(lngEnd) Then lngEnd = UBound(vSort)

  Dim i As Long
  Dim j As Long
  Dim h As Variant
  Dim X As Variant

  i = lngStart: j = lngEnd
  X = vSort((lngStart + lngEnd) / 2)

  ' Array aufteilen
  Do

    While (vSort(i) < X): i = i + 1: Wend
    While (vSort(j) > X): j = j - 1: Wend

    If (i <= j) Then
      ' Wertepaare miteinander tauschen
      h = vSort(i)
      vSort(i) = vSort(j)
      vSort(j) = h
      i = i + 1: j = j - 1
    End If
  Loop Until (i > j)

  ' Rekursion (Funktion ruft sich selbst auf)
  If (lngStart < j) Then QuickSort vSort, lngStart, j
  If (i < lngEnd) Then QuickSort vSort, i, lngEnd
End Sub


------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Honigbär
Mitglied
Angestellter


Sehen Sie sich das Profil von Honigbär an!   Senden Sie eine Private Message an Honigbär  Schreiben Sie einen Gästebucheintrag für Honigbär

Beiträge: 124
Registriert: 22.10.2006

CATIA V5 R24
Solid Edge Version 17
Pro-E Wildfire 4.0
Autodesk Inventor Professional 2014
MathCAD 13
Intel Centrino 2 (Pentium III Xeon) 2,53 GHz
6GB RAM
Win 7 Ultimate (64 Bit)
ATI Mobility Radeon HD 4650
SSD von Samsung (Festplatte)

erstellt am: 25. Jul. 2018 15:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Zitat:
Original erstellt von Tacker:
wie hast du den Code modifiziert?
Konnte nicht nachstellen wie in der Zeile ein Fehler auftritt.
Ist eine Baugruppe geöffnet?


Ich hatte die erste Zeile "Public Sub BOMQuery()" in "Public Sub Btn_Stuecklistenerstellung_Click()" umbenannt. Sonst nichts weiter.
Eine Baugruppe ist natürlich stets geöffnet.
Danke für die ausführlichen Erläuterungen.

habe jetzt mal den Code von KraBBy verwendet. Danke dafür.

Ich habe es gestern auch gleich ausprobiert und es hat funktioniert    , aber heute kam dann die Ernüchterung :-( . Es wollte einfach nicht mehr funktionieren, trotz dass ich keine Änderungen vorgenommen habe.

Code:

' Set whether first level only or all levels.
If FirstLevelOnly Then
  oBOM.StructuredViewFirstLevelOnly = True
Else
  oBOM.StructuredViewFirstLevelOnly = False
End If


In diesen Zeilen bekomme ich den Fehler. Je nachdem ob ich in dem erscheinenden Auswahlfenster ja oder nein klicke. In der Fehlermeldung sagt er mir nur "Run-time error '5':Invalid procedure call or argument". Den Fehler hatte ich auch schon beim Code von Tacker.


------------------

Du bist die Aufgabe - Franz Kafka

[Diese Nachricht wurde von Honigbär am 25. Jul. 2018 editiert.]

[Diese Nachricht wurde von Honigbär am 25. Jul. 2018 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 95
Registriert: 19.09.2007

Inventor Professional 2016
Win7

erstellt am: 26. Jul. 2018 08:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Den einen Tag funktioniert es, den nächsten nicht?
Auf dem selben Rechner?
Bei der selben Baugruppe geöffnet?

Das ist schwer nachzuvollziehen.

Setz mal bitte einen Haltepunkt in die Zeile "If FirstLevelOnly Then" (Cursor in die Zeile setzen und F9 drücken, Zeile wird dann rot markiert). Wenn der Code das nächste mal gestartet wird, läuft er nur bis zum Haltepunkt und wird dort angehalten. Dann kannst du die Variable oBom markieren und im Kontextmenü "Add Watch" aufrufen. Spätesten dann sollte ein Fenster "Watches" erscheinen, da kann man 'in die Variablen schauen'.
Vielleicht hilft uns das irgendwie weiter.

------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Honigbär
Mitglied
Angestellter


Sehen Sie sich das Profil von Honigbär an!   Senden Sie eine Private Message an Honigbär  Schreiben Sie einen Gästebucheintrag für Honigbär

Beiträge: 124
Registriert: 22.10.2006

CATIA V5 R24
Solid Edge Version 17
Pro-E Wildfire 4.0
Autodesk Inventor Professional 2014
MathCAD 13
Intel Centrino 2 (Pentium III Xeon) 2,53 GHz
6GB RAM
Win 7 Ultimate (64 Bit)
ATI Mobility Radeon HD 4650
SSD von Samsung (Festplatte)

erstellt am: 26. Jul. 2018 09:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Watches.jpg

 
Moin,

Zitat:
Original erstellt von KraBBy:
Den einen Tag funktioniert es, den nächsten nicht?
Auf dem selben Rechner?
Bei der selben Baugruppe geöffnet?

Das ist schwer nachzuvollziehen.



So ist es. Von heute auf morgen kam der Fehler. Ja auf demselben Rechner. Ob es dieselbe Baugruppe war bin ich mir nicht mehr so sicher. Es soll am Ende ja bei jeder Baugruppe funktionieren. Deswegen habe ich diesen Punkt nicht berücksichtigt.

Ich habe das mit dem Watches jetzt gemacht, aber ich kann da nichts erkenntnisreiches rauslesen.
Wo muss ich da jetzt genau hinschauen, um einen möglichen Fehler zu finden?

------------------
Du bist die Aufgabe - Franz Kafka

[Diese Nachricht wurde von Honigbär am 26. Jul. 2018 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 95
Registriert: 19.09.2007

Inventor Professional 2016
Win7

erstellt am: 26. Jul. 2018 12:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Klar soll es am Ende für alle Bgr. funktionieren, aber zur Eingrenzung des Problems solltest Du bitte darauf achten wo es funktioniert und wo nicht.

Das Bild sagt mir, dass die Variable oBom auf ein Objekt verweist (weil die untergeordneten Elemente vorhanden sind). Dort sieht man auch die Eigenschaft .StructuredViewFirstLevelOnly die wir schalten wollen (wobei dann aber der Fehler auftritt). Sieht i.O. aus.
Kanns mir damit leider nicht erklären.

Versuch bitte mal den Code laufen zu lassen, wenn die beiden Zeilen mit oBom.StructuredViewFirstLevelOnly auskommentiert sind. Dann sehen wir, ob der Rest durchläuft.

------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Honigbär
Mitglied
Angestellter


Sehen Sie sich das Profil von Honigbär an!   Senden Sie eine Private Message an Honigbär  Schreiben Sie einen Gästebucheintrag für Honigbär

Beiträge: 124
Registriert: 22.10.2006

CATIA V5 R24
Solid Edge Version 17
Pro-E Wildfire 4.0
Autodesk Inventor Professional 2014
MathCAD 13
Intel Centrino 2 (Pentium III Xeon) 2,53 GHz
6GB RAM
Win 7 Ultimate (64 Bit)
ATI Mobility Radeon HD 4650
SSD von Samsung (Festplatte)

erstellt am: 27. Jul. 2018 11:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Okay, ich achte jetzt darauf immer dieselbe Baugruppe zu verwenden.

Ich habe die Zeilen jetzt auskommentiert und erhalte leider ein paar Zeilen später dieselbe Fehlermeldung wieder

Code:
    Set oBOMView = oBOM.BOMViews.Item("Strukturiert")

 

Nützt es was wenn ich die ivb-Datei hochlade?

------------------
Du bist die Aufgabe - Franz Kafka

[Diese Nachricht wurde von Honigbär am 27. Jul. 2018 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bkrüger
Mitglied
Konstrukteur


Sehen Sie sich das Profil von bkrüger an!   Senden Sie eine Private Message an bkrüger  Schreiben Sie einen Gästebucheintrag für bkrüger

Beiträge: 26
Registriert: 14.09.2014

Win7 IV2018 Vault2018-WG

erstellt am: 27. Jul. 2018 11:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Ist evtl. eine Detailgenauigkeit in der BGR aktiv? Oder ist eine andere BGR oder idw geöfnet, die in der eine Detailgenauigkeit aktiv ist? Das führt zuweilen zu Merkwürdigkeiten u.a. im Zusammenhang mit der Stücklistenausgabe...

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 95
Registriert: 19.09.2007

Inventor Professional 2016
Win7

erstellt am: 27. Jul. 2018 11:48    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Honigbär:
Nützt es was wenn ich die ivb-Datei hochlade?

Aus meiner Sicht eher nein. Ich gehe davon aus, dass das kopieren und einfügen geklappt hat 
Mehr würde mich eine Baugruppe interessieren, bei der es nicht funktioniert. Ggf. auch im Hinblick auf den post von bkrüger.

Ist die SysInfo noch korrekt? IV2014?
evtl. liegt ein Thema mit den Versionen vor (ich kann nur IV2016 testen)

------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Honigbär
Mitglied
Angestellter


Sehen Sie sich das Profil von Honigbär an!   Senden Sie eine Private Message an Honigbär  Schreiben Sie einen Gästebucheintrag für Honigbär

Beiträge: 124
Registriert: 22.10.2006

CATIA V5 R24
Solid Edge Version 17
Pro-E Wildfire 4.0
Autodesk Inventor Professional 2014
MathCAD 13
Intel Centrino 2 (Pentium III Xeon) 2,53 GHz
6GB RAM
Win 7 Ultimate (64 Bit)
ATI Mobility Radeon HD 4650
SSD von Samsung (Festplatte)

erstellt am: 27. Jul. 2018 12:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Irgendwie ist doch aber immer eine Detailgenauigkeit aktiv oder nicht? Ich wüsste nicht wie ich den Haken bei Detailgenauigkeit loswerden sollte. Genauso wie es mit Ansicht (zwei Zeilen darüber) der Fall ist. Eine Ansicht ist immer aktiv.

Ich habe mal von "Detailgenauigkeit1" auf die Detailgenauigkeit "Hauptansicht" umgeschaltet und den Code nochmal ausgeführt. Und siehe da, es funktioniert. Seltsam. 

Die Detailgenauigkeit1 muss aber sein, weil ich einige Unterbaugruppen unterdrückt habe (die dienen als Hilfskomponenten im Gesamtmodell).

Den Zustand von Detailgenauigkeit1 als Stückliste zu exportieren ist wohl nicht möglich?

Falls nein, wie schalte ich dann per VBA Befehl in "Hauptansicht" um und in die zuletzt aktive Detailansicht wieder zurück?

Ich habe Inventor 2017 und 2018. An der Version wird es nicht liegen. 

------------------

Du bist die Aufgabe - Franz Kafka

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bkrüger
Mitglied
Konstrukteur


Sehen Sie sich das Profil von bkrüger an!   Senden Sie eine Private Message an bkrüger  Schreiben Sie einen Gästebucheintrag für bkrüger

Beiträge: 26
Registriert: 14.09.2014

Win7 IV2018 Vault2018-WG

erstellt am: 27. Jul. 2018 14:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Auf die Schnelle....
Nur soviel: Ich hab schon Schreibtischkanten zerbissen wegen den sch. LODs (level of detail). Ich hatte dann aufegegben, indem ich vor der Ausgabe der Stückliste auf Hauptansicht umschalte.

Hauptansicht einschalten:

Code:

Call ThisApplication.ActiveDocument.ComponentDefinition.RepresentationsManager.LevelOfDetailRepresentations.Item(1).Activate

Wenn man wieder zurück will, muss man vorher die aktive LOD (deren Index oder Name) ermitteln, die speichern und dann wieder aktvieren.
Der Name der aktiven LOD:

Code:

'aktive LOD:
ThisApplication.ActiveDocument.ComponentDefinition.RepresentationsManager.ActiveLevelOfDetailRepresentation.name


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bkrüger
Mitglied
Konstrukteur


Sehen Sie sich das Profil von bkrüger an!   Senden Sie eine Private Message an bkrüger  Schreiben Sie einen Gästebucheintrag für bkrüger

Beiträge: 26
Registriert: 14.09.2014

Win7 IV2018 Vault2018-WG

erstellt am: 27. Jul. 2018 15:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Nochmal wg. Bauteile/Baugruppen unterdrücken:
Mittels LOD geht das doch eigentlich nicht?
Ich sehe jedenfalls die unterdrückten BT/BGR sehr wohl in der Stückliste...
Zuweilen weigert sich die DIVA überhaupt die Stückliste einer iam auszugeben, wenn ein LOD aktiviert ist (da kommen fadenscheinige Ausreden wie "Baugruppe muss erst gespeichert werden" - was aber nichts bringt....)

Wir verwenden zum Unterdrücken diverser Hilfselemente das Stücklistenattribut "Phantom".
Das wiederum hat (u.a. weil es eine Dateieigenschaft ist) andere Nachteile.

Wie die Zeit vergeht: Ich habe schon geraume Zeit den IV2018 (muss mal mein Profil anpassen) - aber beim 17er waren genannte Umstände grundsätzlich auch nicht anders.
Wo sich der 18er vom 17er bzgl. BOM-Ausgabe unterscheidet: beim 18er geht das Laden von XML-Stücklistenvorlagen (was vom 17er noch kommentarlos ignoriert wurde). Die Spalten werden - glaube ich - aber immer noch nicht in korrekter Reihenfolge (sondern in der alphabetischen der engl. Spalten-Originalbezeichnungen) ausgegeben...

 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KraBBy
Mitglied
Maschinenbau-Ingenieur


Sehen Sie sich das Profil von KraBBy an!   Senden Sie eine Private Message an KraBBy  Schreiben Sie einen Gästebucheintrag für KraBBy

Beiträge: 95
Registriert: 19.09.2007

Inventor Professional 2016
Win7

erstellt am: 27. Jul. 2018 22:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Honigbär 10 Unities + Antwort hilfreich

Auch ich bin der Meinung, dass mit LoD sich die Stückliste nicht beeinflussen lässt. Wenn man sich die Hilfe ansieht, ist es primär dafür gedacht, Baugruppen einfach zu  halten (Stichwort Ersatzdarstellung).

Ansichten machen der Hinsicht (Hilfskonstruktionen ausblenden) mindestens weniger (oder keine?) Probleme. Um die Stückliste passend zu halten, lässt sich auch 'Referenz' verwenden. Das ist dann auch nicht zwingend eine Bauteil-Eigenschaft sondern kann auch am Exemplar hängen. Außerdem lässt sich die Teileliste auf der Zeichnung z.b. auch nach Sichtbarkeit filtern (auch nicht perfekt, mitunter gefährlich, ich weiß)

Natürlich lässt sich euer Vorgehen nicht besonders gut aus der Ferne beurteilen. Aber vielleicht ist es einen Versuch wert, es mal ohne LoD zu versuchen.

------------------
Gruß KraBBy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2018 CAD.de | Impressum | Datenschutz