我有以下(它的表面上,簡單)任務:獲得從非連續範圍的聯合值到陣列VBA用一個簡單的命令(不循環)
拷貝從數字的值使用VBA將電子表格中的列轉換爲二維數組。
爲了讓生活更有趣,列不相鄰,但它們的長度都是相同的。顯然,人們可以通過循環遍歷每個元素來做到這一點,但這看起來很不雅觀。我希望有一個更緊湊的解決方案 - 但我很難找到它。
以下是我認爲「一種簡單的方法」的一些嘗試 - 爲了簡單起見,我將範圍設置爲A1:A5, D1:D5
--總共10個單元格在兩個範圍內。
Private Sub testIt()
Dim r1, r2, ra, rd, rad
Dim valString, valUnion, valBlock
Set r1 = Range("A1:A5")
Set r2 = Range("D1:D5")
valString = Range("A1:A5,D1:D5").Value
valUnion = Union(r1, r2).Value
valBlock = Range("A1:D5").Value
End Sub
當我看着這些變量中,前兩個具有尺寸(1 To 5, 1 To 1)
而最後一個具有(1 To 5, 1 To 4)
。前兩次我期待得到(1 To 5, 1 To 2)
,但事實並非如此。
我會很高興,如果我可以在當時循環數據一列,並將一列中的所有值分配給數組中的一列 - 但我無法弄清楚如何做到這一點。像
cNames = Array("A", "D")
ci = 1
For Each c in columnNames
vals(, ci) = Range(c & "1:" & c & "5").Value
ci = ci + 1
Next c
但是,有什麼地方不正確的語法。我想要得到的結果可以通過
cNames = Array("A", "D")
ci = 1
For Each c in columnNames
For ri = 1 To 5
vals(ri , ci) = Range(c & "1").offset(ri-1,0).Value
Next ri
ci = ci + 1
Next c
但是這很醜陋。所以這裏是我的問題:
是否有可能獲得一個「複合範圍」(多個非連續塊)的值到一個數組中 - 一次全部或一次一列?如果是這樣,我該怎麼做?
要獲得額外的獎勵積分 - 任何人都可以解釋爲什麼testIt()
返回的數組的尺寸爲Base 1
,而我的VBA設置爲Option Base 0
?換句話說 - 他們爲什麼不是(0 To 4, 0 To 0)
?這僅僅是微軟的一個不一致嗎?
這實際上是和我最後一段代碼一樣的東西 - 除了你使用'For Each',我明確索引了單元格;如果一個區域有多個相鄰的列,那麼你的代碼就可以工作。這是一個解決方案 - 並感謝您發佈它 - 但不是我所希望的。但它可能會成爲最好的人可以希望的?... – Floris
我不知道任何你想做的一次性方法。 –
你的代碼中缺少一行:在'arr(rnum,cnum)= c.Value'後面,你需要一個'rnum = rnum + 1'......我冒昧地將修正的代碼合併到另一個答案中,參考這個答案。再次感謝 - 我開始認爲確實沒有「更快」的方法來做到這一點,所以我會接受這是「正確的」答案(在您確認我提出的代碼更改是正確的之後)。 – Floris