将VBA移植到VB.NET:函数参数可能是多维数组

时间:2009-08-26 20:50:33

标签: .net vb.net vba

我正在将Excel VBA移植到VB.NET。我有一个功能选择数据,它可能是一维或两个。使用变量作为1-D或2-D数组的VBA代码非常流畅,但VB.NET将其标记为错误。

以下是简化代码:

Public Function Stat(ByVal Data As Range) As Object
    Dim Y() As Object
    Dim Appp As New Application() ''// Very annoying

    ''//Convert worksheet range into array vector
    Y = Appp.WorksheetFunction.Transpose(Appp.WorksheetFunction.Transpose(Data))

    Dim dimensions As Integer : dimensions = NumberOfArrayDimensions(Y)

    If dimensions > 1 Then
        For i = LBound(Y) To UBound(Y)
            If VarType(Y(i, 1)) <> 0 Then

最后一行的“索引数量超过索引数组的维数”失败。

编辑:所以问题就像是,“我如何在Excel VBA中使用单个变量,因为我可以在Excel VBA中使用 - 具有模糊/灵活的维度?”如果不这样做,“你会如何建议在VB.NET中更改代码最自然?”

2 个答案:

答案 0 :(得分:1)

由于我没有使用的示例数据,因此未经测试,但这样的事情可能会有效:

Dim dimensions As Integer : dimensions = Y.Rank

If dimensions > 1 Then
    For i = Y.GetLowerBound(0) To Y.GetUpperBound(0)
        If VarType(Y.GetValue(i, 1)) <> 0 Then

Y.Rank将返回维度数量(我假设此结果与调用NumberOfArrayDimensions(Y)的值相同)。

编辑:我认为您还需要将Y的声明更改为:

Dim Y As Array

答案 1 :(得分:0)

Public Function Stat(ByVal Data As Range) As Object
Dim Y() As Object
Dim Appp As New Application() ''// Very annoying

dim rows as Integer
dim cols as Integer

dim rowCtr as Integer = 1
dim colCtr as Integer = 1

rows = Data.Rows.Count
cols = Data.Columns.Count

Y = Appp.WorksheetFunction.Transpose(Appp.WorksheetFunction.Transpose(Data))

for rowCtr = 1 to rows
  for colCtr = 1 to cols
     Debug.Print Y(rowCtr, colCtr)
  next
next

编辑:我们的想法是使用Range对象来获取边界而不是数组 我没有修改其余代码(除了查找维度),这需要一些改进。

EDIT2:因为Transpose返回一个数字,其边界从1开始 编辑3:上面的代码是VB6风格。但这个想法在VB.net中保持不变