パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

配列

 (準備中)

--------------------------------------------------------------------------------
Visual Basicにおける配列について基本的な事項を書きます。
--------------------------------------------------------------------------------

1.VBの配列

Visual Basic4〜6では、配列は
Dim a(10) As Integer 
のように宣言します。Integer型の場合は宣言した段階で各要素は0に初期化されるようです。
変数の形を指定しない場合はヴァリアント型になります。
従って、
Dim a, b As Integer
という宣言をすると、aはヴァリアント型、bはInteger型になります。

@ 添え字の指定は、a(-3 to 3)のように負の値を含めて任意の範囲を指定できます。

b() のように添え字を指定しないと動的配列になり、後でReDimで配列の範囲を動的に宣言することができます。
再度ReDimで宣言し直すことも可能です。ReDimで宣言すると、前の値は消えて初期化されてしまいます。
前の値を引き継ぎたい時は、ReDim Preserve で宣言します。

A配列の一括代入はできません(と思います)。
VB4〜6で、配列の各要素の値を他の配列にコピーしたい場合は、Forループで各要素を1コづつコピー(代入)して
いくことになります。


Bプローシジャーで引数を参照渡しにすれば、配列全体を一括で引き渡すことはできます。
VB4〜6では、プロシージャへの引数の引き渡しはデフォルトで参照渡しになっていることに注意してください。

Sub copy() は単に渡された引数をそのまま表示するだけです。
Sub twice() は渡された引数を2倍にしています。
参照渡しなので、元の配列a()のほうも2倍になっていることを画面1で確認して下さい。

値渡し、参照渡しについては「プロシージャとデータの受け渡し」をご参照下さい。

配列を値渡しで(ByVallで)一括で引き渡すことはできません。エラーになります。

C配列の要素数の取得
VB.net/VB2005〜では、配列の要素数を取得するメソッドとしてlengthやcountなどが用意
されていますが、VB4〜6にはありません。
配列の添え字の下限上限を調べる関数にLBound(), UBound()があるのでこれを使います。
LBound(array [, dimension]) 下限を調べる
UBound(array [, dimension]) 上限を調べる
 array 配列名
 dimension 次元を指定

Sub copy(x() As Integer)
Print "x:";
For i = -3 To 3
Print x(i); " ";
Next
End Sub


Sub twice(x() As Integer)
Print "twise x:";
For i = -3 To 3
x(i) = x(i) * 2
Print x(i); " ";
Next
End Sub

'Sub add1(ByVal z() As Integer)
'Print "add1 z:";
'For i = -3 To 3
'z(i) = z(i) + 1
'Print z(i); " ";
'Next
'End Sub

Private Sub Form_Paint()
' @
Dim a(-3 To 3) As Integer, b() As Integer, c(-3 To 3) As Integer
Print "a:";
For i = -3 To 3
    a(i) = i * i
    Print a(i); " ";
Next
Print
Print "b:";
ReDim b(10) As Integer
For i = 0 To 9
    b(i) = i * i
    Print b(i); " ";
Next
Print
Print "ReDim Preserve b:";
ReDim Preserve b(15) As Integer
For i = 0 To 14
    Print b(i); " ";
Next
Print
'A c =a does not work.
'c = a
Print "c:";
For i = -3 To 3
    c(i) = a(i)      
    Print c(i); " ";
Next
Print

' B
copy a()
Print
twice a()
Print
Print "a:";
For i = -3 To 3
Print a(i); " ";
Next

'配列は値渡しだとエラーになる
'add1 a

Print
' C
Print "配列の下限:"; LBound(a)
Print "配列の上限:"; UBound(a)
End Sub


実行結果 
(画面1)

2.配列の仕様の変遷

古いコードの移植に置いて配列の仕様の変化を把握しておく必要があるため、
N88Basic -> Quick Basic ->VB4〜6 -> VB.Net/VB2005〜
における配列の仕様の変遷をまとめておきます。
(一部未検証の箇所あり。Quick BasicはVer4.2以降の仕様)

VB.net/VB2005以降の配列の仕様については「VB.netの配列とForループの基礎」をご参照下さい。
N88Basic Quick Basic VB4〜6 VB.net/VB2005〜
宣言の書式 DIM A(10), B$(5) DIM A(10), B$(5)
または
DIM A(10) AS INTEGER
という書き方もできる
Dim A(10), B(5) As String

型名を省略するとヴァイリアント型に
なるので、A(10)はヴァリアント型に
なる
Dim A(10) As Integer, B(5) As String

型名の省略はできない。
Option Base 0 or 1 0 or 1 0 or 1 ×
添え字の範囲 添え字は0 or 1 から
× 負の添え字
× 任意の範囲
○ 負の添え字
○ 任意の範囲
DIM A(-10 TO 10)
○ 負の添え字
○ 任意の範囲
Dim A(-10 To 10)
添え字は0から
× 負の添え字
× 任意の範囲
動的配列宣言 × DIM A() Dim A() Dim A() As Integer
ReDim ×
ReDim Preserve ×
配列の一括代入 ×
配列の個別要素毎に代入
×
配列の個別要素毎に代入
×
配列の個別要素毎に代入
Dim A(10), B(10)
A=B
参照のコピーになり、BはAと同じ配列を
指し示す。
値のコピーの場合は
Array.Copy(b, a, b.Length) とする



Top page | Visual Basic&Excel活用研究目次