Transpose 陣列行列轉置的限制方式
阿新 • • 發佈:2020-02-12
提到陣列,大家都不陌生,什麼是陣列行列轉置呢?其實也很簡單,如下圖所示,行列轉置就是將陣列元素的存放方式進行轉換,原來儲存在第一列的資料,將保持在新陣列的第一行,並且保持原有順序,即6在第一個位置,8在最後一個位置。其他列依次類推。
在Excel工作表中有個強大的函式Transpose,可以直接實現陣列行列轉置,作為VBA開發者來說,肯定不會忘記用這個。
Sub Demo1() Dim aData(1 To 3,1 To 2) For i = 1 To 3 For j = 1 To 2 aData(i,j) = i + j * 5 Next j Next i aTrans = Application.Transpose(aData) Debug.Print UBound(aData,1) & " x "; UBound(aData,2) Debug.Print "=>>" Debug.Print UBound(aTrans,1) & " x "; UBound(aTrans,2) End Sub
一句程式碼輕鬆實現轉置,比很多程式開發語言都要簡單,在本地視窗中可以看到轉置效果。
這麼好用的神奇程式碼,有時會莫名其妙的罷工,我們來看看下面的程式碼,執行程式碼將給出“型別不匹配”的錯誤提示,錯誤號為“13”。
Sub Demo2() Dim aData(1 To 3,j) = i + j * 5 Next j Next i aData(1,1) = Application.Rept("$",256) aTrans = Application.Transpose(aData) ' Runtime error "13" Debug.Print UBound(aData,2) End Sub
轉置失敗的原因在於aData(1,1)的字元長度為256,Transpose所能夠處理的陣列元素字元長度最大為255。有時就是需要處理這樣的陣列元素,那麼我們可以使用自定義函式進行陣列的行列轉置。TrasnposeArray可以實現二維陣列的行列轉置。其效果與Transpose函式相同。
Sub Demo3() Dim aData(1 To 3,256) aTrans = TransposeArray(aData) Debug.Print UBound(aData,2) End Sub Function TransposeArray(arrA) As Variant Dim aRes() If VBA.IsArray(arrA) Then ReDim aRes(LBound(arrA,2) To UBound(arrA,2),LBound(arrA,1) To UBound(arrA,1)) For i = LBound(arrA,1) For j = LBound(arrA,2) aRes(j,i) = arrA(i,j) Next Next TransposeArray = aRes End If End Function
補充說明一點,由於Transpose本身是工作表函式,因此大家使用時,需要注意它的另一個限制,就是被轉置陣列的最大行數是65,536。
以上這篇Transpose 陣列行列轉置的限制方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。