0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excel VBAエラー逆引き③ 【実行時エラー ‘9’: インデックスが有効範囲にありません。】

Posted at

【実行時エラー ‘9’: インデックスが有効範囲にありません。】の対処法です。

image.png

実行時エラー ‘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’』を食らいます。

image.png

Sub SampleError3_3()
    Debug.Print Worksheets("SheetX").Range("A1") '"SheetX"はありません、ここでエラー
End Sub

チェック 4 - Level 2 -

DictionaryのKeys、Itemsのインデックスは範囲内ですか?

Dictionaryは(キー、値)のペアでデータを格納してくれるとても便利なオブジェクトです。
使用するには参照設定で『Microsoft Scripting Runtime』にチェックを入れる必要があります。

image.png

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?