(在VS 2017上工作)
我有一个引用2个(或更多)单元格的excel列的范围。 为了获取他的数据,我使用以下代码将其转换为Object(,):
somevar = CType(ExcelWorksheet.Range(CeldaLat.Offset(0, 0), LastCell).Value2, Object(,))
请注意,我得到了一个带有标题的列和一个带有数据的单元格。 CeldaLat 引用范围的第一个单元格, LastCell 引用数据的最后一个单元格。
LastCell = CeldaLat.End(Excel.XlDirection.xlDown)
我不希望标题(第一行上为“经纬度”),因此我更改了offset()以仅获得具有以下代码的数据:
somevar = CType(ExcelWorksheet.Range(CeldaLat.Offset(1, 0), LastCell).Value2, Object(,))
当我有多于1行的数据(范围大于2行)时,我工作得很好,但是在前一张图像中所示的情况下(2行的范围,有1个数据单元),我得到了这个错误:
错误是“无法将“ System.String”转换为“ System.Object [,]”
显然,当单个单元格留在范围内时,无法将其转换为对象数组 Object(,),(因为不是数组?)
只有一行代码适用于所有情况?还是我需要做一个检查范围长度的函数,将其转换为object(,)?
答案 0 :(得分:0)
显然,当单个单元格留在范围内时,无法将其转换为对象数组。
正确。单个单元格的Value
是单个值,多个单元格范围的Value
是2D数组。
如果在所有情况下都需要数组,请在调用Value
之前检查范围内的单元格数目,或者调用Value
并查看它是否为数组-您需要为此要记住,一切都是Object
:
Dim somevar As Object = ExcelWorksheet.Range(CeldaLat.Offset(0, 0), LastCell).Value2
Dim result As Object(,)
If IsArray(somevar) Then
result = DirectCast(somevar, Object(,))
Else
result = New Object(,) {{somevar}}
End If