callmekohei's blog

はうあうあ はうあうあ

定時でカエルVBA - 2019-01-22 自分的なトランスポーズ関数 書いたった

Summary

最近書いた関数をさらしてみるぽよ

こんな感じ

''' @param arr2D As Variant(Of Array(Of T, T))
''' @return As Variant(Of Array(Of T, T))
Public Function ArrTranspose(ByVal arr2D As Variant) As Variant

    If Not IsArray(arr2D) Then Err.Raise 13
    If Not ArrRank(arr2D) = 2 Then Err.Raise 13

    Dim lb1 As Long: lb1 = LBound(arr2D, 2)
    Dim ub1 As Long: ub1 = UBound(arr2D, 2)
    Dim lb2 As Long: lb2 = LBound(arr2D, 1)
    Dim ub2 As Long: ub2 = UBound(arr2D, 1)

    Dim tmpArr2D() As Variant
    ReDim tmpArr2D(lb1 To ub1, lb2 To ub2)

    Dim ix1 As Long, ix2 As Long
    For ix1 = lb1 To ub1
        For ix2 = lb2 To ub2
            If IsObject(arr2D(ix2, ix1)) Then
                Set tmpArr2D(ix1, ix2) = arr2D(ix2, ix1)
            Else
                Let tmpArr2D(ix1, ix2) = arr2D(ix2, ix1)
            End If
        Next ix2
    Next ix1

    ArrTranspose = tmpArr2D

End Function

これはなに?

配列の中身を交換する関数ですっ

ワークシートのTranspose関数とほぼ同じです

ちがいはnullでもオーケーというところと

メモリの許す限りやってくれるところ(だと思う)

どんなところで使うの?

たとえばADODBGetRows()とかで、はうあうあな感じの配列がかえってくるのでこれで90度回してあげるといい感じになります

' こんなかんじ
ArrTranspose(rcds.GetRows())))

こんなところで :-)