- 帖子
- 135
- 主題
- 19
- 精華
- 0
- 積分
- 165
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- 2003
- 閱讀權限
- 20
- 性別
- 男
- 來自
- 香港
- 註冊時間
- 2010-12-9
- 最後登錄
- 2012-8-27
|
18#
發表於 2011-1-7 13:26
| 只看該作者
本帖最後由 FAlonso 於 2011-1-8 20:25 編輯
關於transpose問題....
例如excel有如下排列
A B C D
1 r
2 e
3 s
4 t
將一個column的字連串:
transpose一次
結果是r,e,s,t- Sub abc()
- Dim mystring
- mystring = Join(Application.Transpose(Range("A1:a4").Value), ",") '注意這裡是一個column串
- Range("A10").Value = mystring
- End Sub
複製代碼 將一個row的字連串:
transpose二次
A B C D
1 r t u i- Sub abc()
- Dim mystring
- mystring = Join(Application.Transpose(Application.Transpose(Range("A1:D1"))), ",") '注意這裡是一個row串
- Range("A10").Value = mystring
- End Sub
複製代碼 結果是r,t,u,i
今日做了一點詳細研究,是土法大鍊鋼
先把以下程式抄進VBA- Sub check()
- Dim ar As Variant
- Dim i As Integer
- Set ar = [a1:a4] 'try [a1:d1] later
- For i = 1 To 6
- ar = Application.Transpose(ar)
- Next
- Set ar = Nothing
- End Sub
複製代碼 打開檢視->區域變數視窗,再按F8,逐行執行,觀察ar陣的資料
先看[a1:a4],一個column的range
是一個2D陣列(看紅色圈子), variant(1 to 4,1 to 1)

transpose一次後,變成了一個1D陣列, variant(1 to 4),這個是可以進入join()程式的東東

不論再如何transpose,都只會重覆variant(1 to 4,1 to 1) -> variant(1 to 4) -> variant(1 to 4,1 to 1) 這個循環
再看[a1:d1](自己把程式修改),一個row的range
是一個2D陣列, variant(1 to 1,1 to 4),這裡不再print screen了,大家自己看看
transpose一次後,變成另外一個2D陣列,叫variant(1 to 4,1 to 1),這樣是不能進入join程式
transpose第二次,便變了variant(1 to 4),可以了!
但之後無論怎transpose,都只會重覆variant(1 to 4,1 to 1) -> variant(1 to 4) -> variant(1 to 4,1 to 1) 這個循環,永遠不會變回variant(1 to 1,1 to 4)這個設定
打個比喻,就等如一個2-D row的陣列,首先變了"類似"2-D column的形態,再變1-D array
而2-D column就馬上變了1-D array
這樣應該能夠解釋為什麼row要transpose多一次,但row為什麼要首先變成column形,不要問我
最後d1.items那行
看以下例子- Dim myrange As Range
- Dim i As Integer, k
- Set myobject = CreateObject("scripting.dictionary")
- myobject("A") = Array(1, 2)
- myobject("B") = Array(4, 5)
- myobject("C") = Array(7, 8)
- Set myrange = Worksheets("sheet2").Range("A1").Resize(3, 2)
- k = myobject.items
- k = Application.Transpose(Application.Transpose(k))
- myrange = k
複製代碼 在完成myobject配置後,區域變數的顯示指該物件尚未是array(沒有那些variant(x,y),純粹是很散的架構)
把myobject.items叫出來,便看到k有variant(0,2)的1D形態(3個索引,"A","B","C")
打開k的"+"鍵,會看到k(0),k(1),k(2)各自都有variant(0,1)的1D形態(即每個索引中的兩個數字的表示)
transpose()一次,便會成一個variant(1 to 2,1 to 3)的2D陣列
其實此時已經可以貼上格子囉!試把resize(3,2)變成(2,3)看看!
不過因為我們想排成
A B
1 1 2
2 4 5
3 7 8
所以再transpose一次而已 |
|