2016-07-25 4 views
0

Я пытаюсь получить данные из листа и поместить его в массив, а затем вставить массив на другой рабочий лист. Однако после цикла мой массив возвращает Пустой. Нужно ли мне что-то возвращать из цикла For? Я искал, не нашел никакой идеи.Как вернуть массив в диапазон excel vba

Sub generate() 
    Dim article_arr() As Variant 
    Dim artCount As Integer 
    Dim filter As Integer 
    Dim RIL_itemCount As Integer 

    'Set PA number 
    filter = Sheet7.Range("B1").Value 
    RIL_itemCount = Sheet5.Cells(Sheet5.Rows.count, "A").End(xlUp).Row 

    'Count number article of PA selected 
    artCount = Application.WorksheetFunction.CountIf(Sheet5.Range("R:R"), filter) 

    'redim array 
    ReDim article_arr(0 To artCount) 
    Dim j As Integer 
    j = 0 

    'populate array with article number from Retail Item List 
    For i = 0 To RIL_itemCount 
     If (Sheet5.Cells(i + 2, 18).Value = filter) Then 
      article_arr(j) = Sheet5.Cells(i + 2, 1).Value   
      Debug.Print (article_arr(j)) 
     End If 
    Next 

    'Paste Article number to range 
    Sheet7.Range("A8:A" & artCount) = articleArr() 


End Sub 

Как отметил Дэвид Г. Я забыл увеличивает J. Я также использую неправильные переменный (новичок ошибки) при вставке Array. Теперь он возвращает результат, но возвращает только первое значение массива, повторенное по вложенному диапазону. Нужен ли мне цикл для вставки массива в диапазон?

Очевидно, массив будет вставлен по горизонтали в excel, что вызовет повторение первого значения при вставке массива в диапазон. Добавление WorksheetFunction.Transpose(array) сделать волшебную

Вот обновленный код:

Sub generate() 
    Dim article_arr() As Variant 
    Dim artCount As Integer 
    Dim filter As Integer 
    Dim RIL_itemCount As Integer 

    'Set PA number 
    filter = Sheet7.Range("B1").Value 
    RIL_itemCount = Sheet5.Cells(Sheet5.Rows.count, "A").End(xlUp).Row 

    'Count number article of PA selected 
    artCount = Application.WorksheetFunction.CountIf(Sheet5.Range("R:R"), filter) 

    'redim array 
    ReDim article_arr(0 To artCount) 
    Dim j As Integer 
    j = 0 

    'populate array with article number from Retail Item List 
    For i = 0 To RIL_itemCount 
     If (Sheet5.Cells(i + 2, 18).Value = filter) Then 
      article_arr(j) = Sheet5.Cells(i + 2, 1).Value 
      j = j + 1 
     End If 
    Next 

    'Paste Article number to range 
    k = 8 
    Sheet7.Range("A" & k & ":A" & UBound(article_arr) + 7) = WorksheetFunction.Transpose(article_arr) 
    Debug.Print (article_arr(395)) 


End Sub 
+0

Просьба указать некоторые данные и пример желаемого результата, чтобы мы могли воспроизвести вашу проблему. Пожалуйста, прочитайте темы HELP для [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) –

+1

Если вам удалось использовать неправильную переменную, это означает, что вы не кодируете в 'Option Explicit'. Напишите «Option Explicit» в самом верху вашего кода, он предупредит вас об этих вещах. –

+0

@RonRosenfeld Спасибо за ввод. Я также отредактирую вопросы с найденным решением. – Windalfin

ответ

2

Вашего массив должен быть заполнен в соответствии с j целого числа, но не увеличить его.

For i = 0 To RIL_itemCount 
    If (Sheet5.Cells(i + 2, 18).Value = filter) Then 
     article_arr(j) = Sheet5.Cells(i + 2, 1).Value 
     j = j + 1 
     Debug.Print (article_arr(j)) 
    End If 
Next 

Также при вставке массива в одну ячейку он будет выполнять именно то, что вы описываете; вставьте значение первого массива всюду для размера массива. Чтобы он установил правильные значения, вам необходимо отправить его в диапазон того же размера, что и массив. Например, для массива размером 2 на 3, можно было бы написать

Range("A1:B3") = array 

В вашем случае, если вы хотели бы, чтобы размер быть динамичным, так же как и размер вашего массива.

k = 8 
Range("A" & k & ":A" & k + Ubound(article_arr, 1)) = article_arr 

Должен сделать трюк. Как вы можете видеть, он введет диапазон, начинающийся с A8, и опустится так же, как и количество значений в массиве.

+0

Однако, даже если вы не увеличиваете, я бы предположил, что по крайней мере j (0) заполняется, вы должны получать по крайней мере 1 значение из вашего исходного кода, если оно когда-либо входит в 'if'. F8, и посмотрите, не введете ли вы когда-нибудь свое условие 'if'. –

+0

Я использую Debug.Print и уверен, что значение входит в if. Однако, используя F8, значение ItemArr показывает пустое. Спасибо за приращение j. Я полностью забываю об этом. – Windalfin

+0

Вы пробовали его, увеличивая 'j'? –

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