Board logo

標題: 合併Ranges的內容 [打印本頁]

作者: clio    時間: 2017-8-21 09:04     標題: 合併Ranges的內容

各位大大:
小弟這邊遇到一個問題,想尋求解答問題如下:
程式每次由條件選取到的Excel.Ranges數不同,想合併Ranges的每一個內容值,並用", "來作區隔,基本的可以用下列方法:
Dim a As Range
Dim Aranges As Range
Dim Word As String
Dim A_Array() As Variant

For Each a In Aranges
        
      Word = Word & a.Value & ", "
        
Next a

但是當 Aranges的數量很大時,是很花時間的,所以想用「Join」合併陣列的方法來達成,速度應該會快上許多,
A_Array=Aranges
上面會讓A_Array變成是二維陣列,而Join只能用在一維陣列上
這樣想求教各位大大,是否有方法能將二維直接擷取成一維陣列,不透過
作者: ikboy    時間: 2017-8-21 21:44

直接在array中循環,然後再寫入,是最快。
作者: ML089    時間: 2017-8-22 23:37

Sub ex()

    [A1:A10] = [{1;2;3;4;5;6;7;8;9;10}]
    Arr = [A1:A10]
    xj = Join(Application.Transpose(Arr), ",")
    Debug.Print xj

    [B1:K1] = [{101,102,103,104,105,106,107,108,109,110}]
    Arr = [B1:K1]
    xj = Join(Application.Transpose(Application.Transpose(Arr)), ",")
    Debug.Print xj

End Sub
作者: clio    時間: 2017-8-23 14:27

回復 3# ML089
感謝ML089版主的回覆
您的方法解決了我的困境,只是有一點不太清楚,想再跟您請教一下
我發現[A1:A10],用Application.Transpose(Arr)就會轉出一維陣列
[B1:K1],用Application.Transpose(Arr)第一次轉出仍是二維陣列,需要再轉一次,才會變成一維陣列
不太清楚原理為何?或是有什麼結構上的差異呢
作者: ML089    時間: 2017-8-23 16:24

回復 4# clio

VBA 的一維是水平陣列

[B1:K1]是水平陣列,轉一次為垂直陣列,再轉一次為水平陣列才能變成一維陣列。
作者: clio    時間: 2017-8-23 18:41

回復 5# ML089
清楚了,另外一個問題請教版主

Arr = [B1:K1]
Arr = Application.Index(Arr, 0)
能直接把Arr變成一維陣列,不需再使用Transpose轉換
但是若
Arr = [A1:A10]
Arr = Application.Index(Arr, , 0)   
Arr仍是垂直陣列,需要使用Transpose轉換成一維陣列

這個情況不是很了解他的架構為何,能否請版大再給我指導一下,感謝您
作者: ML089    時間: 2017-8-23 21:14

本帖最後由 ML089 於 2017-8-24 03:06 編輯

回復 6# clio


Sub ex()

[A1:J10] = [row(1:10)*100+column(A:J)]
Arr = [A1:J10]

Brr = Application.Index(Arr, 1) '取水平陣列,一維陣列(N)
Crr = Application.Index(Arr, , 1) '取垂直陣列,二維陣列(Nx1)

Debug.Print Join(Brr, ",")
'Debug.Print Join(Crr, ",") '錯誤,非一維陣列無法使用JOIN函數
Debug.Print Join(Application.Transpose(Crr), ",") 'Transpose將垂直陣列(二維10x1陣列)轉為一維陣列


End Sub
作者: clio    時間: 2017-8-24 09:14

回復 7# ML089

完全了解了,感謝版主耐心的教導,萬分感謝
作者: clio    時間: 2017-8-24 09:18

回復 2# ikboy

感謝ikboy的回覆,使用Join, Range, Array這三種方法我都有測試過
大約提供我測試的時間,總體而言以Join的速度最快,只是他有上限是65536筆,超過就無法使用Join,而買100筆到65536筆不同數據的測試結果,Range使用For each... next的方法,與Array() 的方式,二個測得的時間是接近,可以機乎說花的時間是一樣的歐,以上是我實際測試的心得,可以加減參考,感謝您。




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)