2015-08-21 136 views
2

我想寫一個簡單的代碼來查看數據輸入節並將該數據添加到現有的數據表。我想要複製的行數每次都會改變,所以我試圖使陣列能夠調整大小以適應。運行時錯誤'9':下標超出範圍與WorksheetFunction

Dim size As Integer 
Dim new_resources() As String 
Dim i as Integer 

size = worksheetfunction.CountA("E:E") - 1 
**ReDim new_resources(size)** 
i=1 
For i to size 
    new_resources(i) = cells(i+1,5) 
Next i 

我得到以下錯誤:

Run-time error '9': Subscript out of range.

上標有**行。

+0

我可能會採取不同的方式 - 而不是使new_resources爲一個字符串數組,爲什麼不把它簡單地作爲一個Range?然後將範圍定義爲E1:E [size]?然後遍歷行或者一次複製整個事物。 –

回答

1

如果您在ReDim行上發現錯誤,則必須表示size小於零,這意味着COUNTA("E:E")返回零。您可能想要在嘗試ReDim之前聲明size >= 0。例如:

size = worksheetfunction.CountA("E:E") - 1 

If size < 0 Then 
    MsgBox "Error! No rows found in column E." 
Else 
    ReDim new_resources(size) 
End If 
+0

謝謝。這就是現在正在發生的事情,以便弄清楚爲什麼countA函數沒有在工作表中註冊信息。 –

+0

查看@ Jeeped的回答。你需要使用'worksheetfunction.CountA(Range(「E:E」)) - 1'。 – Bond

1

數組以0開頭不是1.因此,將new_resources(i)更改爲new_resources(i-1)。

+0

好抓!這就是爲什麼我總是更喜歡'對於我= [LBound](https://msdn.microsoft.com/en-us/library/t9a7w1ac(v = vs.90).aspx)(new_resources)to [UBound](https ://msdn.microsoft.com/en-us/library/office/gg278658.aspx)(new_resources)。 – Jeeped

1

這不是WorksheetFunction object的工作方式。在工作表上,這足以傳入單元格範圍,但不能在VBA中傳遞。

Dim sz As Long 
Dim new_resources() As String 
Dim i as Integer 

sz = worksheetfunction.CountA(Range("E:E")) - 1 
ReDim new_resources(sz) 
i=1 
For i to sz 
    new_resources(i) = cells(i+1, 5) 
Next i 

'alternates 
sz = worksheetfunction.CountA(Columns(5)) - 1 
sz = worksheetfunction.CountA(Cells(1, 5).EntireColumn) - 1 

您需要在工作表上引用一個或多個單元格,就像在其他VBA操作中一樣。缺乏父母工作表讓我感到擔憂;也許你應該解決這個問題。

+0

我只發佈了給我一個問題的代碼摘錄。整個宏比我發佈的還多。我所有使用宏的經驗都是自學的,所以我所做的大部分工作並不一定是做事情的最佳方式,有時也是做事的正確方式。 –

+0

我根本沒有這樣做。我只是想讓你知道我的蹩腳編碼背後的'爲什麼':) –

相關問題