インデックスが有効範囲にありませんと言われる理由とは?

このQ&Aのポイント
  • VBAで複数のCSVファイルからデータを読み込み、1つのシートに結果を書き込みたい場合、インデックスが有効範囲にないエラーが発生することがあります。
  • このエラーは、ファイルを開く際に与えられるインデックスがシート数の範囲外になっているために発生します。
  • 具体的には、1から100までの番号を持つCSVファイルを順に開いてデータを取得しているプログラムで、CSVファイルの数が100を超えるとエラーが発生します。
回答を見る
  • ベストアンサー

”インデックスが有効範囲にありません”と言われます

はじめまして。 VBA初心者です。 次のプログラムを実行すると、 ”インデックスが有効範囲にありません”と言われます。 見よう見まねで本を参考に式を書いてみました。 1.csv のシート名”1”→ 2.csvのシート名"2"→…→100.csvのシート名”100”と順にファイルを読込みませて、 1つのシートに上から、1.csvのシート”1”の結果、2.csvのシート名の”2”の結果、と順に100行まで書き込みたいと考えているのですが上記のエラーになってしまいました。 今のままだと1行目、2行目に1.csvの結果が表示されるだけです。 エラーの原因がわからなくなってしまいました… すみませんが、よろしくお願いします。 以下、VBAです。 Option Explicit Sub test() Dim fileNames As Variant Dim a(12) As Long Dim lp As Integer fileNames = Application.GetOpenFilename(MultiSelect:=True) If IsArray(fileNames) = True Then For lp = 1 To UBound(fileNames) Workbooks.Open (fileNames(lp)) ThisWorkbook.Worksheets("Sheet1").Range("B2", "B" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF5").Value ThisWorkbook.Worksheets("Sheet1").Range("C2", "C" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF6").Value ThisWorkbook.Worksheets("Sheet1").Range("D2", "D" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF7").Value ThisWorkbook.Worksheets("Sheet1").Range("E2", "E" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF8").Value ThisWorkbook.Worksheets("Sheet1").Range("F2", "F" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF9").Value ThisWorkbook.Worksheets("Sheet1").Range("G2", "G" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF10").Value ThisWorkbook.Worksheets("Sheet1").Range("H2", "H" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF11").Value ThisWorkbook.Worksheets("Sheet1").Range("I2", "I" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF12").Value ThisWorkbook.Worksheets("Sheet1").Range("J2", "J" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF13").Value ThisWorkbook.Worksheets("Sheet1").Range("K2", "K" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF14").Value ThisWorkbook.Worksheets("Sheet1").Range("L2", "L" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF15").Value ThisWorkbook.Worksheets("Sheet1").Range("M2", "M" & lp).Value _ = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF16").Value a(1) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF5").Value a(2) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF6").Value a(3) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF7").Value a(4) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF8").Value a(5) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF9").Value a(6) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF10").Value a(7) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF11").Value a(8) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF12").Value a(9) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF13").Value a(10) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF14").Value a(11) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF15").Value a(12) = ActiveWorkbook.Worksheets(CInt(lp)).Range("BF16").Value ThisWorkbook.Worksheets("Sheet1").Range("N2", "N" & lp).Value _ = (a(1) + a(2) + a(3) + a(4) + a(5) + a(6) + a(7) + a(8) + a(9) + a(10) + a(11) + a(12)) / 12 ThisWorkbook.Worksheets("Sheet1").Range("O2", "O" & lp).Value _ = WorksheetFunction.Max(a(1), a(2), a(3), a(4), a(5), a(6), a(7), a(8), a(9), a(10), a(11), a(12)) ActiveWorkbook.Close a(1) = 0 a(2) = 0 a(3) = 0 a(4) = 0 a(5) = 0 a(6) = 0 a(7) = 0 a(8) = 0 a(9) = 0 a(10) = 0 a(11) = 0 a(12) = 0 Next End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは 配列は Dim a(1 To 12) As Long としてもいいかと思いますが、コード全体として Sub test()   Dim fileNames As Variant   Dim a As Workbook   Dim lp As Integer   fileNames = Application.GetOpenFilename(MultiSelect:=True)   Application.ScreenUpdating = False   With ThisWorkbook.Worksheets("Sheet1")     If IsArray(fileNames) = True Then            For lp = 1 To UBound(fileNames)         Set a = Workbooks.Open(fileNames(lp))         .Cells(lp, "B").Resize(, 12).Value _           = WorksheetFunction.Transpose( _               a.Worksheets(1).Range("BF5").Resize(12).Value)         .Cells(lp, "N").Value _           = WorksheetFunction.Sum(.Cells(lp, "B").Resize(, 12)) / 12         .Cells(lp, "O").Value _           = WorksheetFunction.Max(.Cells(lp, "B").Resize(, 12))         a.Saved = True         a.Close False       Next     End If   End With   Application.ScreenUpdating = True End Sub これ位でも良いのでは? CSVファイル名が本当に1.csvから100.csvなら、ファイル名で指定して開いて 処理した方がいかと思います。

ymstakk
質問者

お礼

本当にありがとうございました。おかげさまでがんばって修正をしたら回るようになりました。1-100のファイルが入ったフォルダが何個かあったので、一気に回すことを考えていました。

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8522/19371)
回答No.1

>Dim a(12) As Long 上記のように宣言した場合、初期状態では、a(0)~a(11)が「有効なインデックスの範囲」になります。 なので a(12) = 0 を実行した瞬間に「インデックスが有効範囲にありません」になります。 配列の要素番号を「1から」にしたい場合は、VBAの1行目に Option Base 1 の行を追加して下さい。 すると、a(1)~a(12)が「有効なインデックスの範囲」になります。

ymstakk
質問者

お礼

本当にありがとうございました。おかげさまでがんばって修正をしたら回るようになりました。

関連するQ&A

  • インデックスが有効範囲に出ないと出る

    下記のようなVBAを書きました。しかしインデックスが有効範囲にないとメッセージがでるのですが、どこがまちがっているでしょうか?? Sub macro1() Dim i As Long Dim r As Long Worksheets("フェアリスト ").Select Worksheets("csv").Range("A:C").ClearContents For i = 2 To 50 Step 5 If Worksheets("フェアリスト").Cells(11, i + 1) <> "" Then r = Worksheets("フェアリスト").Cells(65536, i + 1).End(xlUp).Row Worksheets("フェアリスト").Range(Cells(11, i), Cells(r, i + 3)).Copy _ Destination:=Worksheets("csv").Range("B65536").End(xlUp).Offset(1) Worksheets("csv").Range("A65536").End(xlUp).Offset(1).Resize(r - 3, 1).Value = Worksheets("フェアリスト").Cells(8, i).Value End If Next i Worksheets("csv").Range("A1:C1").Delete shift:=xlShiftUp End Sub

  • ★部分でインデックスが有効範囲にありません。とでます。

    ★部分でインデックスが有効範囲にありません。とでます。  集計依頼情報(2)から集計用依頼情報にコピーしたものを貼り付け  たいのですが、ここで上のエラーがでます。  何がおかしいのでしょうか? ちなみにエクセルVBAです。   Sub sample() Dim lngKns As Integer Dim lngRow As Long Workbooks.Open Filename:=ThisWorkbook.Path & "\集計用依頼情報(2).csv" Worksheets("集計用依頼情報(2)").Activate '受付日の数をカウントしてデータ数を取得 lngKns = WorksheetFunction.Count(Worksheets("集計用依頼情報(2)").Range("Z2:Z65536")) '集計用依頼情報(2)→集計用依頼情報にコピー Worksheets("集計用依頼情報(2)").Select Worksheets("集計用依頼情報(2)").Range("A2:CW" & 1 + lngKns).Copy Workbooks.Open Filename:=ThisWorkbook.Path & "\集計用依頼情報.csv" '受付日の数をカウントしてデータ数を取得 lngRow = WorksheetFunction.Count(Worksheets("集計用依頼情報").Range("Z2:Z65536")) ★ ThisWorkbook.Worksheets("集計用依頼情報").Activate '値貼り付け ThisWorkbook.Worksheets("集計用依頼情報").Range("A" & lngRow + 1 & _ ":CW" & lngRow + lngKns).Paste ActiveSheet.Paste Application.CutCopyMode = False End Sub

  • インデックスが有効範囲にありませんと出てしまう

    VBAで"実行時エラー9 インデックスが有効範囲にありません"と出てしまいます、解決方法を教えていただけないでしょうか? 以下のVBAで上記のエラーが出てしまいます。ちなみに私はVBA初心者です。 VBAの内容としてはとあるブックのシートを丸ごと、そのシートを必要とするブックのシートに貼り付けるというものです。 Sub コピー() Dim ファイル名, 基本ファイル名 Dim i, j As String i = ActiveWorkbook.Name j = ActiveSheet.Name Application.DisplayAlerts = False 基本ファイル名 = Sheets("データリスト").Range("B14").Value →ここでエラー発生 Workbooks.Open 基本ファイル名 If Err.Number > 0 Then MsgBox "『○○』を開けませんでした" & vbCrLf & _ "ファイル名が間違っているか、存在しないか、拡張子が違います" & vbCrLf & vbCrLf & _フォルダ & " に " & vbCrLf & _ 基本ファイル名 & "ファイルがありません" Exit Sub End If Worksheets("リスト").Range("A1:N400").Copy Workbooks(i).Worksheets("リスト").Range("A1:N400").PasteSpecial Workbooks(基本ファイル名).Close SaveChanges:=False →ここでもエラーが出てしまうことがある Sheets(j).Select Application.DisplayAlerts = True MsgBox ("リストを取り込みました") End Sub

  • 「オブジェクトが必要です。」エラーになります。

    次のコードで2.は動くのですが、1.が動きません。「オブジェクトが必要です。」エラーになります。 何が違うんでしょうか? 教えてください。よろしくお願いします。 Function hoge(aa As Range) aa.Value = "Hello!!" End Function Sub Worksheet_Activate() Dim a As Range Set a = ThisWorkbook.Worksheets("Sheet1").Range("G10") hoge (a) ' ←1.これだとエラーになる ' hoge (ThisWorkbook.Worksheets("Sheet1").Range("G10")) ' 2.こちらはOK End Sub

  • 特定ファイルだけの取り込み許可

    現在以下の方法でエクセルにCSVの取り込みを行っています。 =============================================================== Dim FileNames As Variant Dim fn As Variant FileNames = Application.GetOpenFilename("20080604,*.csv", MultiSelect:=True) If VarType(FileNames) = vbBoolean Then Exit Sub For Each fn In FileNames With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fn, Destination:=Worksheets("集計").Range("A1")) ~ ============================================================== 「20080604.csv」以外のファイルは取り込ませたくありません。 良い方法はありませんか? ファイルのディレクトリは不特定です。 よろしくお願いいたします。

  • ブック内に特定名のシートがある場合

    はじめまして、こんにちは。 VBAを最近はじめたばかりの者です。質問が初歩的なもので申し訳ないのですが是非教えてください。 以下を使って、複数ブックの○○というシートから指定セルの内容を抜き出したいと思っています。 ところが、ブックによっては○○というシートが存在しない場合があり、その場合には「インデックスが有効でない」というエラーで動作が止まってしまいます。 ブック内に○○というシートがある場合にのみ動作させるようにするにはどのようにすれば良いのでしょうか。 よろしくお願いします。 Dim wb As Workbook, myRow As Long Dim e As Integer myRow = ThisWorkbook.Worksheets(1).Rows.Count With Application.FileSearch .NewSearch .LookIn = ThisWorkbook.Path .SearchSubFolders = True .FileType = msoFileTypeExcelWorkbooks If .Execute() > 0 Then For i = 1 To .FoundFiles.Count If .FoundFiles(i) <> ThisWorkbook.FullName Then Set wb = Workbooks.Open(.FoundFiles(i), UpdateLinks:=0) Application.ScreenUpdating = False ThisWorkbook.Worksheets(1).Range("A" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F6").Value ThisWorkbook.Worksheets(1).Range("B" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F7").Value ThisWorkbook.Worksheets(1).Range("C" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("F8").Value ThisWorkbook.Worksheets(1).Range("D" & myRow).End(xlUp).Offset(1, 0).Value = _ wb.Worksheets("○○").Range("Y6").Value wb.Close False End If Next i Else MsgBox "ファイルがありません。" End If End With End Sub

  • Excel VBA 定数にオブジェクトを指定したい

    Excel VBA 定数にオブジェクトを指定したい いつもお世話になりますm(__)m Excel VBAで、定数としてオブジェクトの指定はできないのでしょうか? 例えば、WorkSheets("Sheet1")を定数「Srt1」として設定したいのですが、  Public Const Srt1 As Object = Worksheets("Sheet1") としても「定数のデータ型が不正です」とエラーがでます。 例えば、セルに値をセットする時に Worksheets("Sheet1").Range("A1").Value="あああ" Worksheets("Sheet1").Range("A2").Value="いいい" Worksheets("Sheet1").Range("A3").Value="ううう" と書きますが、これを Srt1.Range("A1").Value="あああ" Srt1.Range("A2").Value="いいい" Srt1.Range("A3").Value="ううう" と書ければプログラムも見やすく、書きやすくなると思いました。 プログラムの最初に Dim Srt1 As Object Set Srt1 = Worksheets("Sheet1") とすれば使えるのですが、複数のシート名をまずは定数として登録したいと思っていますが、オブジェクト(ワークシート名)は定数として登録することは出来ないのでしょうか? お詳しいかた、是非ともご教授お願い致しますm(__)m

  • エクセル インデックスを用いた串刺し計算

    例えば sheetが10枚で "A1" の値を合計するマクロで11枚目のsheetの "A3"に表示させるのに 下記のようにすると出来ましたが、これを短く記述する方法を教えてください、よろしくお願いします。 Range("a3").value=Worksheets(1).Range("a1").valur + Worksheets(2).Range("a1").value + Worksheets(3).Range("a1").value + ・・・・・・・Worksheets(10).Range("a1").value

  • excelのifステートメントのテストで…

    御観覧ありがとうございます。 スパテクという本を買って、excelを勉強しようと、 サンプルを打ち込んでいて、何度かエラーになったりしましたが、 調べることや、入力ミスの確認で回避出来ていたのですが、 本通りに打っているのに、 「エラー438、オブジェクトは、このプロパティまたはメソッドをサポートしてません。」 と出ます。 エクセル2007です。入力したプロシージャは、 Option Explicit Dim nSample1_12 As Integer Sub Sample1_12() nSample1_12 = nSample1_12 + 1 ThisWorkbook.Worksheets("sheet1").Range("A1") = nSample1_12 End Sub Sub Sample1_13() Dim sA2 As String sA2 = ThisWorkbook.Worksheets("sheet1").Range("A2") If sA2 = "" Then ThisWorkbook.Worksheets("sheet1").Renge("A2") = "Sample1_13" ElseIf sA2 = "Sample1_13" Then ThisWorkbook.Worksheets("sheet1").Range("A2") = "基本の文法 ifステートメント" Else ThisWorkbook.Worksheets("sheet1").Range("A2") = "" End If End Sub このサンプル13を実行すると、A2にsample1_13と出るはずなそうなんですが…エラーになります。

  • VBA 初心者

    sheet1から、sheet2データを検索して抽出する練習をしているのですがerror"1104"が表示されます、なぜなのか分からないので投稿しました、よろしくお願いします。 sub test() dim sh1 as worksheets dim sh2 as worksheets dim  i  as  integer set sh1 = thisworkbook.worksheets("sheet1!") set sh2 = thisworkbook.worksheets("sheet2!") b = userform1.textbox1 for i = 1 to 10 sh1 .cells(i,2) = b b = b+1 x = sh1.cells(1,2) sh1.cells(i,3).value = worksheetfunction.vlookup(x,sh2.range("a1:d500"),2,false) next i end sub

専門家に質問してみよう