1. 程式人生 > 程式設計 >Transpose 陣列行列轉置的限制方式

Transpose 陣列行列轉置的限制方式

提到陣列,大家都不陌生,什麼是陣列行列轉置呢?其實也很簡單,如下圖所示,行列轉置就是將陣列元素的存放方式進行轉換,原來儲存在第一列的資料,將保持在新陣列的第一行,並且保持原有順序,即6在第一個位置,8在最後一個位置。其他列依次類推。

Transpose 陣列行列轉置的限制方式

在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

一句程式碼輕鬆實現轉置,比很多程式開發語言都要簡單,在本地視窗中可以看到轉置效果。

Transpose 陣列行列轉置的限制方式

這麼好用的神奇程式碼,有時會莫名其妙的罷工,我們來看看下面的程式碼,執行程式碼將給出“型別不匹配”的錯誤提示,錯誤號為“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 陣列行列轉置的限制方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。