Transpose関数の欠点(Excel VBA)
- yuji fukami
- 1月9日
- 読了時間: 3分
Excel VBAでよく利用されるWorksheetFunction.Transpose関数には、便利である一方で、3つの欠点があります。本記事では、それらの欠点を説明するとともに、それぞれを確認するためのサンプルコードを紹介します。
欠点1: 一次元配列と二次元配列の変換挙動がわかりづらい
WorksheetFunction.Transpose関数は、一次元配列と二次元配列を処理する際に、挙動がわかりづらい結果を返すことがあります。具体的な事例を以下に示します。
例1: 零基点の一次元配列の処理
一次元配列Array(0, 1, 2, ..., 10)をTranspose関数で処理すると、結果は「1行11列」の二次元配列ではなく、「11行1列」の二次元配列に変換されます。
例2: 二次元配列の変換
1行10列(1×10)の二次元配列をTranspose関数に渡すと、「10行1列」の二次元配列に変換されます。逆に、10行1列の二次元配列を渡すと、一次元配列に変換される挙動も見られます。
サンプルコード(配列の変換挙動確認)
サンプルコードの実行結果

欠点2: 勝手に型が変換される問題
配列の要素がTranspose関数を通すことで、意図しない型に変換される場合があります。これにより、計算結果や後続の処理に影響を与える可能性があります。
数値型 (Integer) が倍精度浮動小数点型 (Double) に変換される
元の配列に含まれる整数値が、Transpose関数を通した後には小数点の有無に関係なくDouble型に変換されます。
日付型 (Date) が文字列型 (String) に変換される
元の配列に含まれる日付データが、Transpose関数を通した後には日付形式の文字列として返されます。
このような型変換の例を実際に確認するためのサンプルコードを以下に示します。このコードでは、変換前後の配列の要素とその型をDebug.Printを用いて表示します。次のコードとその実行結果を通じて、具体的な変換挙動を確認してください。
サンプルコード(型変換の確認)
サンプルコードの実行結果

欠点3: 配列要素数の制限
WorksheetFunction.Transpose関数は、配列の要素数が65,536以下であれば正常に動作しますが、65,537以上になると挙動が不安定になり、想定外の結果を返す場合があります。サンプルコードの実行結果でローカルウィンドウの中身を基にした詳細な説明です。
サンプルコード(要素数制限の確認)
実行結果(ローカルウィンドウ)

ローカルウィンドウの結果
65,535要素の場合
配列は正常に転置され、ローカルウィンドウでは以下のように表示されます:
Variant/Variant(1 to 65535, 1 to 1)
これは、1行65,535列の一次元配列が「65535行1列」の二次元配列に正しく転置されたことを示しています。
65,536要素の場合
配列は正常に転置され、ローカルウィンドウでは以下のように表示されます:
Variant/Variant(1 to 65536, 1 to 1)
1行65,536列の一次元配列が「65536行1列」の二次元配列に変換されています。
65,537要素の場合
配列は転置されますが、ローカルウィンドウでは以下のように表示されます:
Variant/Variant(1 to 1)
本来ならVariant/Variant(1 to 65537, 1 to 1)となるべきですが、そうではありません。
65,538要素の場合
配列の転置結果はさらに不安定になり、ローカルウィンドウでは以下のように表示されます:
Variant/Variant(1 to 2, 1 to 1)
本来ならVariant/Variant(1 to 65538, 1 to 1)となるべきですが、そうではありません。
まとめ
以上のように、WorksheetFunction.Transpose関数の欠点についてまとめました。これらの欠点を踏まえた上で、適切にコーディングを行う必要があること、またこれらの欠点を回避するための代替手段として、専用の汎用プロシージャの利用が有効であることを解説しました。
今後の記事では、これらの欠点を克服するための汎用プロシージャについても詳しく紹介する予定です。次回の内容もぜひお楽しみにしてください。