【问题标题】:vb.net Object(,) Array index won't find (0,0) even though it's an 11x37 arrayvb.net Object(,) 数组索引不会找到 (0,0) 即使它是一个 11x37 数组
【发布时间】:2011-09-06 16:28:08
【问题描述】:

第一次在这里提问。提前感谢您提供的任何帮助。

我正在尝试从电子表格中读取一堆数据,将其切碎,然后将其放入数据库中。我宁愿不这样做,但这是与会计类型打交道的基本现实。值得庆幸的是,这些电子表格报告非常一致。无论如何,我正在使用 LINQ for SQL 来处理对象到引用的内容,并且我正在使用 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 之间的范围内同时获取字符串和整数,因此在这里将其设为对象数组是有意义的。我不想遍历每一行并在 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 还是很陌生,所以也许我只是缺少一些基本的东西。

【问题讨论】:

  • 当您调用 thisWorkArea = thisChart.Range("A14", "L51").Value2 在调试器中,在该行之后,您似乎正在将“thisWorkArea”设置为单元格的值执行时,如果将鼠标悬停在 thisWorkArea 上,会出现什么? Option Strict 是否开启?
  • 在调试器中,当我将鼠标悬停在 thisWorkArea 上时,会弹出一个工具提示,名称旁边是 {Length=456}。如果我单击加号,它会给我电子表格的预期值及其坐标,例如(0,0) “住院病人”。我不熟悉“Option Strict On”,但会明白这意味着什么。
  • 我打开了 Option Strict,确保所有内容都按照应输入的方式输入,我在这里遇到了完全相同的错误。不过,很高兴获得另一个 vb 提示 - 感谢 Chris Dunaway。
  • 我从工作人员那里得知,使用 Excel 填充这些数组时,Watch 报告它们具有 0 基,而实际上它们是 1 基。这非常奇怪,但我已经考虑过了,现在它可以工作了。奇怪!

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


【解决方案1】:

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

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

【讨论】:

  • 实际上 VBA 可以使用 any 基础(例如 Dim a(-7 to -3) 作为变体有效)。它是 Range 对象的 Value 属性,它返回一个基于 1 的数组
【解决方案2】:
        '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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多