将数据从 sub-Sub 传输到 Function 并返回到 main Sub

问题描述

我正在尝试编写在 Function 中填充数组并将结果返回到 main Sub 的代码。但是这个Function是从另一个Sub(sub-Sub)调用的。为了了解这将如何工作,我尝试了一步一步。并写了这段代码

Sub CATMain()
    Dim val1
    Call WalkDownTree() 'Here I call Sub to walk down Product Tree in CATIA
    val1 = ParamTable(PartNumber,Name,Material,Texture,Color,Quantity)
    For i=0 To UBound(val1)
        MsgBox val1(i)
    Next

End Sub

Sub WalkDownTree() 'Simplified code of the walk down tree to understand data transfer
    PartNumber = "PartNumber"
    Name = "Name"
    Material = "Material"
    Texture = "Texture"
    Color = "Color"
    Quantity = 1
    Call ParamTable(PartNumber,Quantity)
End Sub

Function ParamTable(PartNumber,Quantity) 'Simplified array filing code. At original code I get all data from Part
    Dim BOMTable(6,1000)
    BOMTable(1,k) = PartNumber 
    BOMTable(2,k) = Name
    BOMTable(3,k) = Material
    BOMTable(4,k) = Texture
    BOMTable(5,k) = Color
    BOMTable(6,k) = 1
    ParamTable = BOMTable
End Function

但我在“MsgBox val1(i)”行出错:“下标超出范围”。 我错过了什么? 当函数从 sub-Sub 填充时,也许存在更简单的方法将数组从 Function 传输到 main Sub?

解决方法

过了一段时间我有了解决方案 此代码有效:

Dim PartNumber,Name,Material,Texture,Color,Quantity,k
Dim BOMTable(6,1000)

Sub CATMain()
    Dim val1
    Call WalkDownTree()
    val1 = ParamTable(PartNumber,k)
    For i = 1 To UBound(val1,1)
        For j = 1 To k-1
        MsgBox val1(i,j)
        Next
    Next

End Sub

Sub WalkDownTree()
    For k = 1 To 3
        PartNumber = "PartNumber" & k
        Name = "Name" & k
        Material = "Material" & k
        Texture = "Texture" & k
        Color = "Color" & k
        Quantity = 1
        Call ParamTable(PartNumber,k)
    Next
End Sub

Function ParamTable(PartNumber,k)
    BOMTable(1,k) = PartNumber 
    BOMTable(2,k) = Name
    BOMTable(3,k) = Material
    BOMTable(4,k) = Texture
    BOMTable(5,k) = Color
    BOMTable(6,k) = Quantity
    ParamTable = BOMTable
End Function
,

我建议不要在变量声明中懈怠,即使它不是运行所必需的。有必要了解一下。

保存所有数据的主全局变量应该在顶部声明

Option Explicit
Dim BOMData() As Variant

然后编写 CATMain()

Sub CATMain()

    Dim ItemCount As Integer 'This would be how many rows i will have in BOM or how many parts i will read i have to get this info from CATIA
    ReDim BOMData(0 To ItemCount - 1,0 To 5) As Variant 'This is making the collection
    Dim Row As Integer
    Dim Col As Integer

    For Row = 0 To ItemCount - 1 'populate the BOM collection
       Call WalkDownTree(Row)
    Next
  
    Dim TempStr As String
    For Row = 0 To ItemCount - 1 'just write each row to msgbox
        For Col = 0 To 5
            TempStr = TempStr & BOMData(Row,Col) & " "
        Next
        Call MsgBox(TempStr)
        TempStr=""
    Next

End Sub

这是如何查看填充集合的子...您正在遍历行或可能是项目(产品、零件等)

Sub WalkDownTree(Row As Integer)

    BOMData(Row,0) = "PartNumber"
    BOMData(Row,1) = "Name"
    BOMData(Row,2) = "Material"
    BOMData(Row,3) = "Texture"
    BOMData(Row,4) = "Color"
    BOMData(Row,5) = 1

End Sub

这个解决方案的优势可以给你带来像这样简单的excel导出

Sub WriteToExcel()

    Dim ExlApp As Excel.Application
    Set ExlApp = GetObject(,"EXCEL.Application")
    
    Dim ExlWorkBook As Workbook
    Set ExlWorkBook = ExlApp.Workbooks.Open("C:\Test.xls")
    
    Dim ExlSheet As Worksheet
    Set ExlSheet = ExlWorkBook.Worksheets.Item(1)
    ExlSheet.Range("A1").Resize((UBound(BOMData,1) - LBound(BOMData,1) + 1),(UBound(BOMData,2) - LBound(BOMData,2) + 1)).Value = BOMData

End Sub

编辑

这是 VBScript 版本。但是,如果您想认真开发某些东西,我建议您使用 VBA 或 VB .Net 语言为 Catia。如果没有必要,使用 VBScript 只是在折磨自己

    Dim BOMData()
    Sub CATMain()

    Dim ItemCount 
    ItemCount = 10 'how many items you have
    ReDim BOMData (ItemCount - 1,5) 
    Dim Row 
    Dim Col 

    For Row = 0 To ItemCount - 1 'populate the BOM collection
       Call WalkDownTree(Row)
    Next
  
    Dim TempStr
    For Row = 0 To ItemCount - 1 'just write each row to msgbox
        For Col = 0 To 5
            TempStr = TempStr & BOMData(Row,Col) & " "
        Next
        Call MsgBox(TempStr)
        TempStr=""
    Next

    End Sub
    
    Sub WalkDownTree(Row)

    BOMData(Row,5) = 1

    End Sub