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にできますのでご活用ください。