まずは、以下をご覧ください。リーグ戦の総当たり表のようなイメージです。

この表をVBAで対戦数を入力するとなると、行、または列のごとにループさせて、対戦数を入力するというプログラムになると考えました。

ところが、どうせ同じ数が入力されるのであれば、コピーして、行列を入れ替えて貼り付けるという方法でもいいんじゃないかと考えました。

今回は、青枠に入っているデータを行列変換して、赤枠にコピーするというコードをご紹介します。

 

行と列を入れ替えるコード

以下のコードは、WorksheetFunctionのTranspose関数を使っています。

Sub 行列入れ替え()
    
    ' 行列を入れ替える
    Range("F4:F13") = WorksheetFunction.Transpose(Range("E5:N5"))

End Sub

WorksheetFunctionとは、Excelの関数をVBAの中で使うようなものになります。

私はVBAとかじゃなく、単にExcel操作が得意なので、Transpose関数も知っていましたし、使っているのですが、VBAでも使えるというのは、わたしにとって、非常にイメージがしやすいものになっています。

 

このコードを利用する上でのポイントはコピー前後の範囲を一致させることです。範囲が一致していない場合、エラーは起こらず、単純にコピーされません。

 

Transpose関数を使わない方法

前述の方法では、Transpose関数を使って、行列の変換をしていますが、他に方法はないのでしょうか?

 

もうひとパターン考えました。任意の範囲をコピーして、行列入れ替えをして貼り付ける。というものです。

Sub 行列入れ替え_test()
    
    ' 行列を入れ替える
    Range("E5:N5").Copy
    Range("F4:F13").PasteSpecial Transpose:=True

End Sub

 

今回の例では、青枠の部分を赤枠に貼り付けるというものなので、重複している範囲となり、このコードではうまくいきませんでした。

 

このコードを使って、上記を実現するには、コピーした範囲を一度重複しない場所に貼り付けて、切り取って、対象の範囲に貼り付ける。。。

ということも考えましたが、なんだか面倒ですし、分かりづらいので、Transpose関数を使うことにしました。

 

さいごに

リーグ戦の総当たり表を作る機会なんて少ないかもしれませんが、リーグのスコアが別シートにあって、その結果を自動的に総当たり表の中に入力するということはたまーにあるかもしれませんね。(いや、人事とかやってたらそんなことないんですけど。。)

今回のコードは、グループワークを行う研修の中で、同じ組み合わせが少なくなるように最適化するという仕組みの中で必要になったロジックでした。

 

ぜひ使ってみてください。

 

ではまた。