VBA, какова форма массива вариантов диапазона - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь преобразовать диапазон переменной длины в вариантный массив. Диапазон всегда будет одним столбцом с переменным количеством строк. Что-то в этом духе Range (B2: B711).

Я пытался выяснить, как перебирать массив, но не могу понять, как заставить это работать. Я могу использовать a для каждого l oop до l oop через каждый элемент, но я не могу повторить, используя стандарт для l oop.

. Я настроил тестовую функцию ниже. Раскомментирование любой из строк debug.print (month_arr (...)) приводит к остановке l oop в индексе 0 с нулевым выводом.

Не могу понять:

  • Форма массива, созданная month_arr = my_range.Value2
  • Правильный синтаксис для доступа к значениям индекса month_arr
  • Почему для каждого l oop можно прочитать массив но стандарт для l oop не может.

Если кто-нибудь может дать какие-либо указания относительно того, что я делаю неправильно, это будет с благодарностью.

Function my_test(my_range As Range) As Variant

    Dim i As Integer
    Dim start_row As Integer
    Dim month_arr As Variant
    Dim last_index As Integer
    Dim elem

    month_arr = my_range.Value2

    start_row = my_range.row - 1
    last_index = UBound(month_arr)

    Debug.Print (start_row)
    Debug.Print (last_index)

'    For Each elem In month_arr
'        Debug.Print elem
'        my_test = 1
'    Next elem

    For i = 0 To last_index
        'Debug.Print (month_arr(i))

        'Debug.Print (month_arr(i, 0))
        'Debug.Print (month_arr(i, 1))
        'Debug.Print (month_arr(i, 2))

        'Debug.Print (month_arr(0, i))
        'Debug.Print (month_arr(1, i))
        'Debug.Print (month_arr(2, i))

        Debug.Print ("i: " & i)
        If i >= 10 Then

            'my_test = Return month_arr at index 10
            Exit Function
            End If
    Next i
End Function

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Нет ничего плохого в том, чтобы оставить его вертикальным массивом, просто поймите, что основание массива равно 1, а не 0 при массовой загрузке:

Function my_test(my_range As Range) As Variant

    Dim i As Long
    Dim start_row As Long
    Dim month_arr As Variant
    Dim last_index As Long

    month_arr = my_range.Value2

    start_row = my_range.Row - 1
    last_index = UBound(month_arr, 1)

    Debug.Print start_row
    Debug.Print last_index

    For i = 1 To last_index
        Debug.Print month_arr(i, 1)
        Debug.Print "i: " & i
    Next i
    If i >= 10 Then
        my_test = month_arr(10, 1)
    End If
End Function
1 голос
/ 28 февраля 2020

Просто транспонируйте диапазон, и затем вы можете обратиться к каждому элементу

РЕДАКТИРОВАТЬ: Обратите внимание, что существует предел для транспонирования массива. но есть некоторые обходные пути ( см. это )

Как вы упомянули, диапазон B2:B711 не думал об этом.

Sub test()

    my_test Range("A1:A100")

End Sub

Private Sub my_test(my_range As Range)

    Dim month_arr As Variant

    Dim counter As Long

    month_arr = Application.WorksheetFunction.Transpose(my_range.Value2)

    For counter = 1 To UBound(month_arr)

        ' Print item value
        Debug.Print month_arr(counter)

        If counter >= 10 Then
            ' Do something here and exit sub
            Exit Sub
        End If

    Next counter

End Sub

Дайте мне знать, если это работает

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