【実行時エラー ‘9’: インデックスが有効範囲にありません。】の対処法です。
実行時エラー ‘9’:
インデックスが有効範囲にありません。
チェック 1 - Level 1 -
配列で範囲外を指定していませんか?
エラーメッセージの通り、有効範囲外のインデックスを指定した時に起こるエラーです。
配列の範囲を超えたものを指定していませんか?
Sub SampleError3_1_1()
Dim arr(2) As String 'インデックス0~2までを格納する配列を準備
arr(0) = "インデックス0"
arr(1) = "インデックス1"
arr(2) = "インデックス2"
arr(3) = "インデックス3" 'もちろん入りません!!ここでエラー
End Sub
Forループの場合も最初と最後に注意が必要です。
Sub SampleError3_1_2()
Dim arr(2) As String 'インデックス0~2までを格納する配列を準備
arr(0) = "インデックス0"
arr(1) = "インデックス1"
arr(2) = "インデックス2"
Dim i As Integer
For i = 0 To 3
Debug.Print arr(i) 'i=3の時にエラー!!ここでエラー
Next
End Sub
LBoundとUBoundで囲めば安心です。
- LBound (Lower Bound):インデックスの下限
- UBound (Upper Bound):インデックスの上限
Dim i As Integer
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next
チェック 2 - Level 1 -
Collectionで範囲外を指定していませんか?
配列同様Collectionでも範囲外を指定するとエラーになります。
配列とはインデックスの『開始番号』が違うので注意が必要です。
- Collectionはインデックスが『1』から始まる
- 配列はインデックスが『0※補足』から始まる
Sub SampleError3_2_1()
Dim col As Collection: Set col = New Collection 'Collectionは宣言時にサイズを指定する必要なし
col.Add "1番目"
col.Add "2番目"
col.Add "3番目"
Debug.Print col.Item(1) '"1番目"が表示されます。
Debug.Print col.Item(0) 'インデックスは『1』から始まります!!ここでエラー
End Sub
Forループの場合も最初と最後に注意が必要です。
Sub SampleError3_2_2()
Dim col As Collection: Set col = New Collection 'Collectionは宣言時にサイズを指定する必要なし
col.Add "1番目"
col.Add "2番目"
col.Add "3番目"
Dim i As Integer
For i = 0 To col.Count - 1 '他の言語に慣れているとこう書きがち
Debug.Print col.Item(i) 'i=0でエラー!!ここでエラー
Next
End Sub
補足:
Option Base 1
と指定することで配列もCollection同様『1』からインデックスをスタートさせることができます。(お勧めはしません。。。)
チェック 3 - Level 1 -
存在しないWorksheetを指定していませんか?
存在しないWorksheetを指定した場合も、『実行時エラー ‘9’』を食らいます。
Sub SampleError3_3()
Debug.Print Worksheets("SheetX").Range("A1") '"SheetX"はありません、ここでエラー
End Sub
チェック 4 - Level 2 -
DictionaryのKeys、Itemsのインデックスは範囲内ですか?
Dictionaryは(キー、値)のペアでデータを格納してくれるとても便利なオブジェクトです。
使用するには参照設定で『Microsoft Scripting Runtime』にチェックを入れる必要があります。
Dictionaryからデータを取り出す際にはItemにキーの値をそのまま指定するかKeysもしくはItemsにインデックスを指定します。
なお、Keys,ItemsのインデックスはCollectionとは異なり、『0』スタートです。
Sub SampleError3_4()
Dim dict As Dictionary: Set dict = CreateObject("Scripting.Dictionary")
dict.Add "キー1", "値1"
dict.Add "キー2", "値2"
dict.Add "キー3", "値3"
Debug.Print dict.Item("キー1") '"値1"が表示されます。
Debug.Print dict.Keys(1) '"キー2"が表示されます。
Debug.Print dict.Items(1) '"値2"が表示されます。
Debug.Print dict.Keys(3) 'Keys, Itemsは『0』スタートなので、『3』は範囲外!!ここでエラー
End Sub