2017-02-22 16 views
0

В этом question Мне был дан ответ, который решил мою проблему, но поскольку я прошел через свой код, я заметил что-то странное. Когда я назначаю 3 массива варианту массивов, я вижу в окне locals, что LBound варианта начинается с 0 (как и ожидалось), однако отдельные массивы LBound начинаются с 1, хотя я написал Option Base 0 в верхней части модуль. Это верно?LBound массивов, хранящихся внутри варианта

Код для заполнения массива

Public Sub FillArray(ByRef data As Variant, 
        sRange As String) 
data = oCurrentWs.Range(sRange) End Sub 
+0

ли досыта массивы с использованием для x = 1 до y на диапазоне или заполняется с помощью arr = range (x), можете ли вы наложить больше кода на то, что вам нужно? –

+0

Привет, Натан, у меня есть: 'Public Sub FillArray (данные ByRef как Variant, sRange As String)' 'data = oCurrentWs.Range (sRange)' 'End Sub' – KnightFallz

ответ

0

это потому, что присвоение Range к Variant всегда в результате получается массив с 1 нижним пределом, независимо от настройки Option Base.

, как вы можете видеть с этим тестом:

Public Sub FillArray(ByRef data As Variant, sRange As String) 
     With oCurrentWs.Range(sRange) 
      ReDim data(0 To .Rows.Count - 1, 0 To .Columns.Count - 1) '<--| this dims 'data' as a 0-based array 
      data = .Value '<--| this redims 'data' as a 1-based array 
     End With 
    End Sub 

так что если вы действительно необходимо иметь 0 на основе массивов вы должны кодировать как следующим образом:

Public Sub FillArray(ByRef data As Variant, sRange As String) 
    Dim i As Long, j As Long 
    With oCurrentWs.Range(sRange) 
     ReDim data(0 To .Rows.Count - 1, 0 To .Columns.Count - 1) '<--| dim 'data' as a zero-based array 
     For i = 1 To .Rows.Count '<--| loop through referenced range rows 
      For j = 1 To .Columns.Count '<--| loop through referenced range columns 
       data(i - 1, j - 1) = .Cells(i, j) '<--| fill each array element individually 
      Next 
     Next 
    End With 
End Sub 
+0

Только вернемся к этому. Спасибо за объяснение и образец кода. Я тестировал его, и он отлично работает, большое спасибо. – KnightFallz

+0

Добро пожаловать. – user3598756

1

Вариантные массивы являются динамические массивы типа Variant они инициализируются с помощью "= Array()".

Преимущество

как они инициализируются с помощью «= Array()», LBound и UBound функции работают с ними, даже если они не имеют элементов:

Dim varr As Variant 

    varr = Array() 

    Debug.Print LBound(varr) 'Prints 0 
    Debug.Print UBound(varr) 'Prints -1 

Теперь мы можем также добавить элемент без проверки для UBound failure

Excel Диапазоны использования Base 1

Когда массив заполняется прямо из диапазона массив начинается с 1, а не 0.

Для получения дополнительной информации обратитесь к Cells & Ranges > Working With Arrays

+0

Пока я ценю ответ, который он не связывает к проблеме, которую я описал, поскольку нет проблем с LBound и UBound варианта. См. Изображение по следующей ссылке, которая показывает проблему: http://i.imgur.com/J7uzspf.png – KnightFallz