🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の Transpose — 配列を組み替え、列を 1 次元に平坦化する

|

Excel VBA の Transpose — 配列を組み替え、列を 1 次元に平坦化する

TL;DRApplication.Transpose は、ワークシートの TRANSPOSE と同じく、配列の行と列を入れ替え ます。VBA で最も役立つ副作用は平坦化です。単一列 の範囲を転置すると Excel が余分な次元を落とし、 1 次元配列 を返します — まさに JoinFilter が 必要とするものです。厳しい制限が 2 つ。これは Application.Transpose(ワークシート関数)であって、 素の Transpose ではないこと、そして黙って 65,536 要素で頭打ちになる こと。だからこれは組み替え の便利道具であって、大きなデータのエンジンではありません。

Sub TransposeDemo()
    Dim col As Variant, flat As Variant

    col = Range("A1:A5").Value              ' 2 次元配列: 5 行 x 1 列
    Debug.Print UBound(col, 1)              ' 5   <- 第 1 次元
    Debug.Print UBound(col, 2)              ' 1   <- 第 2 次元(サイズ 1)

    flat = Application.Transpose(col)       ' 列を畳み込む -> 1 次元配列
    Debug.Print UBound(flat)                ' 5   <- 今や 1 次元、Join の準備ができた
    Debug.Print Join(flat, ", ")            ' 列全体を 1 つの文字列に、ループなし
End Sub

この記事で学べること

  • 考え方の軸 — Transpose は組み替え、その必殺技は列を 1 次元に平坦化すること
  • なぜ直接呼べる素の Transpose ではなく Application.Transpose なのか
  • 列の平坦化と行の平坦化(そして単一行のための二重転置)
  • 大きなデータを壊す 65,536 要素の静かな上限
  • もう 2 つの静かな失敗:255 文字を超える文字列とエラーを含む配列

考え方の軸:組み替え — そして平坦化という必殺技

額面どおりには Application.Transpose は 1 つのことをします。行と列を入れ替えるので、3 x 2 の ブロックは 2 x 3 になります — 行列を入れ替えて貼り付けるのや、ワークシートの =TRANSPOSE() 関数と まったく同じです。それがときには欲しいものです — たとえば横の見出し行を縦のリストに変える、など。

しかし VBA での本当の日常的な価値は、その入れ替えの副作用です。単一列の範囲を読むと、 Range("A1:A10").Value2 次元10 x 1 配列として返ってきます — 厄介です。次に使いたい道具 (JoinFilter)が 1 次元配列だけ を受け取るからです。 10 x 1 の配列を転置すると Excel が幅 1 の次元を畳み込み、きれいな 1 次元配列を返します。この一手 — セルから 1 次元配列へ — こそ、Transpose が Join や Filter と同じ道具箱に属する理由です。

Dim names As Variant
names = Application.Transpose(Range("A2:A100").Value)   ' 列 -> 1 次元配列
names = Filter(names, "Ltd")                             ' これで Filter が受け取れる

素の Transpose ではなく Application.Transpose

Transposeワークシート関数 であって、VBA 言語のキーワードではありません。だから単独では呼べ ません — x = Transpose(arr) は「Sub または Function が定義されていません」というコンパイルエラー です。Application オブジェクト(または同等の Application.WorksheetFunction)を通して届かなければ なりません。

flat = Application.Transpose(arr)                  ' いつもの書き方
flat = Application.WorksheetFunction.Transpose(arr) ' ここでは同じ結果

2 つの書き方が違うのは、失敗の報告の仕方だけです。WorksheetFunction.Transpose は入力が不正なとき捕捉 できる実行時エラーを出しますが、素の Application.Transpose は結果の中にエラー を返す傾向があり ます。配列の組み替えには Application.Transpose が慣例的な選択です — ただ Application. の接頭辞が必須 であることだけ覚えておきましょう。

列の平坦化と行の平坦化

単一の は 1 回の転置で平坦化します。n x 1 を転置した結果は本物の 1 次元配列だからです。単一の 1 x n)は逆の問題です — Range("A1:E1").Value を読むとやはり 2 次元配列になり、1 回の転置では それが n x 1 の列になるだけで、まだ 2 次元です。行から 1 次元配列を得るには、2 回 転置します。

Dim rowVals As Variant
rowVals = Application.Transpose(Application.Transpose(Range("A1:E1").Value))  ' 行 -> 1 次元

奇妙に見えますが、これは標準の定石です。1 回目の転置で列にし、2 回目でその列を 1 次元に畳み込みます。この 非対称性を焼き付けてください — 列は 1 回、行は 2 回の転置が必要です。

本番で刺さる罠:65,536 要素の上限

Application.Transpose は、古いワークシートのグリッドから受け継いだ制限を抱えています。1 つの次元で 65,536 要素 を超えて扱えないのです。100,000 行の列を転置しても警告してくれません — 古いビルドでは 65,536 で切り詰め、今どきのビルドでは実行時エラーを出します。どちらにせよ静かな地雷です。数百行のあらゆる テストでは完璧に動くのに、誰かがフルのエクスポートで走らせた日に失敗するからです。

' ⚠ 小さいデータでは動くが、65,536 行を超えると壊れる
flat = Application.Transpose(Range("A2:A200000").Value)   ' 切り詰めるかエラー

データが大きくなりうるなら、Transpose に頼ってはいけません。2 次元配列を、自分で寸法を決めた 1 次元配列に ループで移し替えましょう — 上限のない十数行です — そして Transpose は、それが得意とする人間サイズの 組み替えのために取っておきます。

Dim src As Variant, flat() As String, i As Long
src = Range("A2:A200000").Value
ReDim flat(1 To UBound(src, 1))
For i = 1 To UBound(src, 1)
    flat(i) = CStr(src(i, 1))
Next i

もう 2 つの静かな失敗:長い文字列とエラー値

もう 2 つのエッジが人を捕まえます。1 つ目、Application.Transpose255 文字を超える テキスト要素に 対処できません — ビルド次第で、切り詰めるか型の不一致を出します。セルが長いメモを持つなら、転置は安全では ありません。代わりにループします。2 つ目、元の配列がセルの エラー値#N/A#REF!)を含むと、 Transpose はそれを伝播させるか詰まらせ、失敗が原因から遠く離れたところで表面化します。組み替える前に エラー値を掃除するかガードしましょう。これらは無名の隅っこではありません — データ列に紛れ込んだ 1 つの #N/A こそ、動いていたマクロを気まぐれなものに変える類のものです。

意見:組み替えは便利であって、データパイプラインではない

Application.Transpose は 2 つの正直な仕事で元を取ります。小さなブロックを入れ替えること、そして — はるかに多くの場合 — 単一の列を、Join と Filter が要求する 1 次元配列に平坦化することです。その平坦化 こそ、このクラスターの 3 つの関数が噛み合う理由です。Transpose がセルを配列にし、Filter が部分集合を取り、 Join がそれを文字列に畳み込み直す、どれもループなしで。

ただし上限は尊重しましょう。データが約 65,000 行を超えうる、長いテキストを持ちうる、エラー値を運びうる、 その瞬間に、Transpose は信頼できる道具であることをやめ、気まぐれなバグになります。そこでは、自分で寸法を 決めた配列に移し替える退屈な For ループがプロの選択です — 隠れた制限がなく、やることをそのまま言い 表しています。Transpose は人間サイズのデータの組み替えに使い、大きなデータのルーチンの荷重を支える工程には 決して使わないこと。

ExcelMaster の活用

組み替えることが目的であることは決してありません — それは「この列をカンマ区切りのリストにする」や 「これらの見出しをルックアップ表に組み替える」への道すがらの摩擦です。列を平坦化し、65,536 の上限を かわし、エラー値をガードし終える頃には、配管が、欲しかった 1 つのものを埋もれさせてしまいます。 ExcelMaster なら、その仕事を 普通の言葉で — 「B 列のアクティブな SKU をカンマ区切りの一覧にして」 — と言うだけです。そして、どんな サイズでも範囲を読み、扱いにくい値を処理し、書き込む前にファイルをバックアップする Python を生成します。 あなたは出力を説明するだけ。サイズも、長いテキストも、組み替えを壊すエラー値も、それが処理します。

よくある質問

VBA の Application.Transpose は何をしますか?

配列の行と列を入れ替えます。ワークシートの TRANSPOSE 関数と同じです。日常の VBA で最も役立つ効果は 平坦化です。単一列の範囲を転置すると余分な次元が畳み込まれ、1 次元配列が返ります。これが JoinFilter が必要とするものです。

VBA で Transpose を直接呼べないのはなぜですか?

Transpose が VBA のキーワードではなくワークシート関数だからです。Transpose(arr) を単独で呼ぶと コンパイルエラーになります。Application オブジェクトを通して届きましょう。Application.Transpose(arr)Application.WorksheetFunction.Transpose(arr) です。

VBA で列を 1 次元配列にするには?

列を読み、1 回転置します。Application.Transpose(Range("A1:A10").Value) です。単一列の 2 次元配列は、 本物の 1 次元配列に転置されます。単一行の場合は、1 回の転置では行が列になるだけなので、2 回転置します。

VBA の Transpose が大きな範囲で失敗するのはなぜですか?

Application.Transpose は 1 つの次元で 65,536 要素を超えて扱えません — 古いワークシートのグリッドから 受け継いだ制限です。大きな範囲では、古いビルドでは切り詰め、今どきのビルドでは実行時エラーを出します。 大きなデータには、代わりに自分で寸法を決めた 1 次元配列に配列をループで移し替えましょう。

VBA の Transpose はテキストやエラー値で動きますか?

確実には動きません。Application.Transpose は 255 文字を超える文字列を誤って扱い、#N/A のようなセルの エラー値を伝播させるか詰まらせます。データが長いテキストやエラーを含みうるときは、それらの値を掃除するか、 明示的なループを使いましょう。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-03.

関連ガイド: VBA Join · VBA Filter · VBA Split · VBA Array · VBA Range