2016-01-15 18 views
1

Это цикл for для поиска значений в диапазоне и создания нового массива, полного результатов совпадения. Проблема заключается в просмотре объекта, который я вижу в первом случае Если оператор AR2 (i) создает элемент AR2 (0), который пуст, тогда назначает AR2 (1) как значение If Else.VBA - ReDim Preserve, создающий ложный элемент массива

Sub rt() 
Dim AR0() As Variant, AR1() As Variant, AR2() As Variant 
Dim WS0 As Worksheet, WS1 As Worksheet 
Dim i As Integer, RW0 As Integer, RW1 As Integer 
Dim C As Range 

Set WS0 = Sheets("lookup") 
Set WS1 = Sheets("centro") 

RW1 = WS1.Cells(WS1.Rows.Count, "A").End(xlUp).row 
AR0 = WS0.Range("A3:A28") 

For i = 1 To UBound(AR0, 1) 
    With WS1.Range("A2:A" & RW1) 
     Set C = .find(AR0(i, 1), LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext) 
     ReDim Preserve AR2(i) 
     If Not C Is Nothing Then 
      AR2(i) = "YES" 
     Else 
      AR2(i) = " - " 
     End If 
    End With 
Next 

WS0.Range("B3:B28") = WorksheetFunction.Transpose(AR2) 

End Sub 
+4

Да, это так, как это работает, когда вы явно не устанавливаете нижний предел вашего массива, он устанавливает его на 0. В чем проблема? Вы можете явно установить его с помощью 'ReDim Preserve AR2 (от 1 до i)'. – RBarryYoung

+2

по умолчанию массивы основаны на VBA. Поскольку вы запускаете счетчик в 1, первый элемент должен быть равен 0. Измените свою логику на любой из циклов от 0 до Ubound (AR0,1) -1 или вычтите один при заполнении массива. – sous2817

+0

@ RBarryYoung - проблема в том, что я хочу перенести вновь созданный массив AR2 на лист, но в цикле AR (0) создается сначала как «пустой», тогда AR (1) присваивается значение, основанное на IF заявление. В конечном итоге транспонированный массив отключен счетчиком 1. – Jorge

ответ

0

Ошибка была связана с элементом AR2 AR2 (0) без присвоенного значения. Решение заключалось в том, чтобы установить For loop для начала с 0 и AR0 (i +1, 1), чтобы можно было найти это значение, начиная с позиции петли 0. Спасибо!

Sub rt() 
    Dim AR0() As Variant, AR1() As Variant, AR2() As Variant 
    Dim WS0 As Worksheet, WS1 As Worksheet 
    Dim i As Integer, RW0 As Integer, RW1 As Integer 
    Dim C As Range 

    Set WS0 = Sheets("lookup") 
    Set WS1 = Sheets("centro") 

    RW1 = WS1.Cells(WS1.Rows.Count, "A").End(xlUp).row 
    AR0 = WS0.Range("A3:A28") 

    For i = 0 To UBound(AR0, 1) - 1 
     With WS1.Range("A2:A" & RW1) 
      Set C = .find(AR0(i + 1, 1), LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext) 
      ReDim Preserve AR2(i) 
      If Not C Is Nothing Then 
       AR2(i) = "YES" 
      Else 
       AR2(i) = " - " 
      End If 
     End With 
    Next 

    WS0.Range("B3:B28") = WorksheetFunction.Transpose(AR2) 

    End Sub 
Смежные вопросы