Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将VBA移植到VB.NET:函数参数可能是多维数组_.net_Vb.net_Vba - Fatal编程技术网

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

将VBA移植到VB.NET:函数参数可能是多维数组,.net,vb.net,vba,.net,Vb.net,Vba,我正在将Excel VBA移植到VB.NET。我有一个选择数据的函数,它可能是一维的,也可能是二维的。VBA代码在将变量用作1-D或2-D数组时非常流畅,但VB.NET将其标记为错误 以下是简化代码: Public Function Stat(ByVal Data As Range) As Object Dim Y() As Object Dim Appp As New Application() ''// Very annoying ''//Convert works

我正在将Excel VBA移植到VB.NET。我有一个选择数据的函数,它可能是一维的,也可能是二维的。VBA代码在将变量用作1-D或2-D数组时非常流畅,但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
Public Function Stat(ByVal数据作为范围)作为对象
Dim Y()作为对象
Dim Appp作为新应用程序()“”//非常烦人
''//将工作表范围转换为数组向量
Y=Appp.WorksheetFunction.Transpose(Appp.WorksheetFunction.Transpose(数据))
将尺寸标注为整数:尺寸=NumberOfArrayDimensions(Y)
如果尺寸>1,则
对于i=LBound(Y)到UBound(Y)
如果VarType(Y(i,1))为0,那么
它在最后一行出现“索引数超过索引数组的维数”时失败


编辑:所以问题是这样的,“如何在VB.NET中像在Excel VBA中一样使用单个变量--具有不明确/灵活的维度?”如果没有,则“您建议如何在VB.NET中将代码更改为最自然的?”

,因为我没有样本数据来处理,这是未经测试的,但类似的方法可能会奏效:

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

因为我没有样本数据,所以这是未经测试的,但类似的东西可能会起作用:

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
编辑:想法是使用范围对象而不是数组来获取边界。
我没有修改代码的其余部分(除了查找维度),这需要一些改进

EDIT2:因为转置返回一个数组,其边界从1开始。
EDIT3:上面的代码是VB6样式的。但是VB.net中的想法仍然相同

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

EDIT2:因为转置返回一个数组,其边界从1开始。

EDIT3:上面的代码是VB6样式的。但是在VB.net中的想法仍然是一样的

我想那就是“cols=Data.Columns.Count”。为什么在VB.NET中使用基于1的数组?此外,我还可以从数组中获取数据。这不是问题所在。那么,问题到底是什么呢?“我如何在VB.NET中使用一个变量来充当Excel VBA中的变量——具有不明确/灵活的维度?”如果没有,那么,“您建议如何在VB.NET中将代码更改为最自然的?”您所说的单个变量是什么意思?原因?我想这是‘cols=Data.Columns.Count’。为什么在VB.NET中使用基于1的数组?此外,我还可以从数组中获取数据。这不是问题所在。那么,问题到底是什么呢?“我如何在VB.NET中使用一个变量来充当Excel VBA中的变量——具有不明确/灵活的维度?”如果没有,那么,“您建议如何在VB.NET中将代码更改为最自然的?”您所说的单个变量是什么意思?原因?我认为是“Dim T as Array”让我渡过了难关。我认为是“Dim T as Array”让我渡过了难关。
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