初めての質問者です。ご協力いただきありがとうございます。
スプレッドシートから大量のデータを読み取り、切り刻んでからデータベースに投入しようとしています。私はむしろこのように物事を行いたくありませんが、それは会計士タイプを扱う基本的な現実です. ありがたいことに、これらのスプレッドシート レポートは非常に一貫しています。とにかく、私は LINQ for SQL を使用して object-to-reference を処理し、Microsoft.Office.Interop を使用して Excel を起動しています。
.xls でいっぱいのディレクトリを読み、それぞれについてファイルを開き、特定のセルから特定のデータをいくつか取得してから、セルの範囲を取得して値を取得します。
Private Sub ProcessAFile(ByVal f As FileInfo)
thisFile = openApp.Workbooks.Open(f.fullName)
thisMonth = Split(thisChart.Range("D6").Value, "-").Last.Trim
thisFY = thisChart.Range("L7").Value
thisWorkArea = thisChart.Range("A14", "L51").Value2
openApp.Workbooks.Close()
...
thisWorkArea はグローバルとして淡色表示されました:
Dim thisWorkArea As Object(,)
A14 から L51 までの範囲で文字列と整数の両方を取得しているため、ここでは Object 配列にするのが理にかなっています。Excel で各行を調べて範囲を選択するのではなく、一度読んでから閉じたいのです。
したがって、次の例外が発生します。
System.IndexOutOfRangeException は処理されませんでした Message=Index が配列の範囲外でした。
この関数では:
Private Sub fillCurrMonth()
Dim theseRows As Integer() = {0, 2, 3, 5}
For Each i In theseRows
Dim thisMonth As New Month
'make sure category is in Database
thisMonth.Dept = thisDeptName
thisMonth.FY = thisFY
thisMonth.Category = thisWorkArea(i, 0)
...
上記の「月」は LINQ エンティティを指します。それは空想的なものではありません。
その最後の行で、例外をキャッチしています。私の時計では、thisWorkArea の長さが 456 で、(0,0) -> "Inpatient"{String} であることがわかりました。
では、なぜこの例外が発生するのでしょうか? これをあなたの専門家の手に委ねます。私はまだ vb.net にかなり慣れていないので、基本的なことが欠けているだけかもしれません。