top of page

​タグ一覧

配列処理(67)

階層化フォーム(33)

ファイル操作(23)

シート・セル操作(11)

コード自動生成(10)

ユーザーフォーム(8)

図形操作(7)

GAS(5)

アニメーション(5)

技術解説(4)

副業(4)

考え方(4)

条件付き書式(4)

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

Enum(3)

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

ココナラ(3)

クリップボード(3)

介護(3)

開発効率化(2)

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

PDF(2)

フリーランス(2)

リスキリング(2)

Excel(2)

Excel小ネタ(2)

数学(2)

Outlook(2)

文字列操作(2)

小説(2)

HTML(2)

JavaScript(2)

日報(2)

カレンダー(2)

パズル(2)

ステータスバー(1)

コード解析(1)

静的変数(1)

OneDrive(1)

バックアップ(1)

可変長引数配列(1)

ブック処理(1)

スクレイピング(1)

スプレッドシート(1)

coconala(1)

リボン登録マクロ(1)

QRコード(1)

実行予約(1)

給与計算(1)

VBA不使用(1)

リボン(1)

超勉強会(1)

六角形(1)

Excel遊び(1)

ボウリング(1)

時計(1)

スピログラフ(1)

図名描写(1)

連想配列(1)

イベント(1)

溶接ロボット(1)

VBA(1)

脱Excel(1)

Discord(1)

ECサイト(1)

CSV(1)

楽天(1)

保育士(1)

シフト表(1)

CDP(1)

楽天市場(1)

経理(1)

javascript(1)

医療(1)

文書作成(1)

LookerStudio(1)

シフト(1)

セキュリティ(1)

発注書(1)

ショートカット(1)

WebAPI(1)

色操作(1)

罫線(1)

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

ライブラリ処理(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列の二次元配列を渡すと、一次元配列に変換される挙動も見られます。


サンプルコード(配列の変換挙動確認)


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

ree


欠点2: 勝手に型が変換される問題

 配列の要素がTranspose関数を通すことで、意図しない型に変換される場合があります。これにより、計算結果や後続の処理に影響を与える可能性があります。


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

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


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

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


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


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


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

ree



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

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


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

 

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

ree


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

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

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

Softex-Celware

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

  • Facebook
  • Twitter
  • YouTube

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

bottom of page