问题描述
我正在尝试编写在 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