2016-07-25 96 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 

正如由David G.提到忘了遞增J.粘貼陣列時我也使用了錯誤的變量(新手錯誤)。它現在返回結果,但它只返回在粘貼範圍內重複的數組的第一個值。我需要循環將數組粘貼到範圍嗎?

顯然數組將被粘貼在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

請提供一些數據和所需輸出的示例,以便我們可以重現您的問題。請閱讀[如何創建最小,完整和可驗證示例]的幫助主題(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 

此外,當將數組粘貼到單個單元格時,它將完全按照您所描述的內容進行操作;粘貼數組大小的第一個數組值。爲了讓它放入正確的值,您需要將它發送到與數組大小相同的範圍。例如,對於3的大小爲2的數組,你會寫

Range("A1:B3") = array 

在你的情況,你會想要的大小是動態的,就像你的數組的大小。

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

應該這樣做。正如你所看到的,它將粘貼從A8開始的範圍,並且以與數組中值的數量相同的長度粘貼。

+0

然而,即使你沒有增加,我也會假設至少j(0)被填充,如果你輸入了'if',你應該從你原來的代碼中至少得到1個值。 F8通過它,看看你是否曾經進入你的'if'條件。 –

+0

我使用Debug.Print並非常確定該值是否輸入了if。 但是使用F8,articleArr值顯示爲空。 感謝j的增量。我完全忘記了它。 – Windalfin

+0

你在增加'j'的時候嘗試了嗎? –