尝试通过逐行引用来替换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调用返回的内容?
答案 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")