1

初めての質問者です。ご協力いただきありがとうございます。

スプレッドシートから大量のデータを読み取り、切り刻んでからデータベースに投入しようとしています。私はむしろこのように物事を行いたくありませんが、それは会計士タイプを扱う基本的な現実です. ありがたいことに、これらのスプレッドシート レポートは非​​常に一貫しています。とにかく、私は 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 にかなり慣れていないので、基本的なことが欠けているだけかもしれません。

4

2 に答える 2

4

Excel は 1 ベースのインデックスを使用します。これは、従来 1 ベースのインデックスを使用していたアプリ内プログラミング言語として VB を使用していることに起因します。

Excel が次のように定義された配列を返したことがわかります。thisWorkArea(1 To 11, 1 To 37) As Object

于 2011-09-06T22:47:15.493 に答える
0
        'Fix excel's 1 based index
        Dim oData(UBound(xData) - 1, UBound(xData, 2) - 1) As Object
        For i As Integer = 1 To UBound(xData)
            For ii As Integer = 1 To UBound(xData, 2)
                oData(i - 1, ii - 1) = xData(i, ii)
            Next
        Next
于 2016-09-14T17:47:54.867 に答える