和風スパゲティのレシピ

日本語でコーディングするExcelVBA

34本目:配列の左右回転

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:配列の左右回転

#VBA100本ノック 34本目
今回は2次元配列を使った頭の体操です。
2次元配列と回転方向を引数で受け取り、以下の変換後の配列を返すFunctionを作成してください。
回転方向は2種類
・右90度回転
・左90度回転
※引数のデータ型、指定方法は任意
※回転サンプルは画像を参照

配列の回転

◇ 出題ページはこちら

ソースコード

Option Explicit

' 100本ノック034:列の左右回転
Function 配列を90度回転する(ByVal Arr元配列, ByVal is右回転 As Boolean) As Variant
    Dim R1st As Long, RLast As Long, C1st As Long, CLast As Long
    
    ' 引数チェック(Rangeでも動くように.Valueを挟む)
    If IsArray(Arr元配列) = False Then Exit Function
    If TypeName(Arr元配列) = "Range" Then
        Arr元配列 = Arr元配列.Value
    End If
    
    R1st = LBound(Arr元配列, 1): RLast = UBound(Arr元配列, 1)
    C1st = LBound(Arr元配列, 2): CLast = UBound(Arr元配列, 2)

    ' 行列数を反転させた配列を用意
    Dim Arr結果配列()
    ReDim Arr結果配列(C1st To CLast, R1st To RLast)

    ' 元配列の全要素を順にループ
    Dim R As Long, C As Long
    For R = R1st To RLast
        For C = C1st To CLast
            
            ' 要素番号を回転させて代入
            If is右回転 Then
                Arr結果配列(C, RLast - (R - R1st)) = Arr元配列(R, C)
            Else
                Arr結果配列(CLast - (C - C1st), R) = Arr元配列(R, C)
            End If
        Next
    Next
  
    配列を90度回転する = Arr結果配列
End Function

解説

配列の要素を回転させる問題でした。

結果配列を作成して順に代入していくだけですので、
ソースコード以上に解説する部分はないかなと思います。


配列を受け取る関数で注意すべき点は、
セル範囲(Range)に対してもIsArrayがTrueになってしまう点です。

「Rangeだったら.Valueで配列化」という処理を挟むことで、
セル範囲に対しても実行できるFunctionにできますのでご活用ください。