配列は、順序付けされたデータのコレクションです。配列内の要素は同じデータ型に属さない場合があります。統一された配列名と添え字を使用して、配列内の要素を一意に識別します。1 つの要素を変更しても、他の要素には影響しません。配列の添え字には制限があり、下限と上限に分けられます。配列は Dim、Private、Public、または Static を使用して宣言でき、それらの構文形式は同じです。以下では、Dim を使用して配列を宣言する方法のみを紹介します。
1.配列の定義と宣言
配列の定義構文は次のとおりです。
Dim 配列名 ([[添字の下限 To] 添字の上限]) [データ型として]
例: (現在のモジュールの配列のデフォルトの下限が 0 であると仮定します):
① Dim A(10) を整数として
配列名が A であることを示します。この配列の添え字の下限はデフォルト値 0、添え字の上限は 10 です。整数型の要素は A(0)、A(1) まで 11 個あります。 )からA(10)まで。
② Dim B(1 ~ 20) を整数として
配列名が B であることを示します。この配列の添え字の下限は 1、添え字の上限は 20 で、整数型の要素は B(1) から B(20) まで 20 個あります。
③薄暗い日配列(50)
DayArray が 51 個のインデックス付き (0 ~ 50) 要素を持つ Variant 配列であることを示します。
④Dim Matrix(3, 4) As Integer
Matrix が 2 次元の整数配列であることを示します。
⑤MyMatrix(1~5、4~9、3~5)をDoubleとしてディム
MyMatrix が明示的に上限と下限が指定された 3 次元の double 配列であることを示します。
⑥Dim Birthday(1~10)を日付として表示
BirthdayDay が 1 ~ 10 のインデックスを持つ Date 型配列であることを示します。
2.オプションの基本ステートメント
Option Base ステートメントは、配列添字のデフォルトの下限を宣言するためにモジュール レベルで使用されます。
Option Base ステートメントの構文は次のとおりです。
オプションベース {0 | 1}
注: デフォルトでは、配列の下限は 0 であり、現時点では Option Base ステートメントを使用する必要はありません。このステートメントを使用して配列の下限 1 を指定する場合は、モジュールの配列宣言の前に Option Base ステートメントを使用する必要があります。
知らせ:
(1) Dim、Private、Public、ReDim、および Static ステートメントの To 句は、配列の添え字を制御するためのより柔軟な方法を提供します。ただし、To 句を使用して下限を明示的に指定しない場合は、Option Base を使用してデフォルトの下限を 1 に設定できます。 Array 関数を使用して作成された配列の下限も、配列がタイプ ライブラリ (VBA.Array など) 名で修飾されている場合を除き、Option Base ステートメントで指定された下限によって決まります。ライブラリ名を指定した場合、Array 関数を使用して作成された配列の下限は次のとおりです。この下限は Option Base の影響を受けません。
(1) Option Base ステートメントは、そのステートメントを含むモジュールにある配列の下限にのみ影響します。
配列宣言に関するいくつかの注意事項:
①配列名の命名規則は変数名と同じです。
②配列名は括弧で囲みます。C言語と異なり、角括弧は使用できません。
③添え字の下限は上限を超えてはなりません。
④変数名や定数名(および実数)を添字境界として使用できます。添字の境界が定数名の場合、配列のサイズは固定されます。添字の境界が変数名の場合、配列のサイズは動的に定義できます。つまり、配列のサイズは次のようになります。プログラムの実行中の変数の値。したがって、VB の配列は、静的配列と動的配列の 2 種類の配列に分類できます。
3.静的配列
静的配列とは、配列要素の数が固定されている、つまり、配列要素が占有するメモリ空間のサイズが固定されていることを意味します。固定サイズ配列の次元の違いに応じて、1 次元配列と多次元配列に分けることができます。
多次元配列を宣言するための構文形式は次のとおりです。
Dim 配列名 ([添字境界リスト]) [データ型として]
添字境界の定義形式: [添字下限 To] 添字上限
添字境界リストは、カンマで区切られた配列の各次元の添字境界を指します。
[添字下限 To] 添字上限、[添字下限 To] 添字上限、...、[添字下限 To] 添字上限
(1 次元) (2 次元) (n 次元)
n=1 の場合、配列は 1 次元配列と呼ばれ、n=2 の場合、配列は 2 次元配列と呼ばれ、同様に n=m の場合、配列は m 次元配列と呼ばれます。
次の例では、1 次元配列の使用を紹介します。
'長さ 51 の文字列配列 FriendsName を宣言します
Dim FriendsName(50) を文字列として
'長さ 11 のグローバル整数配列クラスを宣言します
整数としてのパブリック クラス(10)
1 次元配列の要素の数は、(上限 - 下限 + 1) です。
次のようなループ ステートメントを使用して、配列に初期値を割り当てることができます。
Dim I を整数として指定する
For I = 0 To 11 'ループ文のプログラム フロー制御を使用します
C(I) = 私
次は私
下限が明示的に指定されていない場合、配列の下限は Option Base ステートメントによって制御されます。 Option Base ステートメントがない場合、下限はデフォルトの 0 になります。
配列の次元は 2 に限定されません。VB では 60 まで拡張できます。実際のアプリケーションでは、3 次元を超える配列のアプリケーションはあまりありません。多次元配列を定義する場合、Dim ステートメントを 1 つだけ行うだけで、配列のすべての添字境界を指定できます。多次元配列を使用すると、意味のある統計データを簡単に表現できます。例えば:
通貨としての薄利(16,10,12)
この Profit 配列は、店舗名、部門、月をパラメータとして特定のデパートの利益を表すために使用できます。例: Profit(2,8,11) は、2 番目の支店の 8 番目の部門の 11 月の利益を表します。
4.動的配列
場合によっては、アレイの使用を開始する前に、実際のニーズを満たすためにアレイのサイズがどれくらい必要なのかを知ることができない場合があります。もちろん、実際のアプリケーションのニーズを満たすのに十分な大きさに配列のサイズを定義することもできますが、この方法は非常に非効率的です (メモリ空間を大量に浪費します)。動的配列を使用すると、プログラムの実行中に実際のニーズに応じて配列のサイズを正確に定義できます。
配列を宣言するときに次元のリストを指定しないと、配列は動的配列として宣言されます。例えば:
Dim MyArry() を整数として
動的配列を使用する前に、ReDim ステートメントを使用して再定義する必要があります。たとえば、前に宣言した配列 MyArry は、次のステートメントを使用して動的 2 次元配列として定義できます。
ReDim MyArry(10,10)
ReDim ステートメントを繰り返し実行することで、動的配列を複数回定義することもできます。 ReDim を使用して定義できる次元の最大数は 60 です。 ReDim ステートメントは、配列の各次元の要素の数を変更できますが、次元の数は変更できません。以下は、ReDim ステートメントの標準的なアプリケーションの例です。
Dim MyArry() As Single '動的配列を宣言します
ReDim MyArry(30,20,10) '配列を再定義します
ReDim MyArry(50,23,21) '配列を再度再定義します
ReDim の構文は Dim の構文と同じです。さらに、Preserve キーワードのオプションもあります。
ReDim 配列名を保持 ([ [下限 To] 上限]) [データ型として]
例えば:
ReDim MyArry(50,23,21)
ReDim 保存 MyArry(50,23,50)
注: ReDim を使用する場合、配列を再定義するとすべての配列要素の値が失われますが、Preserve を使用するとデータは保持されます。ただし、Preserve を使用すると、配列の最後の次元のサイズを変更する場合にのみ配列のデータを保存できます。 1 次元配列の場合、すべてのデータが保持されますが、多次元配列の場合、すべての配列データを保持するには最後の次元のサイズのみを変更できます。変更しない場合はエラーが発生します。
5. LBound関数とUBound関数
LBound 関数と Ubound 関数はどちらも Long 型のデータを返します。前者で取得される値は指定された配列次元で使用できる最小の添字であり、後者で取得される値は最大の添字です。それらの構文は次のとおりです。
LBound(配列名[,指定された次元])
UBound(配列名[,指定された次元])
配列名は必須です。次元の指定数はオプションであり、下限を返す次元を指定します。 1 は最初の次元を表し、2 は 2 番目の次元を表し、以下同様となります。指定した次元を省略した場合、デフォルトは 1 になります。
LBound 関数と UBound 関数の使用方法については、次の例を参照してください。
Dim A(1 to 100,3,-3 to 4) As Integer 'Option Base言語を使用しないことを前提として3次元配列を定義します
' ステートメントは、配列の下限のデフォルト値を変更します。
配列 A に対して Lbound 関数と Ubound 関数を使用します。戻り値のリストは次のとおりです。
すべてのディメンションのデフォルトの下限は、Option Base ステートメントの設定によって異なります。配列に対して LBound 関数と UBound 関数を使用すると、配列内の要素の数を決定できることがわかります。
宣言内で To 句を使用して次元が指定されている配列の場合、Option Base ステートメントによる制限を受けることなく、任意の整数を下限として使用できます。
6.アレイの高度な機能
配列は変数のグループを格納するために最も一般的に使用されますが、配列は他の方法でも役立ちます。ある配列の内容を別の配列に代入したり、配列を返す関数を作成したり、配列を返すプロパティを作成したりできます。多くの場合、これらの手法によりアプリケーションのパフォーマンスが向上します。
StrA = StrB のように、ある変数の値を別の変数に代入できるのと同じように、ある配列の内容を別の配列に代入することもできます。たとえば、バイト配列をある場所から別の場所にコピーするとします。これは、一度に 1 バイトずつコピーすることで実現できます。手順は次のとおりです。
Sub ByteCopy(oldCopy() をバイトとして、newCopy() をバイトとして)
'パラメータoldCopy()はソース配列、newCopy()はターゲット配列です
Dim i を整数として
ReDim newCopy (Lbound(oldCopy) To UBound(oldCopy)) '動的配列を再定義します
For i = Lbound(oldCopy) To Ubound(oldCopy) 'ループ代入
新しいコピー(i) = 古いコピー(i)
次
エンドサブ
より簡単で効率的な方法は、ある配列を別の配列に直接割り当てることです。
Sub ByteCopy(oldCopy() をバイトとして、newCopy() をバイトとして)
'パラメータoldCopy()はソース配列、newCopy()はターゲット配列です
newCopy = oldCopy '配列を使用して値を直接割り当てます
エンドサブ
変数の代入に関しては、留意すべきルールがいくつかあります。たとえば、整数として宣言された変数は、long として宣言された変数に問題なく代入できますが、long を整数変数に代入すると、オーバーフロー エラーが発生しやすくなります。配列の割り当ては、データ型変数間の割り当てに関する規則に準拠するだけでなく、配列の次元数、各次元のサイズ、配列が固定か動的かなど、他の規則にも準拠する必要があります。
① 異なる次元とデータ型の配列を割り当てる際に考慮すべきいくつかの要素
l 代入演算子の左側の配列タイプ: 固定配列 (Dim x(1 to 10) As Integer) または動的配列 (Dim x() As Integer)。
l 代入演算子の左側の配列の次元が、代入演算子の右側の配列の次元と一致するかどうか。
l 代入演算子の両側の配列の各次元の配列要素の数が一致するかどうか。配列の宣言が異なっていても、次元が一致する場合があります。たとえば、ある配列の各次元の要素に 0 から始まる番号が付けられ、別の配列の要素に 1 から始まる番号が付けられている場合、次元も一致する可能性があります。
l 代入演算子の両側のすべての要素のデータ型には互換性がなければなりません。これらのルールは、変数割り当てのルールと一致しています。
表 3-6 は、次の要因の影響を示しています。
配列割り当てのエラーは、コンパイル時または実行時に発生する可能性があります (たとえば、データ型をキャストできない場合や、割り当てで静的配列を再宣言 (ReDim) しようとした場合など)。エラー処理を追加して、代入前に配列が一致することを確認するようにプログラムを設計します。
②配列を返す関数を書く
関数から一連の値を返すことができます。たとえば、文字列に変換して再度戻すことなく、関数から一連のバイトを返します。
バイト配列を返す関数を使用した簡単な例を次に示します。
プライベートサブフォーム_Load()
バイトとしてのディムb
Dim i を整数として
Dim ReturnArray() をバイトとして
b = Cバイト(54)
ReturnArray() = ArrayFunction(b) '関数の呼び出し
For i = Lbound(ReturnArray) から Ubound(ReturnArray)
Msgbox ReturnArray(i) ' ポップアップ メッセージ ボックスをループして配列値を表示します
次
エンドサブ
Public Function ArrayFunction(b As Byte) As Byte()
Dim x(2) をバイトとして
x(0) = b
x(1) = b + Cバイト(200)
x(2) = b + b
ArrayFunction = x '結果を配列 x として返します
終了機能
上記の例を実行すると、ReturnArray() は、ArrayFunction で配列に割り当てられた値を含む 3 要素の配列になります。 ArrayFunction ステートメントはパラメータとして配列を渡します。配列のデータ型は関数のデータ型 (この場合はバイト) と同じである必要があります。これは関数呼び出しであるため、配列を渡すときに括弧は必要ありません。
知らせ:
1.別の配列に代入して配列を返すこともできますが (ArrayFunction = x())、この方法はパフォーマンス上の理由からお勧めできません。
2.配列を返す関数には型を指定する必要があります。この型は Variant にすることができます。このように、Function X() As Variant() は有効ですが、Function X() As () は失敗します。
3.配列を返す関数を呼び出す場合、戻り値の格納に使用される変数も配列である必要があり、そのデータ型は関数の戻り値の型と同じである必要があります。そうでない場合は、型の不一致エラーが表示されます。
単純な配列を定義する
ASP で配列を定義および初期化するには 2 つの方法があります。それぞれの例を見てみましょう。
方法 1:
MyArray = 配列(1月、2月、3月、4月、5月、6月、7月、8月、9月、10月、11月、12月)
配列のサイズは、初期化された要素の数によって決まります。
方法 2:
Dim myArray(2) '配列サイズを指定する
myArray(0)=1 月
myArray(1)=2 月
配列の動的拡張
DIM myArray()
REDIM myArray(20) '配列サイズを 20 に再定義します
ReDim Preserve MyArray(i) 'Preserve は配列内の元のデータを保持します
二次元配列
例:
dim MyArray(5,10) ' 2 次元配列を定義します
2 次元の代入の例:
MYArray(3,3)=100
2 次元配列の偽装実装方法もあります。
dimMyArray(5)
MyArray(0)=Array(...) '一次元配列
MyArray(1)=Array(...)'1次元配列
...
アクセスするときは、MyArray(x)(y) の形式を使用します。
配列インデックス
上記のメソッドを使用して配列を定義します。各次元配列の最初の要素の添え字は 0 で、最後の要素の添え字は要素の数 -1 です。
ただし、次のように配列の添字を指定することもできます。
dim MyArray1(3 to 10) '添え字は 3 ~ 10、MyArray(3) は最初の要素の値を取得します
便利な配列関数
Ubound(配列名) 関数 -- 配列の最後の要素の添え字を返します。
Lbound (配列名) 関数 -- 配列の最初の要素の添え字を返します。デフォルトは 0 です。
その他のアプリケーション:
配列ソート関数
関数ソート(配列)
KeepChecking = TRUE
KeepChecking = FALSEになるまで実行
KeepChecking = FALSE
I = 0 から UBound(ary) の場合
I = UBound(ary) の場合は終了します
ary(I) > ary(I+1) の場合
FirstValue = ary(I)
SecondValue = ary(I+1)
ary(I) = SecondValue
ary(I+1) = FirstValue
KeepChecking = TRUE
終了の場合
次
ループ
並べ替え = 配列
終了機能
配列ソート機能の応用例
DimMyArray
MyArray = 配列(1,5,123,12,98)
MyArray = ソート(MyArray)
I = Lbound(MyArray) から Ubound(MyArray) の場合
Response.Write MyArray(I) & <br>
次
文字列を分割して配列を返す
DimMyArray
MyArray = Split(文字列, 区切り文字)
I = Lbound(MyArray) から Ubound(MyArray) の場合
Response.Write MyArray(I) & <br>
次
アプリケーションとセッションでの配列の使用
アプリケーション.ロック
アプリケーション(StoredArray) = MyArray
アプリケーション.ロック解除
LocalArray = アプリケーション(StoredArray)
アプリケーション内の配列を上書きする
アプリケーション.ロック
アプリケーション(StoredArray) = LocalArray
アプリケーション.ロック解除
セッションの使用法はアプリケーションと同じです
データベースから配列にデータをインポートする
DimMyArray
すべてのレコードを取得する
MyArray = RS.GetRows
最初の 10 レコードを取得する
MyArray = RS.GetRows(10)
行 = 0 から UBound(MyArray, 2) の場合
Col = 0 から UBound(MyArray, 1) の場合
Response.Write (列、行) & <br>
次
次
配列を別のページに渡す
配列を別のページに渡す方法は数多くあります。たとえば、次の 3 つです。
1. カンマ区切りの文字列を定義し、Split 関数を使用して次のページに配列を再作成します。
2. 配列をセッション変数に保存し、次のページで呼び出します。
3. フォームの非表示領域に配列を渡します。それらは自動的にカンマで区切られ、Split 関数を使用して配列を再作成します。
最初の 2 つの方法は優れていますが、どちらも 3 番目の方法よりも複雑です。 3番目は最も簡単なので、ここでは3番目のみを紹介します。
ファイル 1.asp:
<%
ぼんやりとした私
dim myArray(20)
I=0~20の場合
myArray(I)=アイテム & I
次
%>
<html>
<本文>
<フォーム名=テストフォームメソッド=ポストアクション=2.asp>
<%
for I=0 から ubound(myArray)
response.write <input type=hidden name=myArray value=' & myArray(I) & '>
次
%>
<p>
<入力タイプ=送信>
</form>
</body>
</html>
上で行ったのは、個別の暗黙フィールドを使用して、フォームの配列内の各要素を格納することです。次のページを見てみましょう。
ファイル2.asp
<html>
<本文>
<%
薄暗いarrString
私の配列を暗くする
ぼんやりとした私
arrString=リクエスト(myArray)
myArray = split(arrString,,)
for I=0 から ubound(myArray)
response.write アイテム &I& = & myArray(I) & <br> & vbCrLf
次
%>
</body>
</html>