.NET VB 配列(1次元配列、多次元配列)の使用法、要素数の調べ方(Lengthプロパティ、GetLengthプロパティ、GetUpperメソッド、GetUpperBoundメソッド)、配列の初期化(初期データの入れ方)、要素数を動的に変更(ReDim、New演算子、Preserveキーワード)について調べたので解説風に記録しておく。
配列とは
変数に格納できる値は1つですが、複数のデータをまとめて扱いたい時があります。データベースから取得した複数の値(カラム)を取得し、加工した値を画面やCSVファイルに出力したい場合など。
そのような場合は、配列を使用することで
配列は、複数の値を1つ1つ変数を定義して格納するのではなく、1つの定義とインデックスを使用して。複数の値を格納できるようにしたものです。配列には、1次元配列、2次元配列、多次元配列があります。
配列の宣言方法
一次配列
1列に並んだ要素がインデックス(番号)によって管理される配列を1次配列と言います。配列は0からカウントが始まります。配列数の上限を4とした場合は、要素の数は5つになります。配列1個1個に対してのアクセスは、配列名のカッコ内にアクセスしたい番号をセットすることで、データの参照や格納ができます。

書式
Dim 配列名(インデックス上限値) As データ型 '配列の宣言
配列名(インデックス) = 格納した値 '配列の値を格納
変数名 = 配列名(インデックス) '配列の値を参照Code language: PHP (php)
サンプル
'5つの配列要素を定義し、インデックス0~5に名前を格納します。
'配列に格納した値をループを使って取り出すサンプル
Dim userList(4) As String
userList(0) = "田中" 'インデックス0の箱に田中という文字列を格納
userList(1) = "斉藤" 'インデックス0の箱に斉藤という文字列を格納
userList(2) = "鈴木" 'インデックス0の箱に鈴木という文字列を格納
userList(3) = "太田" 'インデックス0の箱に太田という文字列を格納
userList(4) = "佐藤" 'インデックス0の箱に佐藤という文字列を格納
For i As Integer = 0 To 4
Console.WriteLine("配列(" & i & ")番目の値:" & userList(i).ToString)
NextCode language: PHP (php)
上記の宣言で、userList(0)~userList(4)個の配列ができる。これは、5つの変数を宣言し値を格納することと同じ事になります。
インデックスの上限値=要素数ではない
インデックスの上限値を4とした場合は、0、1、2、3、4の計5個の要素が宣言されることに注意。
二次配列(多次元配列)
2次元配列は、マイクロソフト社のExcel表のような「列」と「行」のような配列を定義することができます。マトリックス(表形式)でデータを処理する必要がある場合や、計算する必要がある場合の時役に立つ。例えば、2階建てのアパートの住民名簿を管理するケース等。

書式
Dim 配列名(2次元のインデックス上限値,1次元のインデックス上限値) As データ型 '配列の宣言
配列名(2次元インデックス,1次元インデックス) = 格納した値 '配列の値を格納
変数名 = 配列名(2次元インデックス,1次元インデックス) '配列の値を参照
Code language: PHP (php)
サンプル
'二次元配列の宣言
Dim userList(1, 4) As String
'1階に住んでいる住民名を配列に格納
userList(0, 0) = "田中"
userList(0, 1) = "斉藤"
userList(0, 2) = "鈴木"
userList(0, 3) = "太田"
userList(0, 4) = "佐藤"
'2階に住んでいる住民名を配列に格納
userList(1, 0) = "後藤"
userList(1, 1) = "佐々木"
userList(1, 2) = "橋本"
userList(1, 3) = "武井"
userList(1, 4) = "藤田"
'2次元配列の場合は、二重ループを使用する。(ループのネスト)
For i As Integer = 0 To 1
For j As Integer = 0 To 4
Console.WriteLine("配列(" & i & "," & j & ")番目の値:" & userList(i, j).ToString)
Next
NextCode language: PHP (php)
三次配列(多次元配列)
3次元配列は、立体的(x座標,y座標,z座標)にデータを格納できる。例えば、A棟のアパートの住民名簿、B棟のアパートの住民名簿のようなケースに使用できる。

書式
'配列の宣言
Dim 配列名(3次元のインデックス上限値,2次元のインデックス上限値,1次元のインデックス上限値) As データ型
配列名(3次元インデックス,2次元インデックス,1次元のインデックス) = 格納した値 '配列の値を格納
変数名 = 配列名(3次元インデックス,2次元インデックス,1次元インデックス) '配列の値を参照
Code language: PHP (php)
サンプル
'三次元配列の宣言
Dim userList(1, 1, 4) As String
userList(0, 0, 0) = "A棟の田中"
userList(0, 0, 1) = "A棟の斉藤"
userList(0, 0, 2) = "A棟の鈴木"
userList(0, 0, 3) = "A棟の太田"
userList(0, 0, 4) = "A棟の佐藤"
userList(0, 1, 0) = "A棟の後藤"
userList(0, 1, 1) = "A棟の佐々木"
userList(0, 1, 2) = "A棟の橋本"
userList(0, 1, 3) = "A棟の武井"
userList(0, 1, 4) = "A棟の藤田"
userList(1, 0, 0) = "B棟の田中"
userList(1, 0, 1) = "B棟の斉藤"
userList(1, 0, 2) = "B棟の鈴木"
userList(1, 0, 3) = "B棟の太田"
userList(1, 0, 4) = "B棟の佐藤"
userList(1, 1, 0) = "B棟の後藤"
userList(1, 1, 1) = "B棟の佐々木"
userList(1, 1, 2) = "B棟の橋本"
userList(1, 1, 3) = "B棟の武井"
userList(1, 1, 4) = "B棟の藤田"
'三次元配列は三重ループを使用する。
For i As Integer = 0 To 1
For j As Integer = 0 To 1
For k As Integer = 0 To 4
Console.WriteLine("配列(" & i & "," & j & "," & k & ")番目の値:" & userList(i, j, k).ToString)
Next
Next
NextCode language: PHP (php)
配列の初期化
配列の宣言時に初期データを格納することができる。
1次元配列の初期化
Dim 配列名() As データ型= {初期値,...} 'New省略系
Dim 配列名() As データ型 = New データ型{初期値,...}Code language: PHP (php)
()内には上限要素数を指定しない。
2次元配列の初期化
Dim 配列名(,) As データ型= {{初期値,...},{初期値,...},...} 'New省略パターン
Dim 配列名(,) As データ型 = New データ型(,){{初期値,...},{初期値,...},...}Code language: PHP (php)
3次元配列の初期化
Dim 配列名(,,) As データ型= {初期値,...} 'New省略パターン
Dim 配列名(,,) As データ型 = New データ型(,,){初期値,...}Code language: PHP (php)
サンプル
'1次元配列のサンプル
Dim userList() As String = {"田中","斉藤","鈴木","太田","佐藤"} 'New省略系
Dim userList() As String = New String {"田中","斉藤","鈴木","太田","佐藤"}
2次元配列のサンプル
'New省略系
Dim userList(,) As String = {
{"田中", "斉藤", "鈴木"}, _
{"太田", "佐藤", "麻生"}
}
'Dim userList(,) As String = New String(,) {
{"田中", "斉藤", "鈴木"}, _
{"太田", "佐藤", "麻生"}
}
For i As Integer = 0 To 1
For j As Integer = 0 To 2
Console.WriteLine("配列(" & i & "," & j & ")番目の値:" & userList(i, j).ToString)
Next
Next
'3次元配列のサンプル
Dim userList(,,) As String = {
{{"田中", "斉藤", "鈴木"}, {"田中", "佐藤", "鈴木"}},
{{"佐藤", "西郷", "佐々木"}, {"須藤", "佐藤", "橋本"}}
} 'New省略系
'Dim userList(,,) As String = New String(,,) {
{{"田中", "斉藤", "鈴木"}, {"田中", "佐藤", "鈴木"}},
'{{"佐藤", "西郷", "佐々木"}, {"須藤", "佐藤", "橋本"}}
}
'三次元配列は三重ループを使用する。
For i As Integer = 0 To 1
For j As Integer = 0 To 1
For k As Integer = 0 To 2
Console.WriteLine("配列(" & i & "," & j & "," & k & ")番目の値:" & userList(i, j, k).ToString)
Next
Next
Next
Code language: PHP (php)
配列のインデックス(要素数)取得
UBound関数
UBound関数は、宣言されている配列の要素数の最大値を返す。VB6.0から引き継がれた関数である。
書式
UBound(変数名)
UBound(変数名,次元を指定)
サンプル
Dim userList(2, 4) As Integer '2次元配列を宣言
Console.WriteLine(UBound(userList, 1)) '1次配列の最大要素数を返す。
Console.WriteLine(UBound(userList, 2)) '2次配列の最大要素数を返す。Code language: PHP (php)
NG
'2次元配列の宣言と初期化
Dim userList(,) As String = {
{"田中", "斉藤", "鈴木"},
{"太田", "佐藤", "麻生"}
}
Console.WriteLine(UBound(userList, 1)) '1次配列の最大要素数を返す。
Console.WriteLine(UBound(userList, 2)) '2次配列の最大要素数を返す。Code language: PHP (php)
配列の初期化した場合は、使えない。
.NET Framework 4.8
配列の初期化した場合、要素数がうまく返らない。
GetUpperBoundメソッド
GetUpperBoundメソッドは、宣言されている配列のインデックスの最大値を返す。VB .NETで新たに追加されたArrayクラスのメソッド
書式
配列.GetUpperBound(次元を指定)Code language: CSS (css)
サンプル
'2次元配列の場合
Dim userList2D(2, 4) As Integer '2次元配列を宣言
Console.WriteLine("2次元配列の最大のインデックス")
Console.WriteLine(userList2D.GetUpperBound(0)) '2次配列の最大のインデックスを返す。
Console.WriteLine(userList2D.GetUpperBound(1)) '1次配列の最大のインデックスを返す。
'2次元配列の場合
Dim userList3D(2,3,4) As Integer '3次元配列を宣言
Console.WriteLine("3次元配列の最大のインデックス")
Console.WriteLine(userList3D.GetUpperBound(0)) '3次配列(z)の最大のインデックスを返す。
Console.WriteLine(userList3D.GetUpperBound(1)) '2次配列(y)の最大のインデックスを返す。
Console.WriteLine(userList3D.GetUpperBound(2)) '1次配列(x)の最大のインデックスを返す。Code language: PHP (php)
NG
'2次元配列の宣言と初期化
Dim userList(,) As String = {
{"田中", "斉藤", "鈴木"},
{"太田", "佐藤", "麻生"}
}
Console.WriteLine(userList.GetUpperBound(0)) '2次配列の最大のインデックスを返す。
Console.WriteLine(userList.GetUpperBound(1)) '1次配列の最大のインデックスを返す。Code language: PHP (php)
配列の初期化した場合は、使えない。
.NET Framework 4.8
配列の初期化した場合、最大のインデックスがうまく返らない。
Lengthプロパティ
配列全体の要素数(すべての要素数)を取得するには、Lenghtプロパティを使用します。
書式
配列名.LengthCode language: CSS (css)
サンプル
'1次元配列
Console.WriteLine("1次元配列")
Dim userList1D1(4) As String
Dim userList1D2() As String = {"田中", "斉藤", "鈴木", "太田", "佐藤"}
Console.WriteLine("userList1D1:" & userList1D1.Length)
Console.WriteLine("userList1D2:" & userList1D2.Length)
'2次元配列
Console.WriteLine("2次元配列")
Dim userList2D1(1, 2) As String
Dim userList2D2(,) As String = {
{"田中", "斉藤", "鈴木"},
{"太田", "佐藤", "麻生"}
}
Console.WriteLine("userList2D1:" & userList2D1.Length)
Console.WriteLine("userList2D2:" & userList2D2.Length)
'3次元配列
Console.WriteLine("3次元配列")
Dim userList3D1(1, 1, 2) As String
Dim userList3D2(,,) As String = {
{{"田中", "斉藤", "鈴木"}, {"田中", "佐藤", "鈴木"}},
{{"佐藤", "西郷", "佐々木"}, {"須藤", "佐藤", "橋本"}}
}
Console.WriteLine("userList3D1:" & userList3D1.Length)
Console.WriteLine("userList3D2:" & userList3D2.Length)Code language: PHP (php)
GetLengthメソッド
多次元配列の要素数を取得する場合は、GetLengthメソッドを使用します。
書式
配列名.GetLength(インデックス)Code language: CSS (css)
2次元配列サンプル
Dim userList(,) As String = {{"田中", "斉藤", "鈴木"}, _
{"太田", "佐藤", "麻生"}}
Console.WriteLine(userList.GetLength(0)) '縦(行)の配列の要素数
Console.WriteLine(userList.GetLength(1)) '横(列)の配列の要素数Code language: PHP (php)
3次元配列サンプル
Dim userList(,,) As String = {
{{"田中", "斉藤", "鈴木", "田部"}, {"田中", "佐藤", "鈴木", "田部"}},
{{"佐藤", "西郷", "佐々木", "田部"}, {"須藤", "佐藤", "橋本", "田部"}},
{{"佐藤", "西郷", "佐々木", "田部"}, {"須藤", "佐藤", "橋本", "田部"}}
} 'New省略系
Console.WriteLine(userList.GetLength(0)) '奥行(z)の配列の要素数
Console.WriteLine(userList.GetLength(1)) '縦(y)の配列の要素数
Console.WriteLine(userList.GetLength(2)) '横(x)の配列の要素数Code language: PHP (php)
配列の要素数を動的変更
配列をしていると、動的に配列のサイズを拡張しなければならない場面がある。その時は、ReDimステートメントを使用することで、配列のサイズを変更することができる。2次元配列の場合は、0
書式
ReDim 配列名(インデックス)
サンプル
Dim price() As Integer = {100, 200, 250, 150}
ReDim price(9) '配列のサイズを4→10に拡張
For i As Integer = 0 To price.Length - 1
Console.WriteLine("配列(" & i & ")の値:" & price(i))
NextCode language: PHP (php)
Preserveキーワード
さて、上記のサンプル例では配列のサイズを変更すると、元の値が失われすべて0がセットされてします。元の値を保持するためには、Preserveキーワードを付ける必要があります。
書式
ReDim Preserve 配列名(インデックス)
サンプル
Dim price() As Integer = {100, 200, 250, 150}
ReDim Preserve price(9) '配列のサイズを4→10に拡張
For i As Integer = 0 To price.Length - 1
Console.WriteLine("配列(" & i & ")の値:" & price(i))
NextCode language: VB.NET (vbnet)

コメント