我正在将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中更改代码最自然?”
答案 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中保持不变