質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

825閲覧

For~NextのNextでIndexOutOfRangeExceptionが出る

p1123

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/09/09 02:49

編集2021/09/09 23:18

概要・前提

エクセルの書き込み用データを作成するためのシステムを作成しており、該当の箇所は各担当者別のデータを書き込んでいるロジックです
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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/09/10 00:17

エラーが発生した時の各配列の大きさ、添え字は確認されて問題がないのでしょうか?
guest

回答1

0

自己解決

結局WriteDatasの配列の確保ミスでした
配列が問題ないとかアホなことを思い込んでしまい反省しております

今回に関しては配列が足りない箇所(今回はWriteDatas)でエラーが出て止まると思い込んでいたのが原因で、IDEの機能に甘えず、もう少しエラー文を信用してしっかりデバッグすべきでした

投稿2021/09/10 00:16

p1123

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問