質問するログイン新規登録

Q&A

1回答

384閲覧

VBAエラー「インデックスが有効範囲にありません。」 一部PCのみ出る

YT0121

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2026/02/17 05:18

0

0

実現したいこと

Excelシートを取り込み、条件に合うシートから指定した値を"【評価者入力用】評価シート"に転記

発生している問題・分からないこと

社内のいろんな人が使っていて問題なく使用できるのですが、
一人だけずっと「インデックスが有効範囲にありません。」のエラーが出てしまいます。

しかし、原因を調べるために
その方が持っているマクロ入りブックと取り込みたいブックをいただいて
こちらで実行すると問題なく動くため、原因がわかりません。

エラーメッセージ

error

1インデックスが有効範囲にありません。 2 3デバック↓ 4 ' 既に開かれているブックであるかを確認 5 On Error Resume Next 6 Set evalBook = Workbooks(fileNameOnly)  ←ここがハイライト 7 On Error GoTo 0

該当のソースコード

VBA

1Sub ImportChallengeSheetEvaluations() 2 Dim wbHome As Workbook ' マクロが書かれているこのブック 3 Dim wsMain As Worksheet 4 Dim evalBook As Workbook 5 Dim wsEval As Worksheet 6 Dim selectedFile As Variant 7 Dim lastRowMain As Long 8 Dim empID As String, goalName As String 9 Dim matchCount As Long, fileCount As Long 10 Dim sheetCount As Long ' 識別子が一致したシートの数をカウント 11 12 ' エラーシートを記録するコレクション 13 Dim errorSheets As Collection ' 要素: Array(ファイルパス, シート名, エラーメッセージ) 14 Dim errorSheetDetail As Variant 15 16 Dim matchInCurrentSheet As Boolean 17 Dim goalIndex As Long, rowOffset As Long 18 Dim j As Long 19 20 ' --- 1. メインシートの特定ロジック --- 21 ' マクロが入っているこのブックを基準にする(アドイン・個人用マクロブック対策) 22 Set wbHome = ThisWorkbook 23 24 On Error Resume Next 25 Set wsMain = wbHome.Sheets("【評価者入力用】評価シート") 26 27 ' もし見つからない場合、念のため実行時のアクティブブックも探す 28 If wsMain Is Nothing Then 29 Set wsMain = ActiveWorkbook.Sheets("【評価者入力用】評価シート") 30 Set wbHome = ActiveWorkbook 31 End If 32 On Error GoTo 0 33 34 If wsMain Is Nothing Then 35 MsgBox "エラー:対象シート「【評価者入力用】評価シート」が見つかりません。" & vbCrLf & _ 36 "マクロを実行しているファイルが正しいか確認してください。", vbCritical 37 Exit Sub 38 End If 39 40 ' --- 2. 初期設定 --- 41 lastRowMain = wsMain.Cells(wsMain.Rows.Count, "F").End(xlUp).Row 42 matchCount = 0 43 fileCount = 0 44 sheetCount = 0 45 Set errorSheets = New Collection 46 47 ' --- 3. ファイル選択ダイアログ --- 48 With Application.FileDialog(msoFileDialogFilePicker) 49 .Title = "チャレンジシートファイルを選択してください(複数選択可)" 50 .Filters.Clear 51 .Filters.Add "Excelファイル", "*.xls*" 52 .Filters.Add "Excelファイル(全)", "*.xlsx;*.xlsm" 53 .AllowMultiSelect = True 54 If .Show <> -1 Then Exit Sub 55 56 For Each selectedFile In .SelectedItems 57 58 Dim fileNameOnly As String 59 fileNameOnly = Mid(selectedFile, InStrRev(selectedFile, "\") + 1) 60 61 Set evalBook = Nothing 62 63 ' 既に開かれているブックであるかを確認 64 On Error Resume Next 65 Set evalBook = Workbooks(fileNameOnly) 66 On Error GoTo 0 67 68 If evalBook Is Nothing Then 69 On Error Resume Next 70 ' 他人が使用中でも開けるように読み取り専用で開く 71 Set evalBook = Workbooks.Open(fileName:=selectedFile, ReadOnly:=True) 72 If Err.Number <> 0 Then 73 errorSheets.Add Array(selectedFile, "全シート", "ファイルを開く際にエラーが発生しました(破損やアクセス権等)") 74 Err.Clear 75 On Error GoTo 0 76 GoTo NextFile 77 End If 78 On Error GoTo 0 79 End If 80 81 If evalBook Is Nothing Then GoTo NextFile 82 fileCount = fileCount + 1 83 84 ' --- 4. 各シートの処理 --- 85 For Each wsEval In evalBook.Worksheets 86 If wsEval.Type = xlWorksheet Then 87 88 ' B2セルの識別子をチェック 89 If Trim(wsEval.Range("B2").Value) = "≪チャレンジシート≫" Then 90 sheetCount = sheetCount + 1 91 matchInCurrentSheet = False 92 93 ' 社員ID(L4セル)のエラー値チェック 94 If IsError(wsEval.Range("L4").Value) Then 95 empID = "" 96 Else 97 empID = Trim(wsEval.Range("L4").Value) 98 End If 99 100 If empID = "" Then 101 errorSheets.Add Array(selectedFile, wsEval.Name, "社員ID(L4セル)が空またはエラー値です") 102 GoTo NextSheet 103 End If 104 105 For goalIndex = 1 To 4 106 rowOffset = 10 + (goalIndex - 1) * 5 107 goalName = "目標" & goalIndex 108 109 ' 評価項目の値を結合セルから取得(指定された最新の列位置) 110 Dim weightVal As Variant, selfEval As Variant, eval1 As Variant 111 Dim eval2 As Variant, eval3 As Variant, finalEval As Variant 112 113 weightVal = wsEval.Cells(rowOffset, "D").MergeArea.Cells(1, 1).Value 114 selfEval = wsEval.Cells(rowOffset, "W").MergeArea.Cells(1, 1).Value ' W列:自己 115 eval1 = wsEval.Cells(rowOffset, "Y").MergeArea.Cells(1, 1).Value ' Y列:1次 116 eval2 = wsEval.Cells(rowOffset, "Z").MergeArea.Cells(1, 1).Value ' Z列:2次 117 eval3 = wsEval.Cells(rowOffset, "AA").MergeArea.Cells(1, 1).Value ' AA列:3次 118 finalEval = wsEval.Cells(rowOffset, "AB").MergeArea.Cells(1, 1).Value ' AB列:最終 119 120 ' メインシート(wsMain)側の行を探索 121 For j = 1 To lastRowMain 122 Dim actualEmpID As String 123 Dim empIDCell As Range 124 Set empIDCell = wsMain.Cells(j, 6).MergeArea.Cells(1, 1) ' F列(6) 125 126 ' メインシート側の社員IDエラー値チェック 127 If IsError(empIDCell.Value) Then 128 actualEmpID = "" 129 Else 130 actualEmpID = Trim(empIDCell.Value) 131 End If 132 133 ' 社員IDと目標名が一致した場合のみ転記 134 If actualEmpID <> "" And actualEmpID = empID And Trim(wsMain.Cells(j, 14).Value) = goalName Then 135 With wsMain 136 .Cells(j, 13).Value = weightVal * 100 ' M列 137 .Cells(j, 15).Value = selfEval ' O列 138 .Cells(j, 16).Value = eval1 ' P列 139 .Cells(j, 17).Value = eval2 ' Q列 140 .Cells(j, 18).Value = eval3 ' R列 141 .Cells(j, 20).Value = finalEval ' T列 142 End With 143 144 matchCount = matchCount + 1 145 matchInCurrentSheet = True 146 Exit For 147 End If 148 Next j 149 Next goalIndex 150 151 If matchInCurrentSheet = False Then 152 errorSheets.Add Array(selectedFile, wsEval.Name, "メインシートに該当する社員ID・目標が見つかりませんでした") 153 End If 154 155 Else 156 ' 識別子が不一致だが空欄ではないシートはログに残す 157 If Len(Trim(wsEval.Range("B2").Value)) > 0 Then 158 errorSheets.Add Array(selectedFile, wsEval.Name, "識別子(B2セル)が不一致でした") 159 End If 160 End If 161 End If 162NextSheet: 163 Next wsEval 164 165 ' 開いたブックを閉じる(マクロブック自身でない場合のみ) 166 If Not evalBook Is Nothing Then 167 If evalBook.Name <> wbHome.Name Then 168 evalBook.Close SaveChanges:=False 169 End If 170 End If 171 172NextFile: 173 Next selectedFile 174 End With 175 176 ' --- 5. エラーログの出力 --- 177 Dim logSheet As Worksheet 178 On Error Resume Next 179 Set logSheet = wbHome.Sheets("取込エラー") 180 If logSheet Is Nothing Then 181 Set logSheet = wbHome.Sheets.Add(After:=wbHome.Sheets(wbHome.Sheets.Count)) 182 logSheet.Name = "取込エラー" 183 End If 184 On Error GoTo 0 185 186 logSheet.Cells.ClearContents 187 logSheet.Range("A1:C1").Value = Array("ファイル名", "シート名", "エラー内容") 188 logSheet.Range("A1:C1").Font.Bold = True 189 190 Dim r As Long: r = 2 191 For Each errorSheetDetail In errorSheets 192 logSheet.Cells(r, 1).Value = Mid(errorSheetDetail(0), InStrRev(errorSheetDetail(0), "\") + 1) 193 logSheet.Cells(r, 2).Value = errorSheetDetail(1) 194 logSheet.Cells(r, 3).Value = errorSheetDetail(2) 195 r = r + 1 196 Next 197 198 logSheet.Columns("A:C").AutoFit 199 200 ' --- 6. 完了報告 --- 201 MsgBox "処理が完了しました。" & vbCrLf & vbCrLf & _ 202 "識別子一致シート数: " & sheetCount & vbCrLf & _ 203 "データ転記成功件数: " & matchCount & " 件" & vbCrLf & _ 204 "エラー(スキップ)数 : " & errorSheets.Count & " 件", vbInformation 205End Sub

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

このサイトの過去の質問に
「ワークブックやワークシートの指定方法で、
Workbooksコレクションでワークブックを指定していますが、これが一番の原因」
「アドインにすると、Excelのファイル名が変更されてしまう(正確には、拡張子が異なる)」
とあったので、Geminiにて上記を盛り込んで再作成しましたが、解決しませんでした。

補足

ほぼ素人なため、元の作成自体もGeminiです。
情報不足でしたら申し訳ございません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答1

0

On Error Resume Next
Set evalBook = Workbooks(fileNameOnly)  ←ここがハイライト
On Error GoTo 0

  1. Excel 上で Visual Basic Editor を開く。

  2. メニューより[ツール]->[オプション]を開く。

  3. [全般]タブ -> [エラートラップ]プロパティの設定値を確認する。

社内のいろんな人が使っていて問題なく使用できるのですが、
一人だけずっと「インデックスが有効範囲にありません。」のエラーが出てしまいます。

恐らくそのユーザーの環境では「エラー発生時に中断」となっているはず。
その場合は「エラー処理対象外のエラーで中断」に変更し、[OK]ボタンをクリックしてください。

投稿2026/02/17 06:58

編集2026/02/17 06:59
sk.exe

総合スコア1149

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問