Quantcast
Channel: t-hom’s diary
Viewing all articles
Browse latest Browse all 493

VBA TRANSPOSE関数で一次元データのみの二次元配列を一次元配列に変換する。

$
0
0

VBAでは、セル範囲と配列の相互変換ができるが、たとえ1列分しか変換しなくても二次元配列となってしまう。

参考
infoment.hatenablog.com

VBAのJoin関数でひとつの文字列に加工しようと思ったら色々と工夫が必要なのだが、実はワークシート関数のTRANSPOSEを使うと簡単にできるという裏技がある。

たとえば次のようなデータを用意する。
f:id:t-hom:20180802072110p:plain

これを二次元配列arrとして読み込み、Transpose関数を使って一次元配列arr2を作る。あとはJoinするだけ。

Sub一次元データのみの二次元配列のJoin()Dim arr: arr = Range("A1:A3")Dim arr2: arr2 = WorksheetFunction.Transpose(arr)MsgBoxJoin(arr2,vbNewLine)EndSub

次に行データだったらどうするか。
f:id:t-hom:20180802072255p:plain

そのままではうまくいかないので、Transposeを2回かませて列データに変更する。

Sub一次元データのみの二次元配列のJoin_行バージョン()Dim arr: arr = Range("A1:C1")Dim arr2: arr2 = WorksheetFunction.Transpose(arr)Dim arr3: arr3 = WorksheetFunction.Transpose(arr2)MsgBoxJoin(arr3,vbNewLine)EndSub

参考

この事実を教えてくれたのはこちらのサイト。感謝。
配列研究室 STEP 3

上記サイトではEvaluate関数の短縮表記である[]を使って更に短く書いている。
今回のケースに適用すると、以下のとおり。

Sub一次元データのみの二次元配列のJoin_行バージョン()MsgBoxJoin([TRANSPOSE(TRANSPOSE(A1:C1))],vbNewLine)EndSub

ただこれだとセル範囲がベタ書きになってしまうので、ThisWorkbookからRangeまで確実に指定したい時に応用が利かない。
※↓こう書きたい場合のこと

Sub一次元データのみの二次元配列のJoin_行バージョン()Dim arr: arr = ThisWorkbook.Sheets(1).Range("A1:C1")Dim arr2: arr2 = WorksheetFunction.Transpose(arr)Dim arr3: arr3 = WorksheetFunction.Transpose(arr2)MsgBoxJoin(arr3,vbNewLine)EndSub

[]を使わずに少し短くしようと思ったら、こうかな?

Sub一次元データのみの二次元配列のJoin_行バージョン()Dim arr: arr = ThisWorkbook.Sheets(1).Range("A1:C1")With WorksheetFunction
        MsgBoxJoin(.Transpose(.Transpose(arr)))EndWithEndSub

8/3 余談追記

この記事でリンクした「配列研究室 STEP 3」はExcel研究室の一角だった。
www.clayhouse.jp

しかも結構濃い目の書籍を出版されている土屋さんのサイトだった。
感謝の意を込めていくつか紹介させていただく。

こちらは今となっては珍しいWord VBA本。

こちらは残念ながら絶版してるけど、Evaluateの短縮表記[]はこの書籍で覚えた。イミディエイトウインドウを活用した即席1行コードが沢山紹介されている希少本。

EXCEL VBA 1行コード活用辞典 (CD-ROM付き)

EXCEL VBA 1行コード活用辞典 (CD-ROM付き)

こちらはExcelの配列を扱った専門書。VBAではなくてExcelの配列数式ってのがポイント。

こちらは2016年発刊なので比較的最近の本。
上の3点に比べるとクセのない王道的なVBA本かなと思う。


以上。


Viewing all articles
Browse latest Browse all 493

Trending Articles