概要・前提
エクセルの書き込み用データを作成するためのシステムを作成しており、該当の箇所は各担当者別のデータを書き込んでいるロジックです
rが一定値(2以上)になるとエラーが発生し、ループが出来ず、処理が出来ない状態になってしまいます
エラーの解決方法や原因等、ご教授お願い致します。
発生している問題・エラーメッセージ
※rが2以上の際に発生しています 例外がスローされました: 'System.IndexOutOfRangeException' ([ソフト名].exe の中) 型 'System.IndexOutOfRangeException' のハンドルされていない例外が [ソフト名].exe で発生しました インデックスが配列の境界外です。
該当のソースコード
VB.net
1※TantoCntはエラー時は18 2 3 '書き込み用データ作成 4 Dim prusrow As Integer = 4 5 For i = 0 To WriteRows.Count - 1 6 '既に確定しているデータを出力 7 WriteDatas(i + prusrow, SyuturyokuCol.No, 0) = CStr(i + 1) 8 WriteDatas(i + prusrow, SyuturyokuCol.管理番号, 0) = RirekiData(WriteRows(i), RirekiCol.管理番号).ToString 9 WriteDatas(i + prusrow, SyuturyokuCol.機種, 0) = RirekiData(WriteRows(i), RirekiCol.機種).ToString 10 WriteDatas(i + prusrow, SyuturyokuCol.治具, 0) = RirekiData(WriteRows(i), RirekiCol.治具).ToString 11 WriteDatas(i + prusrow, SyuturyokuCol.依頼, 0) = RirekiData(WriteRows(i), RirekiCol.依頼).ToString 12 WriteDatas(i + prusrow, SyuturyokuCol.不良内容, 0) = RirekiData(WriteRows(i), RirekiCol.不良内容).ToString 13 WriteDatas(i + prusrow, SyuturyokuCol.担当者, 0) = RirekiData(WriteRows(i), RirekiCol.担当).ToString 14 WriteDatas(i + prusrow, SyuturyokuCol.週報合計 + TantoCnt, 0) = SyuhoData(i + 2, 3) 15 WriteDatas(i + prusrow, SyuturyokuCol.請求時間 + TantoCnt, 0) = 16 RirekiData(WriteRows(i), RirekiCol.合計時間).ToString 17 18 '各担当者別データを出す 19 Dim Totals(TantoCnt - 1, 2) As Decimal 20 Dim tantosyaID As Integer = 0 21 Dim tantosya As String = WriteDatas(i + prusrow, SyuturyokuCol.担当者, 0) 22 For r = 0 To TantoCnt - 1 23 If TantoList(r).Substring(2, TantoList(r).Length - 2) = tantosya Then tantosyaID = r 24 25 WriteDatas(i + prusrow, SyuturyokuCol.週報コピー担当者 + r, 0) = SyuhoData(i + 2, r + 4) 26 WriteDatas(i + prusrow, SyuturyokuCol.差分担当者 + r + TantoCnt, 0) = SyuhoData(i + 2, r + 4) 27 Try 28 Totals(r, 0) = Decimal.Parse(SyuhoData(i + 2, r + 4)) 29 Catch ex As Exception 30 Totals(r, 0) = 0 31 End Try 32 33 Select Case WriteDatas(i + prusrow, SyuturyokuCol.依頼, 0) 34 Case "メンテナンス" 35 MenteB.Zikan(r) += Totals(r, 0) 36 If Totals(r, 0) <> 0 Then MenteB.Kensu(r) += 1 37 Case "消耗部材" 38 SyomoB.Zikan(r) += Totals(r, 0) 39 If Totals(r, 0) <> 0 Then SyomoB.Kensu(r) += 1 40 Case "改善活動" 41 KaizenB.Zikan(r) += Totals(r, 0) 42 If Totals(r, 0) <> 0 Then KaizenB.Kensu(r) += 1 43 Case "物件対応" 44 TaioB.Zikan(r) += Totals(r, 0) 45 If Totals(r, 0) <> 0 Then TaioB.Kensu(r) += 1 46 Case "定期校正" 47 TeikiB.Zikan(r) += Totals(r, 0) 48 If Totals(r, 0) <> 0 Then TeikiB.Kensu(r) += 1 49 Case "増産対応" 50 ZosanB.Zikan(r) += Totals(r, 0) 51 If Totals(r, 0) <> 0 Then ZosanB.Kensu(r) += 1 52 End Select 53 54 Try 55 Totals(r, 1) = Decimal.Parse(SyuhoData(i + 2, r + 4 + TantoCnt + 1)) + 56 Decimal.Parse(SyuhoData(i + 2, r + 4 + (TantoCnt * 2) + 2)) 57 Catch ex As Exception 58 Totals(r, 1) = 0 59 End Try 60 Totals(r, 2) = Totals(r, 0) - Totals(r, 1) 61 WriteDatas(i + prusrow, SyuturyokuCol.教育指導担当者 + r + (TantoCnt * 2), 0) = Totals(r, 1).ToString 62 KyoikuSidoB.Zikan(r) += Totals(r, 1) 63 If Totals(r, 1) <> 0 Then KyoikuSidoB.Kensu(r) += 1 64 WriteDatas(i + prusrow, SyuturyokuCol.物件対応担当者 + r + (TantoCnt * 3), 0) = Totals(r, 2).ToString 65 Next'<<<ここでエラー 66 67... 中略 .. 68 69Next
試したこと
・該当するロジックの配列をデバッグした
⇒特に問題は無く、ロジックを取り出して3以上の数値を入れたがエラーは発生しなかった
・Next i、Next rを付け足した
⇒同じエラーが発生した
・問題の箇所のForNextをDo WhileLoopに変えた
⇒r+=1で同じエラーが発生し、rの初期値を3以上にした場合も同じ箇所でエラーが発生した
・For~Next内の処理を別プロシージャにした
⇒同様のエラーがEnd Subで発生した
コード
VB.Net
1 For r = 0 To TantoCnt - 1 2 If TantoList(r).Substring(2, TantoList(r).Length - 2) = tantosya Then tantosyaID = r 3 TantobetuDataAdd(WriteDatas, Totals, i, r, prusrow, TantoCnt, SyuhoData) 4 Next 5 6 Private Sub TantobetuDataAdd(ByRef WriteDatas(,,) As String, ByRef Totals(,) As Decimal, 7 i As Integer, r As Integer, prusrow As Integer, TantoCnt As Integer, SyuhoData(,) As String) 8 WriteDatas(i + prusrow, SyuturyokuCol.週報コピー担当者 + r, 0) = SyuhoData(i + 2, r + 4) 9 WriteDatas(i + prusrow, SyuturyokuCol.差分担当者 + r + TantoCnt, 0) = SyuhoData(i + 2, r + 4) 10 Try 11 Totals(r, 0) = Decimal.Parse(SyuhoData(i + 2, r + 4)) 12 Catch ex As Exception 13 Totals(r, 0) = 0 14 End Try 15 16 Select Case WriteDatas(i + prusrow, SyuturyokuCol.依頼, 0) 17 Case "メンテナンス" 18 MenteB.Zikan(r) += Totals(r, 0) 19 If Totals(r, 0) <> 0 Then MenteB.Kensu(r) += 1 20 Case "消耗部材" 21 SyomoB.Zikan(r) += Totals(r, 0) 22 If Totals(r, 0) <> 0 Then SyomoB.Kensu(r) += 1 23 Case "改善活動" 24 KaizenB.Zikan(r) += Totals(r, 0) 25 If Totals(r, 0) <> 0 Then KaizenB.Kensu(r) += 1 26 Case "物件対応", "物対" 27 TaioB.Zikan(r) += Totals(r, 0) 28 If Totals(r, 0) <> 0 Then TaioB.Kensu(r) += 1 29 Case "K社案件" 30 KsyaB.Zikan(r) += Totals(r, 0) 31 If Totals(r, 0) <> 0 Then KsyaB.Kensu(r) += 1 32 Case "定期校正" 33 TeikiB.Zikan(r) += Totals(r, 0) 34 If Totals(r, 0) <> 0 Then TeikiB.Kensu(r) += 1 35 Case "増産対応" 36 ZosanB.Zikan(r) += Totals(r, 0) 37 If Totals(r, 0) <> 0 Then ZosanB.Kensu(r) += 1 38 End Select 39 40 Try 41 Totals(r, 1) = Decimal.Parse(SyuhoData(i + 2, r + 4 + TantoCnt + 1)) + 42 Decimal.Parse(SyuhoData(i + 2, r + 4 + (TantoCnt * 2) + 2)) 43 Catch ex As Exception 44 Totals(r, 1) = 0 45 End Try 46 Totals(r, 2) = Totals(r, 0) - Totals(r, 1) 47 WriteDatas(i + prusrow, SyuturyokuCol.教育指導担当者 + r + (TantoCnt * 2), 0) = Totals(r, 1).ToString 48 KyoikuSidoB.Zikan(r) += Totals(r, 1) 49 If Totals(r, 1) <> 0 Then KyoikuSidoB.Kensu(r) += 1 50 WriteDatas(i + prusrow, SyuturyokuCol.物件対応担当者 + r + (TantoCnt * 3), 0) = Totals(r, 2).ToString 51 End Sub'<<<ここでエラー
補足情報(FW/ツールのバージョンなど)
OS:Windows 10 Pro
使用ツール:VS Express 2017 for Windows Desktop
プロジェクトテンプレート:Win Forms(.NET Framework)
フレームワーク:.NET Framework4.7.2
回答1件
あなたの回答
tips
プレビュー