Портирование VBA в VB.NET: параметр функции, возможно, является многомерным массивом - PullRequest
1 голос
/ 27 августа 2009

Я портирую 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

Сбой «количество индексов превышает количество измерений индексированного массива» в последней строке.

Редактировать: Таким образом, вопрос звучит примерно так: «Как я могу использовать одну переменную в VB.NET, как в Excel VBA - с неоднозначной / гибкой размерностью?» В противном случае, "Как бы вы посоветовали изменить код, чтобы быть наиболее естественным в VB.NET?"

Ответы [ 2 ]

1 голос
/ 27 августа 2009

Поскольку у меня нет примеров данных для работы, это не проверено, но что-то вроде этого может работать:

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
0 голосов
/ 27 августа 2009
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.
EDIT3: код выше в стиле VB6. Но идея остается той же в VB.net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...