top of page

​タグ一覧

配列処理(73)

階層化フォーム(33)

ファイル操作(28)

開発事例(22)

シート・セル操作(18)

図形操作(13)

コード自動生成(10)

ユーザーフォーム(9)

文字列操作(8)

設計思想(7)

開発効率化(6)

数学(6)

GAS(5)

アニメーション(5)

技術解説(4)

講座実施報告(5)

イミディエイトウィンドウ(4)

Googleスプレッドシート(4)

副業(4)

クリップボード(4)

条件付き書式(4)

その他(4)

ココナラ(3)

小説(3)

HTML(3)

JavaScript(3)

OneDrive(2)

イベントプロシージャ(2)

Enum(2)

PDF(2)

フリーランス(2)

リスキリング(2)

Outlook(2)

介護(2)

Discord(2)

シフト表(2)

LookerStudio(2)

日報(2)

カレンダー(2)

罫線(2)

パズル(2)

小ネタ(2)

コード解説(2)

クラスモジュール(2)

ステータスバー(1)

コード解析(1)

バックアップ(1)

可変長引数配列(1)

ブック処理(1)

スクレイピング(1)

スプレッドシート(1)

coconala(1)

リボン登録マクロ(1)

QRコード(1)

実行予約(1)

給与計算(1)

VBA不使用(1)

リボン(1)

超勉強会(1)

スピログラフ(1)

図名描写(1)

連想配列(1)

溶接ロボット(1)

保育士(1)

楽天市場(1)

経理(1)

医療(1)

文書作成(1)

発注書(1)

ショートカット(1)

WebAPI(1)

色操作(1)

スーパー開発ショートカット(1)

ライブラリ処理(1)

放課後等デイサービス(1)

児童福祉支援(1)

学校(1)

UI(1)

CAD(1)

カーソル操作(1)

Transpose関数の欠点(Excel VBA)

 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関数を通すことで、意図しない型に変換される場合があります。これにより、計算結果や後続の処理に影響を与える可能性があります。


  1. 数値型 (Integer) が倍精度浮動小数点型 (Double) に変換される

    • 元の配列に含まれる整数値が、Transpose関数を通した後には小数点の有無に関係なくDouble型に変換されます。


  2. 日付型 (Date) が文字列型 (String) に変換される

    • 元の配列に含まれる日付データが、Transpose関数を通した後には日付形式の文字列として返されます。


このような型変換の例を実際に確認するためのサンプルコードを以下に示します。このコードでは、変換前後の配列の要素とその型をDebug.Printを用いて表示します。次のコードとその実行結果を通じて、具体的な変換挙動を確認してください。


サンプルコード(型変換の確認)


サンプルコードの実行結果



欠点3: 配列要素数の制限

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


サンプルコード(要素数制限の確認)

 

実行結果(ローカルウィンドウ)



ローカルウィンドウの結果

  1. 65,535要素の場合

    • 配列は正常に転置され、ローカルウィンドウでは以下のように表示されます:

      Variant/Variant(1 to 65535, 1 to 1)

    • これは、1行65,535列の一次元配列が「65535行1列」の二次元配列に正しく転置されたことを示しています。


  2. 65,536要素の場合

    • 配列は正常に転置され、ローカルウィンドウでは以下のように表示されます:

      Variant/Variant(1 to 65536, 1 to 1)

    • 1行65,536列の一次元配列が「65536行1列」の二次元配列に変換されています。


  3. 65,537要素の場合

    • 配列は転置されますが、ローカルウィンドウでは以下のように表示されます:

      Variant/Variant(1 to 1)

    • 本来ならVariant/Variant(1 to 65537, 1 to 1)となるべきですが、そうではありません。


  4. 65,538要素の場合

    • 配列の転置結果はさらに不安定になり、ローカルウィンドウでは以下のように表示されます:

      Variant/Variant(1 to 2, 1 to 1)

    • 本来ならVariant/Variant(1 to 65538, 1 to 1)となるべきですが、そうではありません。



まとめ

 以上のように、WorksheetFunction.Transpose関数の欠点についてまとめました。これらの欠点を踏まえた上で、適切にコーディングを行う必要があること、またこれらの欠点を回避するための代替手段として、専用の汎用プロシージャの利用が有効であることを解説しました。

 今後の記事では、これらの欠点を克服するための汎用プロシージャについても詳しく紹介する予定です。次回の内容もぜひお楽しみにしてください。

Excel VBAによる業務自動化・ツール開発をご検討の方へ

​"脱Excel"の前に、現状のExcelの潜在能力を120%発揮してみませんか?

Softex-Celware

​インボイス登録番号:T5810983887134

  • Facebook
  • Twitter
  • YouTube

©2023 softex-celware。Wix.com で作成されました。

bottom of page