スポンサーリンク

配列を使って行列を入れ替えるマクロ(Excel VBA)


配列を使ってワークシート上に並んだデータの行列を入れ替えるマクロ(Excel VBA)を作ってみたので紹介します。

特に目的があったわけではないのですが、誰かの何かのお役に立てばと思います ^^

以下のように行列ぎっしりと詰め込んで並んだデータの行列を入れ替えるものとします。

Image

マクロ実行後はこのように ↓ セル A1 を起点に行列が入れ替わります。

Image(1)

一応作ってようと思ったきかけをお話ししておきますと、同じワークシート上で手作業でデータをコピー後、セルA1を選択して「形式を選択して貼り付け」で「行列を入れ替え」ようとすると以下のようなエラーが出てきたからです。

どうも行列を入れ替えて貼り付ける場合は、既にデータがある場所だと上手く行かないようです。

Image(2)

VBA で上記て手作業と同じことをやってみましたが、やはり同じエラーが出てしまいボツになりました(ボツになったコードも一応最後に示しておきます)。

そこで VBA の配列を使って1つずつデータを読み込み、1つずつ置き換えてみることにしました。

この VBA コード単独で使うことは無いと思うのですが、自分自身何かのツールを作っているときに部分的に使いたい場合も出てくるかも知れませんので。

スポンサーリンク

1、配列を使って行列を入れ替える VBA コード

全 VBA コード

全 VBA コードを以下に示します。

VBA コード説明

一番発想が必要な部分は For 文の使い方でしょうか。

変数の定義

変数 X は2次元配列です。今回、元のデータを読み込むために使っています。

Image(3)

データの数は 10,000 × 10,000 としています。実際にはそんなにデータ数は多くありません。

変数 Xの後の()内に「1 To 10000」と記述することで、インデックス番号は 1 から 10000 までとなります。

今回の場合、2次元なので要素は X(1, 1) から X(10000, 10000) までとなります。

最大行番号・最大列番号の取得

元のデータの最大行番号と最大列番号を取得します。

Image(4)

変数 Max_Row には最大行番号を入れています。

Range(“A1”).End(xlDown)

セルA1 から見て下方向の端のセルを意味します。

Image(5)

そして、

Range(“A1”).End(xlDown).Row

として最後に「.Row」を付けることで上記セルの行番号を意味します。

同様に Max_Col には最大列番号(下図のセルの列番号)を入れます。

Image(6)

元のデータの読み込み

元のデータは For 文を使って配列 X に読み込んでいます。

配列 X(i, j) のインデックス番号は

i が 1 から Max_Row まで

j が 1 から Max_Col まで

で 1行ずつ読み込んで行きます。

Image(7)

元のデータの値をクリア

ClearContents メソッドを使って元のデータの値を消しておきます。

ClearContents メソッドについてはこちらの記事を参考にして下さい。

元のデータの行列を入れ替えて表示

先に読み込んだ元のデータの行列を入れ替えて表示します。

読み込みのときと行列反対にしています。

Image(8)

Image(9)

そして、Cells(ii, jj) に先に読み込んだデータを表示していきます。

Cells(ii, jj) = X(jj, ii)

ポイントはインデックス番号 ii, jj を入れ替えているところです。

これによって行列入れ替わって表示されます。

Image(10)

2、ボツになった VBA コード

さて、最初に書きましたボツになったコードを一応書いておきますね。

コピーしてから行列入れ替えて貼り付ける作業を VBA でやったものです。

このコードだとエラーが出てしまいうまく行きませんでした。

3、まとめ

配列を使ってワークシート上に並んだデータの行列を入れ替えるマクロ(Excel VBA)を紹介しました。

for 文を使えば多少のアイデアで色々なことができますね。

編集後記

5月申告の対応に追われています。

金曜の夜には飲みがあり、土曜も予定が入っているのでそれを楽しみに頑張ります。