TL;DR —
Application.Transposeは、ワークシートの TRANSPOSE と同じく、配列の行と列を入れ替え ます。VBA で最も役立つ副作用は平坦化です。単一列 の範囲を転置すると Excel が余分な次元を落とし、 1 次元配列 を返します — まさに Join と Filter が 必要とするものです。厳しい制限が 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").Value は 2 次元 の 10 x 1 配列として返ってきます — 厄介です。次に使いたい道具
(Join、Filter)が 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.Transpose は 255 文字を超える テキスト要素に
対処できません — ビルド次第で、切り詰めるか型の不一致を出します。セルが長いメモを持つなら、転置は安全では
ありません。代わりにループします。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 次元配列が返ります。これが Join と
Filter が必要とするものです。
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
