Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3405 / 13645 ツリー ←次へ | 前へ→

【62460】配列をセルに複写させる方法 miyake 09/7/22(水) 23:00 質問[未読]
【62463】Re:配列をセルに複写させる方法 かみちゃん 09/7/22(水) 23:33 発言[未読]
【62466】Re:配列をセルに複写させる方法 かみちゃん 09/7/22(水) 23:55 発言[未読]
【62464】Re:配列をセルに複写させる方法 kanabun 09/7/22(水) 23:36 発言[未読]
【62477】Re:配列をセルに複写させる方法 miyake 09/7/23(木) 23:07 お礼[未読]

【62460】配列をセルに複写させる方法
質問  miyake  - 09/7/22(水) 23:00 -

引用なし
パスワード
   いつもお世話になります。
あるプログラムを作成中ですが、壁にぶつかっていますのでご教示願います。
たとえば、a1からa5に
aaa
bbb
ccc
ddd
eee
というリストがあり、このセルの値をひとつひとつループさせ配列変数(動的)に入れ、その後、配列変数の値を隣の列のセルに転写(貼り付け)したいのです。
転写する際、ひとつひとつの要素をループで戻す方法がありますが、これだとデータ量が多い場合、処理速度が遅くなるため、ループさせずに一気に転写したいのです。
そこで考えたのが、
Sub test()
Dim myList() As String
For i = 1 To 5
  ReDim Preserve myList(i - 1)
  myList(i - 1) = Cells(i, 1)
Next
Range(Cells(1, 2), Cells(5, 2)) = myList
End Sub
上記配列変数の中身はaaa〜eeeが格納されているのですが、上記コードで転写させると、結果は
aaa
aaa
aaa
aaa
aaa
となってしまいます。aaa〜eeeの値をループ処理させずに転写させるにはどうしたらいいのでしょうか。よろしくお願いします。

【62463】Re:配列をセルに複写させる方法
発言  かみちゃん  - 09/7/22(水) 23:33 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> aaa〜eeeの値をループ処理させずに転写させる

myList が一次元配列になっていますので、Transposeを使って二次元にします。
 Range(Cells(1, 2), Cells(5, 2)) = Application.Transpose(myList)

【62464】Re:配列をセルに複写させる方法
発言  kanabun  - 09/7/22(水) 23:36 -

引用なし
パスワード
   ▼miyake さん:
> 結果は
>aaa
>aaa
>aaa
>aaa
>aaa
>となってしまいます。
一次元配列を行方向に貼り付けているから、そうなります。
行数が分かっているのであれば、
Dim myList(1 to 5, 1 to 1)
の2次元配列にセルの値を代入するようにしてください。

> aaa〜eeeの値をループ処理させずに転写させるにはどうしたらいいのでしょうか。

配列を介してなら、
 Dim Arry As Variant
 Arry = Range("A1").Resize(5).Value
 Range("B1").Resize(5).Value = Arry
でしょうか?

でも、
直接値をCopyしちゃってもいいのでは?

 With Range("A1:A5")
   .Offset(,1).Value = .Value
 End With

とか、

 Range("A1:A5").Copy
 Range("B1").PasteSpecial xlPasteValues
 Application.CutCopyMode = True

とかで、どうですか?

【62466】Re:配列をセルに複写させる方法
発言  かみちゃん  - 09/7/22(水) 23:55 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>> aaa〜eeeの値をループ処理させずに転写させる
>
>myList が一次元配列になっていますので、Transposeを使って二次元にします。
> Range(Cells(1, 2), Cells(5, 2)) = Application.Transpose(myList)

kananbunさんのコメントを見て気づきました。

>> Transposeを使って二次元にします。

は間違いです。

Transpose関数を使って、行と列を変換します。

ただし、実は、Transpose 関数の次の制限に注意してください。
・配列に 255 文字を超える要素を含めることはできません。
・配列に Null 値を含めることはできません。
・配列内の要素数が 5461 を超えることはできません。

なお、Excle2003からは要素数の制限が65536になっているそうです。

この制約にひっかかる場合は、kanabunさんの二次元配列案をお試しください。

個人的には、配列に関しての質問かと思っていますので単純にセルの値を転記したい
という内容ではないと思っていますが・・・

【62477】Re:配列をセルに複写させる方法
お礼  miyake  - 09/7/23(木) 23:07 -

引用なし
パスワード
   かみちゃんさん、kanabunさん、アドバイスありがとうございました。配列の仕組みを理解できました。また、分からないことがあったらご質問させて頂きます。ありがとうございました。

3405 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free