首先,我强调我使用的是Visual Studio 2017,处于VSTO / .Net环境下。这里没有VBA。
您有一个MyRange as Excel.Range = something
对象,并且您想引用该范围的左上方单元格。两种选择:
MyRange.Range("A1")
MyRange.Cells(1,1)
但是,尽管文档指出.Cells()
返回了一个Excel.Range
对象,但Intellisense不会照此选择。例如,MyRange.Cells(1,1).Value2
在Intellisense下拉列表中不易使用。但是,如果您确实手动输入.Value2
,则不会出现任何问题。
我的问题是:这是Visual Studio的限制吗?还是在编译时以及随后在运行时都具有一定的含义?
首先,我开始使用.Range("A1")
,但是在处理动态引用(例如与.Cells(i,j)
等价的动态引用时)变得非常不便。
因此,我创建了自己的扩展程序,该扩展程序依赖于隐式转换。那样行吗? (第二个问题)
Module RangeExtensions
''' <summary>
''' Returns a Range object that represents the cell in the specified range.
''' </summary>
<System.Runtime.CompilerServices.Extension()>
Public Function Cell(ByVal MyRange As Excel.Range, ByVal RowIndex As Long, ByVal ColumnIndex As Long) As Excel.Range
Return MyRange.Cells(RowIndex, ColumnIndex)
End Function
''' <summary>
''' Returns a Range object that represents the cell in the specified worksheet.
''' </summary>
<System.Runtime.CompilerServices.Extension()>
Public Function Cell(ByVal MySheet As Excel.Worksheet, ByVal RowIndex As Long, ByVal ColumnIndex As Long) As Excel.Range
Return MySheet.Cells(RowIndex, ColumnIndex)
End Function
End Module
答案 0 :(得分:2)
这不是Visual Studio的限制,而是System.Object
类型的属性之一。
rangeReference.Cells
是Range
类型的属性,它返回一个Excel.Range
对象。
rangeReference.Cells(1,1)
是编写rangeReference.Cells.Item(1,1)
的快捷方式。 Item
是Range
对象的默认属性。不幸的是,Item
在Excel中定义为Variant
类型,.Net使用Variant
类型表示System.Object
类型。为了使Intellisense将Item
识别为Range
,需要将其强制转换为Range
类型。
示例:
Dim rng As Excel.Range = Sheet1.Range("A1:B4")
Dim rngCells As Excel.Range = rng.Cells
Dim specificCell As Object
specificCell = rngCells(1, 1)
' or
specificCell = rngCells.Item(1, 1)
Dim specificCellRange As Excel.Range = CType(specificCell, Excel.Range)
但是,如果您手动输入.Value2,它将没有问题。
这意味着您正在使用Option Strict Off
来允许后期绑定;该属性是在运行时发现的。后期绑定确实会导致性能下降,因为必须先发现Value2
,然后才能对其进行检索。这是通过编译器插入以支持属性检索的额外代码完成的。