MyRange.Cells(i,j)是否真正返回Excel.Range?

时间:2019-03-31 15:31:36

标签: excel vb.net vsto

首先,我强调我使用的是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

1 个答案:

答案 0 :(得分:2)

这不是Visual Studio的限制,而是System.Object类型的属性之一。

rangeReference.CellsRange类型的属性,它返回一个Excel.Range对象。

rangeReference.Cells(1,1)是编写rangeReference.Cells.Item(1,1)的快捷方式。 ItemRange对象的默认属性。不幸的是,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,然后才能对其进行检索。这是通过编译器插入以支持属性检索的额外代码完成的。