UBound Array Definition - PullRequest
       7

UBound Array Definition

0 голосов
/ 27 апреля 2018

Проблемы с пониманием того, как использовать UBound.

Если у меня есть динамический столбец A, в котором количество строк постоянно меняется, но я хочу получить верхнюю границу, чтобы определить ее в цикле for - как бы я поступил так? Я продолжаю получать ошибку во время выполнения с помощью метода ниже.

arr = Worksheets("Sheet1").Range("A1").CurrentRegion.Value
For i = 1 to UBound(arr, 1)

etc. 

Next i

1 Ответ

0 голосов
/ 27 апреля 2018

При установке массива, равного значению диапазона, он автоматически устанавливает его как двумерный массив, даже если диапазон составляет только один столбец. Посмотрите на пример ниже:

 Private Sub workingWithArrayBounds()

    Dim Arr As Variant
    Dim RowIndex As Long
    Dim ColumnIndex As Long

    Arr = Worksheets("Sheet1").Range("A1").CurrentRegion.Value

    'VBA FUNCTION FOR CHECKING IF SOMETHING IS AN ARRAY
    If IsArray(Arr) Then

        'FIRST LOOP GOES THROUGH THE ROWS
        For RowIndex = LBound(Arr, 1) To UBound(Arr, 1)

            'THE SECOND LOOP GOES THROUGH THE COLUMNS
            For ColumnIndex = LBound(Arr, 2) To UBound(Arr, 2)

                'NOW YOU HAVE ACCESS TO EACH ELEMENT USING THE ROWINDEX AND THE COLUMN INDEX
                Debug.Print Arr(RowIndex, ColumnIndex)

            Next

        Next

    End If

End Sub

Если существует только один столбец данных, границы будут выглядеть примерно так (от 1 до x, от 1 до 1). Таким образом, вам нужно будет пройти во вторых границах. В целях безопасности всегда рекомендуется использовать и LBound, и UBound при циклическом просмотре массивов, поскольку они могут варьироваться от массива к массиву.

Еще одна вещь, которую нужно проверить, - это ли массив выделен. В сценарии установки массива, равного значению диапазона, вы можете сначала проверить, действительно ли в вашем диапазоне есть значения для извлечения.

Альтернативой является использование функции для проверки и определения, является ли массив пустым или нет. Cpearson имеет хорошую функцию для этого, а также многие другие полезные функции @ http://www.cpearson.com/excel/vbaarrays.htm

Public Function IsArrayEmpty(Arr As Variant) As Boolean
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' IsArrayEmpty
' This function tests whether the array is empty (unallocated). Returns TRUE or FALSE.
'
' The VBA IsArray function indicates whether a variable is an array, but it does not
' distinguish between allocated and unallocated arrays. It will return TRUE for both
' allocated and unallocated arrays. This function tests whether the array has actually
' been allocated.
'
' This function is really the reverse of IsArrayAllocated.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim LB As Long
Dim UB As Long

Err.Clear
On Error Resume Next
If IsArray(Arr) = False Then
    ' we weren't passed an array, return True
    IsArrayEmpty = True
End If

' Attempt to get the UBound of the array. If the array is
' unallocated, an error will occur.
UB = UBound(Arr, 1)
If (Err.Number <> 0) Then
    IsArrayEmpty = True
Else
    ''''''''''''''''''''''''''''''''''''''''''
    ' On rare occassion, under circumstances I
    ' cannot reliably replictate, Err.Number
    ' will be 0 for an unallocated, empty array.
    ' On these occassions, LBound is 0 and
    ' UBoung is -1.
    ' To accomodate the weird behavior, test to
    ' see if LB > UB. If so, the array is not
    ' allocated.
    ''''''''''''''''''''''''''''''''''''''''''
    Err.Clear
    LB = LBound(Arr)
    If LB > UB Then
        IsArrayEmpty = True
    Else
        IsArrayEmpty = False
    End If
End If

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