• ベストアンサー

配列を任意の数値で埋める方法

VBAを使っていて dim a(256, 256, 256) といった配列を作って、ゼロとか一とか任意の数値で埋めたいのですが forループで代入していく方法はありますか? あるいは、既に数値が入ってある配列をリセットとして空の状態にする簡単な方法ってありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.3

ごめんごめん。(1)は、書き間違えただけ。  Redim a(255, 255, 255): Redim b(255, 255, 255) (1),(2)ともに、Variant型変数の中には配列を格納できるってだけの話です。ややこしくなるので、あまりオススメはしませんが。 まぁ、試してみてください。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.2

>> 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のみコピーとかはどーしてもムリ。 素直にループしても数秒なので、処理の工夫でコピー頻度を減らした方が良いと思います。

MASSYY
質問者

お礼

ありがとうございます。 forループでの書き方は分かっているので、一つ目の方法をもう少し教えていただけないでしょうか? Redim a(255, 255)  Redim b(255, 255) で二次元配列に設定しておいて、 a(1,1,1) = 1 を代入しようとしても3次元目は配列がセットできていないのではないでしょうか? 更に  b = a 'aの中身を全コピ  c = a 'aの中身を全コピ で配列をコピーしようとしても cは配列がセットできていないのではないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

ループくらいは使いこなせるようになりたいですね。。  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でどうぞ。

MASSYY
質問者

お礼

ありがとうございます。 それと Dim a(256,256,256) Dim b(256,256,256) として、ループを使わずに 配列aをbに全コピーあるいは、任意のデータ列だけコピーする方法があれば教えてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 配列入れ替えの効率的方法は

    VBでグローバル変数配列を3000とっています。 格納されているデータを、1つづつずらして代入し直しをやりたいのですが 配列添え字1のデータを配列添え字0にというふうに3000回のループで 処理する以外に良い方法はないでしょうか 例 for i=0 to 2999 a[i]=a[i+1]

  • 多次元配列への数値の代入。

    こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • [arduino]数値の大きなデータを二次配列へ

    シリアル通信で得たデータを二次元配列へ格納するために、 以前では、 if(Serial.available()>120){ for(int k=0;k<8;k++){ for(int l=0;l<15;l++){ //読み込んだ値を配列に代入 matrix[k][l]=Serial.read(); } } } このようなやり方で読み込んだ値を二次元配列に代入していたのですが、 128個以上のデータを扱いたい場合、Serial.availableでは保持できず、困っています。 方法として、 (1)一つずつデータを読み込み、128回ループを繰り返し配列に貯めていく。その後配列を2次元配列に代入する。 (2)一つデータを読みこんだら二次元配列の1行目1列目のドットに格納、もう一つデータを読みこんだら二次元配列の1行目2列目のドットに格納…というように、 読みこんだデータをそのまま二次元配列のそれぞれの場所へ格納していく。 というような二つの方法を思いついたのですが、 (1)の方法では、配列にデータを貯蓄していくコードをこのように↓書いたのですがうまくいかず、 for(int i=0;i<128;i++){ if(Serial.available()>0){ data[128] = Serial.read(); } } (2)の方法では、データを二次元配列のそれぞれの場所へ格納していく指定方法が分かりませんでした。 正しい書き方や、良いアイデアをお持ちの方がいましたら、是非御教授お願いします。

  • 動的配列が存在(要素が有る)か否かを判定できますか?

    VBAで、「For ループが初期化されていません」エラーが発生します。 動的配列が要素0の時に発生するようです。 動的配列の要素が生成された場合だけ、Forループしたいのですが、 どうやって判定すればよいのでしょうか? ------------------------------- Dim 配列() As Integer Dim i As Integer i = 0 If (i < 0) Then ' 本当は真になったり偽になったり ReDim 配列(0 To i) 配列(i) = a + b i = i + 1 End If '' if ★★★ then '' 配列が有るか確認 For Each c In 配列 MsgBox c Next '' end if -------------------------------

  • 配列の中から最大値だけ取り出す方法

    VB 2005,Framework2.0を使用しています。 複数のある配列の中から最大値の値だけを抽出するプログラムを作ろうと思っています。 For等のループを使うのは分かりますが、そこからどの様にコードを書けばいいのか分からなく困っています。 例えば配列にランダムに数値が入っていたとします。 Dim Hako(5) As Integer Hako(0) = 10 Hako(1) = 16 Hako(2) = 31 Hako(3) = 12 Hako(4) = 42 Hako(5) = 5 とあったらこの配列の中の最大値(42)のみを抽出したいです。 宜しくお願いします。

  • VBAで配列内のマッチ

    VBAでfor文などループを使わないで配列の文字列とマッチするかの判定を行いたいのですが、良い方法はありますか? Dim vrnArray As Variant vrnArray = Array("A", "B", "C", "D", "E", "F", "G") で ret = match???? (vrnArray, "C") retは真 のようなことがしたいです。

  • リセットする際に配列に格納されている数値を空の状態にしたいのですが・・・

    宜しくお願い致します。 VB2005でプログラミングをしています。 リセット(コマンドボタンをクリック)する際に配列に格納されている数値を空の状態にしたいのですが・・・プログラミング素人の頭をフル回転させていろいろな方法を試してみたのですが、できませんでしたのでどなたかアドバイスをお願い致します。

  • 【VBA】配列の部分コピー

    VBAにて、配列の範囲を指定して別の配列にコピーしたいと思っています。 現在は以下のようにFor文を使用して1つ1つ代入しているのですが、 もっと効率の良い方法はありますか? 処理速度を重視しています。 Dim srcArray As Variant: srcArray = Range("A1:A100") ' コピー元の配列 Dim dstArray As Variant ' コピー先の配列 Dim startIndex As Integer ' コピーする範囲の開始インデックス Dim endIndex As Integer ' コピーする範囲の終了インデックス startIndex = 6 endIndex = 16 ReDim dstArray(endIndex - startIndex) For si = startIndex To endIndex   dstArray(si - startIndex) = srcArray(si, 1) Next si

  • VBAで配列からbmp画像を出力する方法

    VBAで配列からbmp画像を出力する方法を教えてください。 例えば、 dim a(255,255) で作成した二次元配列があり、それぞれの中に0~255の数値が格納されているとします。 この画像からグレースケールあるいは任意の配色で 256x256の解像度のbmp画像を出力するプログラムを VBAで作りたいのですがどのようにすれば良いですか? 検索して調べたのですが、 http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=54343;id=excel http://akadamashy.blog68.fc2.com/blog-entry-915.html のサイトにビットマップ画像を出力するための プログラムが記載されていました。 しかしながら、どうしても配列からどうやって出力すれば良いか分かりません。 どなたか教えてください。

  • VBAで配列のある部分だけをを配列に入れたい

    VBAを勉強をしております。 例えばA1からG20までをある配列に入れているとします。 その配列のある部分(例えばB1からC20)を、別の配列にいれるにはどうすれば良いのでしょうか。 以下の方法で試してみましたが、上手くいきません。 Dim A() As Variant Dim B() As Variant A = Range("A1:G20") B = Range(Cells(A(1,2),Cells(A(20,3)))