OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

2次元配列の初期値

  • 暇なときにでも
  • 質問No.152357
  • 閲覧数4775
  • ありがとう数0
  • 気になる数1
  • 回答数4
  • コメント数0

お礼率 17% (17/95)

こんにちは
VBで2次元配列に初期値をまとめて入れる方法がわからなくて困っています。
簡単なはずなのにわかりません。
教えてくれるようお願いします。
通報する
  • 回答数4
  • 気になる1
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル12

ベストアンサー率 65% (276/422)

田吾作7です。

あぁーすいません。
初期化だと思ってて、勘違いしてました。すいません。。。
初期化ではなく、初期値のセットですね。。。

Variant型でもよければ
  dim wkAryas Variant'バリアント宣言
  wkAry = Array(Array(10, 100, 42, 90), Array(50, 30, 60, 30))
といった形でできます。



もし何度も同じ初期値をセットする必要があるのであれば、メモリコピーをお勧めします。
それが一番リソースを消費しない方法だと思います。
以下にソースを記します。
手順1.二次元配列の初期値のマスタを作成(CreAryMst)
手順2.ワークの二次元配列に初期値をセット(InitAry)
手順3.ワークを使用したロジックの実行(ユーザの処理)
手順4以降は手順2または手順3の処理の繰り返し

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private mstAry(1, 3)  As Long '二次元配列の初期値のマスタ
Private matrixCount   As Long '配列要素数

Sub Main()
  Dim wkAry(1, 3)   As Long '実際に操作する二次元配列
  
  '二次元配列の初期値マスタを創生
  Call CreAryMst
  
  '変数に初期値をセットする
  Call InitAry(wkAry(0, 0))
  
End Sub

'二次元配列の初期値マスタを創生
Sub CreAryMst()
  Dim dmyAry As Variant
  Dim i    As Long
  Dim j    As Long
  
  Dim min1  As Long
  Dim max1  As Long
  Dim min2  As Long
  Dim max2  As Long
  
  min1 = LBound(mstAry, 1)
  max1 = UBound(mstAry, 1)
  min2 = LBound(mstAry, 2)
  max2 = UBound(mstAry, 2)
  
  '配列要素数を取得
  matrixCount = (max1 - min1 + 1) * (max2 - min2 + 1)
  
  '初期値をダミー変数にセット
  dmyAry = Array(CLng(10), CLng(50), CLng(100), CLng(30), CLng(42), CLng(60), CLng(90), CLng(30))
  
  '初期値をセットする
  For i = min1 To max1
    For j = min2 To max2
      mstAry(i, j) = dmyAry(i * max2 + j)
    Next j
  Next i
End Sub

'変数に初期値をセット
Sub InitAry(inLngAryTop As Long)
  Call CopyMemory(inLngAryTop, ByVal VarPtr(mstAry(0, 0)), ByVal LenB(inLngAryTop) * matrixCount)
End Sub




こうすることにより、初期値のセットが一瞬で済むので、初期値セット毎にかかる負荷が抑えることができます。
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル12

ベストアンサー率 65% (276/422)

Erase 二次元の変数名 ↑ これで初期化
Erase 二次元の変数名
↑ これで初期化
  • 回答No.2
レベル14

ベストアンサー率 28% (4322/15242)

前の方の回答は、JAVA言語などで言う初期化の回答で はないかとおもいます。質問者は 「自分の思うリテラル値に設定したい」というのが、質問の真意では?私も初心者ですが、勘違いであればお許し下さい。実例を書きます。ご参考に。   ・Optin Base 1は Subの外に書く   ・下記はArray関数を使ったもの   ・Array関数は1次元しか使えない   ・下記プログラムはフォームをクリッ ...続きを読む
前の方の回答は、JAVA言語などで言う初期化の回答で
はないかとおもいます。質問者は
「自分の思うリテラル値に設定したい」というのが、質問の真意では?私も初心者ですが、勘違いであればお許し下さい。実例を書きます。ご参考に。
  ・Optin Base 1は Subの外に書く
  ・下記はArray関数を使ったもの
  ・Array関数は1次元しか使えない
  ・下記プログラムはフォームをクリックして実行
   してください
  ・---は区切りに表示しただけ 
Option Base 1
Private Sub Form_Click()
Dim a(3, 4) As String
b = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", _
"10", "11", "12")
For i = 1 To 3
For j = 1 To 4
a(i, j) = b(4 * (i - 1) + j)
Next j
Next i
Rem--------
For i = 1 To 3
For j = 1 To 4
Form1.Print a(i, j)
Next j
Form1.Print "---"
Next i
End Sub
初級中級のVBの解説書には案外、初期化や2次元配列の
ことを解説してないですね。2-3日前にも類似質問
が有りました。2、3次元配列の内容を1次元配列a=Array(....)で表せると思います。
  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

再度投稿します。田吾作7です。 imogasiさんが >前の方の回答は、JAVA言語などで言う初期化の回答で はないかとおもいます。 とありますが、VBですよ(^^;) MSDNでVBのEraseの説明が見当たらなかったのですが、VBScriptのページで見つかりましたのでアドレスを記します。 http://www.microsoft.com/JAPAN/developer/library/ ...続きを読む
再度投稿します。田吾作7です。

imogasiさんが
>前の方の回答は、JAVA言語などで言う初期化の回答で はないかとおもいます。
とありますが、VBですよ(^^;)
MSDNでVBのEraseの説明が見当たらなかったのですが、VBScriptのページで見つかりましたのでアドレスを記します。
http://www.microsoft.com/JAPAN/developer/library/vbscrip5/vsstmerase.htm

lmiさんは
>VBで2次元配列
と言ってましたが、宣言はどのような形でしてるのでしょう?
考えられる2次元配列の創生方法は3つあります。

(1)
Dim 変数名(5,10) As Long

(2)
Dim 変数名() As Longとしておいて
Redim 変数名(5, 10) As Longと再度配列要素を再宣言

(3)
Dim 変数名 as Vaiant
変数名 = Array(Array(3, 5, 9), Array(1, 6, 4))
として、二次元配列を創生しながら値をセット


Erase 二次元配列の処理結果は
それぞれDimで宣言したときの状態に戻ります
ですので
(1)は全て0が入ります。
(2)は配列要素未宣言の変数になります。
(3)は単なるVariant型の変数になります

メモリの開放にもつながるので、初期値が「0」もしくは、文字列なら「""」とするならEraseをお勧めします。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ