質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

4878閲覧

ExcelVBAで、コードで生成した可変長の配列をセルに張りつけたい

funmas

総合スコア31

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/07/19 07:53

前提・実現したいこと

コードで作成した配列を、まとめて貼り付けたい。
※サイズの変動する配列を貼り付ける為、Resizeを使用したい。

Resizeでなくとも、可変長の配列を貼り付けられるのであれば、
手段は何でも構いません。

発生している問題・エラーメッセージ

下記ソースコードで貼り付けた結果、
F1~F3に、「aa」「aa」「aa」と表示されます。

該当のソースコード

Dim temp: temp = Array() ReDim Preserve temp(UBound(temp) + 1) temp(UBound(temp)) = "aa" ReDim Preserve temp(UBound(temp) + 1) temp(UBound(temp)) = "bb" ReDim Preserve temp(UBound(temp) + 1) temp(UBound(temp)) = "cc" シート.Range("F1").Resize(UBound(temp, 1) + 1).value = temp

試したこと

Resizeが二次元配列だった場合については、
問題なく貼り付けることができましたが、
一次元配列になると途端に上手くいきません。
二次元配列(中身は1列)の場合は、参照した範囲で実行してますので下記のようなものです。

Dim temp: temp= シート.Range("A1:A3").value シート.Range("F2").Resize(UBound(temp, 1), UBound(temp, 2)).value = temp

補足情報(FW/ツールのバージョンなど)

Microsoft Excel 2010

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

解決済みですが、参考までに。

可変長の一次元配列(動的配列)でも、Transpose関数で、縦一列の二次元配列に変換できます。

vba

1Dim temp: temp = Array() 2ReDim Preserve temp(UBound(temp) + 1) 3temp(UBound(temp)) = "aa" 4ReDim Preserve temp(UBound(temp) + 1) 5temp(UBound(temp)) = "bb" 6ReDim Preserve temp(UBound(temp) + 1) 7temp(UBound(temp)) = "cc" 8 9temp = WorksheetFunction.Transpose(temp) 10シート.Range("F1").Resize(UBound(temp)).Value = temp

Transpose関数の制限

Null値を含む配列はエラーがでるなどの制限があるようです。
詳細は下記のリンク先の後半の「後日談」を参照ください。

動的2次元配列の次元を入れ替えてシートへ出力(Transpose)|VBA技術解説

投稿2018/07/19 12:20

編集2018/07/30 11:11
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2018/07/19 23:33

そんな技があったのですね。さすが。 funmasさん 断然こちらをお勧めします。
funmas

2018/07/30 02:50

気付くのが遅れ、返事が遅くなってしまいました。 コードをさらに短くできるのですね。 ttyp03さんのお勧めということもあり、BAを移動させていただきます。 お二方本当にありがとうございました。
guest

0

一次元配列を貼り付けた場合、横方向のデータとして扱われてしまうようです。
配列をセルに一括で代入する
なので先頭のaaだけが縦方向に並んでしまいます。

正しく貼り付けるには二次元配列にするしかなさそうですが、可変長の二次元配列は最終次元しか可変にすることができません。
[VBA]多次元配列のRedimは最終次元しか変更できない

なので一次元配列でデータを作成してから二次元配列に移し変えてやる必要がありそうです。
こんな感じ。

VBA

1Dim temp: temp = Array() 2ReDim Preserve temp(UBound(temp) + 1) 3temp(UBound(temp)) = "aa" 4ReDim Preserve temp(UBound(temp) + 1) 5temp(UBound(temp)) = "bb" 6ReDim Preserve temp(UBound(temp) + 1) 7temp(UBound(temp)) = "cc" 8 9ReDim temp2(UBound(temp), 0) 10For i = 0 To UBound(temp) 11 temp2(i, 0) = temp(i) 12Next 13 14シート.Range("F1").Resize(UBound(temp) + 1).Value = temp2

投稿2018/07/19 08:29

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

funmas

2018/07/19 08:53

回答ありがとうございます! 横向きになってしまっていたのですね。。 頂いた二次元に移し替えるプログラムで無事動かせることができました。 助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問