ここから本文です

エクセルマクロで、配列の結合(?

うんたんさんさん

2019/1/2121:07:47

エクセルマクロで、配列の結合(?

)について

Sub あいうえお()
Dim asd
asd = Range("A1:A5")
End Sub

上記で、asdは縦5×横1の2次元の配列になっていると思います。
ここで、asdを
ReDim Preserve asd(1 To 5, 1 To 2)
として、縦5横2の2次元配列に拡張しました。
そこで、追加した縦5行のカラムにE1:E5を追加したいです。
最初にasdを asd = Range("A1:A5")と指定したように
イメージとして asd(*,2) = Range("E1:E5")と一括で設定したいです。
for next で、

For i = 1 To 5
asd(i, 2) = Cells(i, "E").Value
Next i

と個別に格納していくしかないでしょうか?

あと、
ReDim Preserve asd(1 To 5, 1 To 2)
の部分を、asd(5,2)とするとエラーになります。
asd (variant) をセル範囲に設定すると、asdの添え字(?)は自動的に1からスタートになるようですが、
asd(5,2)
として、 0~5の縦6 × 0~2の横3 のような0番目の部屋を作ることはできないということでしょうか?

ご教示いただければ幸いです。

閲覧数:
66
回答数:
3
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tra********さん

2019/1/2121:53:25

>個別に格納していくしかないでしょうか?
そう思います。

>asd(5,2)とするとエラーになります。
Redimのヘルプに↓の記述があります。

Preserve を指定した場合、変更できるのは、動的配列の最後の次元のサイズに限られます。また、次元数は変更できません。たとえば、次元が 1 つしかない動的配列の場合、その次元は最後のただ 1 つの次元なので、その次元のサイズを変更できます。次元が 2 つ以上ある動的配列の場合、最後の次元のサイズのみを変更でき、その配列に格納されている値は保持されます。

なので、
asd(1 To 5, 1 To 1)

asd(1 To 5, 1 To 2)
とするのはOK。
「asd(5,2)とするとエラーになります。」のは、「1 To 5」を「0 To 5」にしている部分がエラーになっているということ。

なので、
>0番目の部屋を作ることはできないということでしょうか?
2次元目のサイズを変更するのは、問題ないです。

Private Sub IMAGE()
Dim asd
asd = Range("A1:A5")
ReDim Preserve asd(1 To 5, 0 To 2)
End Sub

1次元目のサイズを変更したいのであれば、↓のような方法をとれば可能です。

Private Sub sample()
Dim asd0, asd1
asd0 = Range("A1:A5")
asd1 = WorksheetFunction.Transpose(asd0)
ReDim Preserve asd1(1 To 6)
asd0 = WorksheetFunction.Transpose(asd1)
End Sub

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/1/22 17:36:20

ありがとうございます。
transposeは使ったことがなかったので勉強してマスターします★

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

アバター

ID非公開さん

2019/1/2122:18:33

それはちょっと難しいと思うけれども、1次元配列と1次元配列をマージして別の2次元配列に入れるのだったら割と簡単に出来ます。

Sub Sample()
Dim asd, foo
asd = Range("A1:A5")
foo = T(Array(T(asd), T(Range("E1:E5"))))
End Sub

Function T(V As Variant) As Variant
T = WorksheetFunction.Transpose(V)
End Function

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

webnaveさん

2019/1/2121:41:00

多次元配列の場合
ReDim で変更可能なのは最終次元のみ


↓参考サイト↓
VBA ReDimはなぜ最後の次元だけしか拡張できないのか。
https://thom.hateblo.jp/entry/2015/12/26/014523


なので
配列(x,y)の場合はyしか変えることは出来ない
---
>0番目の部屋を作ることはできないということでしょうか?

ReDim Preserve asd(1 To 5, 2)

これは実行可能、実行後は
asd(1 To 5, 0 to 2) となるが1次元目の数値は変更できないため0 to 5にすることは出来ない

どうしても(5,2)の配列にしたい場合は、別の配列を用意して移し替えるしか無い

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる