【问题标题】:catia v5 export tree through VBA macrocatia v5 通过 VBA 宏导出树
【发布时间】:2017-09-20 19:33:17
【问题描述】:

我需要导出 Catia Spec 树以用作 BoM。

出口应该:

  • 转到 Excel 并将使用 WalkDownTree 函数。
  • 已添加部件号、命名法和用户 名为“Sinex Ref”的属性。
  • 还必须确保导出的树忽略部分 和称为“Ref”的产品。

  • 使用 零件编号。

  • 包括已停用的部分,但要提及它们 已停用。

我是 Catia 和 VBA 的新手,并提出了以下建议(我对我发现的其他宏进行了调整,但注意到它们忽略了树中的子项)。目前,该宏生成 Excel 文件,并在同一单元格中循环遍历规范树中的所有部件和子项,无论它们是否被停用。

Sub CATMain()


' ********* is the current document a CATIA Product **************

    If CATIA.Documents.Count = 0 Then

        MsgBox "There are no CATIA documents open. Please open a CATIA document and try again.", ,msgboxtext

        Exit Sub
    End If


    If InStr(CATIA.ActiveDocument.Name, ".CATProduct") < 1 Then

        MsgBox "The active document is not a Product. Please open a CATIA Product and try again.", ,msgboxtext

         Exit Sub
    End If


' ************* General declarations for the Active CATIA session *****************

    Dim oProdDoc As ProductDocument
    t = 1
    Set oProdDoc = CATIA.ActiveDocument
    Dim oRootProd As Product
    Set oRootProd = oProdDoc.Product
    Dim par As Parameters
    Set par = oRootProd.UserRefProperties
    Dim SinexRef As String


' *************** begin spec tree scroll ******************

    Call WalkDownTree(oRootProd)
End Sub

Sub WalkDownTree(oInProduct As Product)
        Dim oInstances As Products
    Set oInstances = oInProduct.Products

    On Error Resume Next
    Set Excel = GetObject(, "EXCEL.Application")

    If Err.Number <> 0 Then
        Set Excel = CreateObject("EXCEL.Application")
        Excel.Visible = True
        Excel.Workbooks.Add 
    End If

    If t <> 1 Then
        for i=1 to oInProduct.Count


'**************************** Export title ***************************

            row=2

            col=1
            Excel.Columns.Columns(1).Columnwidth = 5

            Excel.Columns.Columns(2).Columnwidth = 15
            Excel.Cells(row,col+1).Value = "CATProduct:"

            Excel.Cells(row,col+1).Font.Bold = true

            Excel.Cells(row,col+1).HorizontalAlignment = 3
            Excel.Cells(row,col+2).Value = CATIA.ActiveDocument.Name

' **************************** Export column titles ***************

            row=4
            Excel.Cells(row,col+1).Value = "Instance Name"
            Excel.Cells(row,col+1).Font.Bold = true

            Excel.Columns.Columns(2).Columnwidth = 20

            Excel.Cells(row,col+1).borders.LineStyle = 1
            Excel.Cells(row,col+1).HorizontalAlignment = 3
            Excel.Cells(row+2,col+1).Value = oInProduct.ReferenceProduct.PartNumber

            Excel.Cells(row,col+2).Value = "Ref"

            Excel.Cells(row,col+2).Font.Bold = true

            Excel.Columns.Columns(3).Columnwidth = 15
            Excel.Cells(row,col+2).borders.LineStyle = 1

            Excel.Cells(row,col+2).HorizontalAlignment = 3
            Excel.Cells(row+2,col+2).Value = oInProduct.ReferenceProduct.Nomenclature

            Excel.Cells(row,col+3).Value = "Quantity"

            Excel.Cells(row,col+3).Font.Bold = true

            Excel.Columns.Columns(4).Columnwidth = 15
            Excel.Cells(row,col+3).borders.LineStyle = 1
            Excel.Cells(row,col+3).HorizontalAlignment = 3
            Excel.Cells(row+2,col+3).Value = 1 'insert item quantity corresponding to PartNumber

            Excel.Cells(row,col+4).Value = "SinexRef"

            Excel.Cells(row,col+4).Font.Bold = true

            Excel.Columns.Columns(5).Columnwidth = 15
            Excel.Cells(row,col+4).borders.LineStyle = 1

            Excel.Cells(row,col+4).HorizontalAlignment = 3
            Excel.Cells(row+2,col+4).Value = 1 'insert Sinex Ref corresponding to PartNumber

            t = t + 1
        Next
    End If

    Dim k As Integer
    For k = 1 To oInstances.Count
        Dim oInst As Product
        Set oInst = oInstances.Item(k)

        Call WalkDownTree(oInst)
    Next
End Sub

【问题讨论】:

    标签: vba tree catia


    【解决方案1】:

    假设由

    在同一个单元格中循环遍历规范树中的所有部分和子项

    您的意思是它正在同一个单元格中写入/覆盖来自 CATIA 的数据,这是因为您没有增加有关 Excel 行/列的任何内容。

    我个人会为 CATProduct、实例名称等内容创建标题,然后将纯数据放在下面,而不是每次都重复这些相同的标题,但您的格式也可以,只是汇总数据可能更困难在 Excel 中。

    无论如何,为了保持现有格式,您需要在循环结束时增加 Row,在 t 增加的位置附近。

    在现有循环中,第一个 oInProduct 似乎使用了第 2-6 行(总共 5 行)。在循环的开头有一个 row = 2 需要放在循环之前,这意味着它将从第二行开始。循环内部还有一个 row = 4 需要更改,我们可以使用 row = row + 2 来获得相同的效果。然后,在循环结束时,我们再次递增以达到总数 5,因此使用 row = row + 3。

    row = 2
    
    for i = 1 to oInProduct.Count
    
        '**************************** Export title ***************************
    
        col=1
        Excel.Columns.Columns(1).Columnwidth = 5
    
        ...
        row = row + 2 'previously row = 4
        ...
    
        Excel.Cells(row,col + 4).HorizontalAlignment = 3
        Excel.Cells(row + 2,col + 4).Value = 1 'insert Sinex Ref corresponding to PartNumber
    
        t = t + 1
        row = row + 3
    
    Next
    

    【讨论】:

    • 如何创建标题?
    • 本质上是创建一行表头,比如 Excel.Cells(1,1).Value = "CATProduct", Excel.Cells(1,2).Value = "Instance Name" 等等,所以所有这些标题都只在一行中。您只需要这样做一次,然后创建一个循环(类似于您已经拥有的),将正确的信息插入到与相关标题相同的列中。这将允许您(或其他人)更轻松地汇总/过滤/排序 Excel 工作表中的数据。
    • 我已经按照您的建议进行了更改,但结果相同,相同的单元格被相同的值覆盖。
    【解决方案2】:

    试试 -->分析-->物料清单-->定义格式(用于可选选项)-->>另存为-->文件格式为.xls

    或者: -->文件-->另存为-->文件类型:txt...当然是txt,但也许你可以转换为.xls (特别是如果您缺少许可证)

    【讨论】:

    • 这并没有回答问题,这是如何通过宏来完成的
    【解决方案3】:

    我已使用 Catia 库中提供的 AssemblyConverter 对象来提取 BOM。我在使用上述评论中提到的步骤录制宏时发现了这一点。
    尝试-->分析-->物料清单-->定义格式(用于可选选项)-->>另存为-->文件格式为.xls
    我认为这是最简单和快速的。此外,我们也可以更改文件的格式和位置。

    录制的宏:

    Sub CATMain()
    
        Dim productDocument1 As ProductDocument
        Set productDocument1 = CATIA.ActiveDocument
    
        Dim product1 As Product
        Set product1 = productDocument1.Product
    
        Dim assemblyConvertor1 As AssemblyConvertor
        Set assemblyConvertor1 = product1.GetItem("BillOfMaterial")
    
        Dim arrayOfVariantOfBSTR1(4)
        arrayOfVariantOfBSTR1(0) = "Quantity"
        arrayOfVariantOfBSTR1(1) = "Part Number"
        arrayOfVariantOfBSTR1(2) = "Type"
        arrayOfVariantOfBSTR1(3) = "Nomenclature"
        arrayOfVariantOfBSTR1(4) = "Revision"
        Set assemblyConvertor1Variant = assemblyConvertor1
        assemblyConvertor1Variant.SetCurrentFormat arrayOfVariantOfBSTR1
    
        Dim arrayOfVariantOfBSTR2(1)
        arrayOfVariantOfBSTR2(0) = "Quantity"
        arrayOfVariantOfBSTR2(1) = "Part Number"
        Set assemblyConvertor1Variant = assemblyConvertor1
        assemblyConvertor1Variant.SetSecondaryFormat arrayOfVariantOfBSTR2
    
        assemblyConvertor1.[Print] "XLS", "C:\Users\Desktop\BOM.xls", product1
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 2018-05-14
      • 2022-09-29
      • 2017-01-14
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多