プロが教える店舗&オフィスのセキュリティ対策術

VBAを使っていて
dim a(256, 256, 256)
といった配列を作って、ゼロとか一とか任意の数値で埋めたいのですが
forループで代入していく方法はありますか?


あるいは、既に数値が入ってある配列をリセットとして空の状態にする簡単な方法ってありますか?

A 回答 (3件)

ごめんごめん。

(1)は、書き間違えただけ。
 Redim a(255, 255, 255): Redim b(255, 255, 255)

(1),(2)ともに、Variant型変数の中には配列を格納できるってだけの話です。ややこしくなるので、あまりオススメはしませんが。
まぁ、試してみてください。
    • good
    • 0

>> ANo.1の補足


VBAは配列操作弱いので、ループ使わないと厳しいです。
かなり強引になりますが・・・

(1) 全コピは、動的配列にすれば可能
 Dim a, b, c
 Redim a(255, 255)
 Redim b(255, 255)
 a(1,1,1) = 1
 b = a 'aの中身を全コピ
 c = a 'aの中身を全コピ
変数の中に配列が入った2重構造のイメージ。a,bはVariant型なので代入が効きます。Redimし直せば値クリア。

(2) 部分コピーは、配列を入れ子にすることで・・・
 Dim a(255, 255), b(255, 255), z
 Redim z(255)
 for i = 0 to 255
  for j = 0 to 255
   a(i, j) = z
   b(i, j) = z
  next
 next
 a(1, 1)(1) = 1
 b(1, 1) = a(1, 1) '1,1,n列のみコピー
部分コピーはできませんが、入れ子にすれば、代入になります。

(1),(2)の組み合わせで、ある程度は誤魔化しがききます。ただ、無駄に複雑ですし、添え字1~100のみコピーとかはどーしてもムリ。
素直にループしても数秒なので、処理の工夫でコピー頻度を減らした方が良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

forループでの書き方は分かっているので、一つ目の方法をもう少し教えていただけないでしょうか?

Redim a(255, 255)
 Redim b(255, 255)
で二次元配列に設定しておいて、
a(1,1,1) = 1
を代入しようとしても3次元目は配列がセットできていないのではないでしょうか?
更に
 b = a 'aの中身を全コピ
 c = a 'aの中身を全コピ
で配列をコピーしようとしても
cは配列がセットできていないのではないでしょうか?

お礼日時:2013/03/02 16:42

ループくらいは使いこなせるようになりたいですね。


 For i = 0 to 256
  For j = 0 to 256
   For k = 0 to 256
    a(i, j, k) = 0
   Next
  Next
 Next

配列や変数は、Eraseで初期値に戻せます。
 Dim a(256,256,256) 'Variant型:初期値Empty
 a(1, 1, 1) = 1
 Erase a '全部Emptyにもどる

動的配列の場合、Eraseで要素数(Redim)ごと初期化されるので注意してください。
初期値は、データ型によって異なります。初期値は、Variant型(型指定なし)ならEmpty、数値型なら0、文字列なら""。Emptyは0や""と同じ扱いができるので、あまり意識しなくて良いですが。

任意の値を入れるならループ。クリアだけならEraseでどうぞ。
    • good
    • 0
この回答へのお礼

ありがとうございます。

それと
Dim a(256,256,256)
Dim b(256,256,256)

として、ループを使わずに
配列aをbに全コピーあるいは、任意のデータ列だけコピーする方法があれば教えてください。

お礼日時:2013/02/17 17:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています