特定工作表的范围地址(而不是活动工作表)

我想写一个简单的函数,告诉我列的长度,给列的第一个logging。 因此,我写了类似…

Public Function getColumnLen(firstCell As Range) As Long Dim lastRow As Long lastRow = Range(firstCell.Address).End(xlDown).Row getColumnLen = lastRow - firstCell.Row + 1 End Function 

现在我有两个工作表在我的项目中,“A”和“B”,我打电话给VBA

 Dim colLen as Long colLen = getColumnLen(Worksheets("A").Range("A1")) 

当我想知道从A1开始的数据的高度。 colLen的结果值取决于工作表“A”处于活动状态还是“B”处于活动状态。 问题是,在getColumnLen函数中, firstCell记得它是“A”表的一部分,但滚动是在活动工作表上完成的。 有没有什么办法可以使这个结果正确,而不pipe活跃的表格,除了在每个调用中激活firstCell

这是因为你给它一个不完全合格的单元地址:

 lastRow = Range(firstCell.Address).End(xlDown).Row 

在这里, firstCell.Address返回$A$1无论您在调用函数时指定了哪个工作表。

  • Worksheets("A").Range("A1").Address
  • Worksheets("B").Range("A1").Address
  • Worksheets("Whatever other sheet").Range("A1").Address

这些都返回$A$1

忘记Address属性。 如果你想知道它做什么,请阅读VBA帮助。 只要做到这一点:

 lastRow = firstCell.End(xlDown).Row 

但是,请注意,如果范围包含空白单元格,则查找最后一行的这种方法将失败。 这个问题已经被解决了数十亿次。 只是search这个网站,但请注意,并非所有build议的解决scheme同样有效!