vb.net对象(,)数组索引找不到(0,0),即使它是一个11x37数组

时间:2011-09-06 16:28:08

标签: vb.net arrays linq-to-sql multidimensional-array excel-interop

第一次提问者。提前感谢您提供任何帮助。

我试图从电子表格中读取一堆数据,将其删除,然后将其丢入数据库。我宁愿不以这种方式做事,但这是处理会计师类型的基本现实。值得庆幸的是,这些电子表格报告非常一致。无论如何,我使用LINQ for SQL来处理对象到引用的东西,并且我使用Microsoft.Office.Interop来获取我的Excel。

我通读了一个完整的.xls目录,每个人都打开文件,从一些特定的单元格中获取一些特定数据,然后获取一系列单元格来挑选值。 / p>

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) - > "住院" {字符串}

那我为什么得到这个例外?我把它放在你的专家手里。我仍然是vb.net的新手,所以也许我只是缺少一些基本的东西。

2 个答案:

答案 0 :(得分:4)

Excel使用从1开始的指标。这源于它使用VB作为应用内编程语言,传统上使用基于1的标记。

你会发现Excel返回了一个定义为thisWorkArea(1 To 11, 1 To 37) As Object

的数组

答案 1 :(得分: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