0

我想写一个简单的函数来告诉我列的长度,给出列的第一条记录。因此,我写了类似...

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”表的一部分,但是滚动是在活动表上完成的。firstCell除了在每次调用中激活之外,有没有什么方法可以让这不管活动工作表都给出正确的结果?

4

1 回答 1

2

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

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

但是请注意,如果您的范围包含空白单元格,则此查找最后一行的方法将失败。这个问题已经解决了无数次;只需搜索此站点,但请注意并非所有建议的解决方案都同样有效!

于 2012-10-26T07:13:51.610 回答