Interop:不能调用get_Range,也不能使用Range()返回的二维对象数组.Value2?

时间:2011-06-01 10:12:19

标签: .net vb.net excel interop

尝试通过逐行引用来替换Cell(RowIndex,ColumnIndex).Value()调用以获得性能,我在引用结果时永远失败。

Excel Interop - Efficiency and performance开始,其中包含使用get_range的提示,即

//get values
object[,] objectArray = shtName.get_Range("A1:Z100").Value2;
iFace = Convert.ToInt32(objectArray[1,1]);

//set values
object[,] objectArray = new object[3,1] {{"A"}{"B"}{"C"}};
rngName.Value2 = objectArray;

我认为我无法使用get_Range因为该方法对我来说无法调用,VB在运行时说(不是可见成员)。

现在我想出了类似的东西:

Dim Values As Object(,)
Values = Sheet.Range(Sheet.Cells(RowIndex, 1), Sheet.Cells(2, 17)).Value2
For Index As Integer = 0 To 16
  MsgBox(Values(0, Index))
Next

但是,引用具有两个维度索引的Values始终返回“索引超出数组范围”异常。使用调试器检查数组会显示一个漂亮的二维数组,该数组在第二维上应该有17个元素,因此Value (0,0)确实应该是一个有效的引用 - 但它不是:

调试器让我检查Value,我也可以深入到Value(0,0)并查看正确的值,但只重新评估该元素,即检查“Value (0,0)”会返回上面的消息。

如何引用我的Value2调用返回的内容?

2 个答案:

答案 0 :(得分:1)

也许是这样的?请注意,如果您希望数组将列作为您使用的第一个元素,请更改下面的行,如下所示:

Imports Microsoft.Office.Interop
    Module Module1
        Sub main()
            Dim appExcel As Excel.Application
            Dim wb As Excel.Workbook
            Dim ws As Excel.Worksheet
            Dim values As Object

            appExcel = GetObject(, "Excel.Application")
            wb = appExcel.Workbooks(1)
            ws = wb.Worksheets(1)
            With ws
                values = .Range(.Cells(1, 1), .Cells(2, 5)).Value2
                'if column is first element use appExcel.Worksheetfunction.Transpose(.Range(.Cells(1, 1), .Cells(2, 5)).Value2)
                For i As Int32 = LBound(values, 1) To UBound(values, 1)
                    For j As Int32 = LBound(values, 2) To UBound(values, 2)
                        System.Windows.Forms.MessageBox.Show(values(i, j))
                    Next j
                Next
            End With
        End Sub
    End Module

答案 1 :(得分:0)

尝试

Dim Values As Variant
Dim shtName as Worksheet
Set shtName = <your sheet>
Values = shtName.Range("A1:Z100")