ホーム > >

VBA配列でよくあるエラー

配列を使用すると、エラーが発生することはよくあります。配列を宣言したときよりも多くのメンバーを配列に割り当てようとすると、VBAは「インデックスが有効範囲にありません」というエラーメッセージを表示します。

「インデックスが有効範囲にありません」というエラーメッセージが表示されます

6つのメンバーを含む1次元配列を宣言しましたが、8番目のメンバーに値を割り当てようとしたとします。プロシージャを実行すると、VBは8番目のメンバーを見つけることができないため、エラーメッセージが表示されます。 デバッグボタンをクリックすると、VBはエラーの原因となったコード行を強調表示します。 配列の宣言ステートメントを確認し、強調表示されたコード行の括弧内のインデックス番号を変更します。 「インデックスが有効範囲にありません」エラーは、ループを使用するプロセスが原因で発生することがよくあります。次のプロシージャZoo1は、この状況の例です。ユーザーが入力ボックスへのデータの入力をキャンセルする前に、ループ内のステートメントが繰り返し実行されます。このプロシージャの実行中に、変数iが4に等しい場合、VBは3メンバー配列の4番目のメンバーを見つけることができず、エラーメッセージが表示されます。変更されたプロシージャZoo2は、上記で紹介したLBound関数とUBound関数が、存在しない配列メンバーにアクセスしようとするエラーを回避する方法を示しています。

デバッグボタンをクリックすると、VBはエラーの原因となったコード行を強調表示されます。

1、現在のプロジェクトに新しいモジュールを挿入し、Errors_In_Arraysという名前を付けます。

2、次のプロシージャZoo1およびZoo2を入力します。

Sub Zoo1()
‘this procedure triggers an error “Subscript out of range” 「インデックスが有効範囲にありません」というエラーメッセージを表示する
Dim zoo(3) As String
Dim i As Integer
Dim response As String
i = 0
Do
i = i +1
response = InputBox(“Enter a name of animal:”)
zoo(i) = response
Loop until response = “”
End Sub
Sub Zoo2()
‘this procedure avoids the error “Subscript out of range”このプロシージャは、「インデックスが有効範囲にありません」エラーを回避する
Dim zoo(3) As String
Dim i As Integer
Dim response As String
i = 1
Do While i>=LBound(zoo) And i <=UBound(zoo)
response = InputBox(“Enter a name of animal:”)
If response = “” Then Exit Sub
zoo(i) = response
i = i + 1
Loop
For i = LBound(zoo) To UBound(zoo)
MsgBox zoo(i)
Next
End Sub

配列を使用する際のもう1つの一般的なエラーは、データ型の不一致です。このようなエラーを回避するには、配列の各メンバーが同じデータ型である必要があることに注意する必要があります。配列メンバーの宣言されたデータ型と競合するデータを割り当てようとすると、コードの実行時に「データ型の不一致」エラーが発生します。 異なるデータ型で配列エラーを発生させるには、配列をVariant型として宣言する必要があります。

配列を引数とする

上記では、サブプロシージャまたは関数プロシージャ間で必須またはオプションの引数としてデータを渡すことができることを学びました。 渡された引数がプロシージャの実行に必要ない場合は、引数名の前にキーワードオプションを付ける必要があります。ただし、渡す引数の数が事前にわからない場合もあります。この場合は加算です。2つの数字を追加することも、3、10、または15の数字を追加することもできます。キーワードParamArrayを使用すると、任意の数のメンバーを含む配列をサブプロシージャと関数プロシージャに渡すことができます。次の関数プロシージャAddMultipleArgsは、必要な複数の数値を追加します。関数は配列myNumbersの宣言から始まり、キーワードParamArrayの使用に注意してください。配列はVariant型として宣言する必要があり、関数プロシージャの最後の引数である必要があります。

1、現在のプロジェクトに新しいモジュールを挿入し、ParameterArraysという名前を付けます。

2、次の関数プロシージャAddMultipleArgsを入力します。

Function AddMultipleArgs(ParamArray myNumbers() As Variant)
Dim mySum As Single
Dim myValue As Variant
For each myValue in myNumbers
mySum=mySum+myValue
Next
AddMultipleArgs = mySum
End Function

  1. イミディエイトウィンドウをアクティブにして上記の関数をテストし、イミディエイトウィンドウにコマンドを入力します。

AddMultipleArgs(1, 23.24, 3, 24, 8, 34)

Enterキーを押すと、VBは上記の引数の合計を返します。93.24。引数は無制限に指定できます。 各関数の引数はコンマで区切る必要があることに注意してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です