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

时间:2012-10-26 07:10:53

标签: excel excel-vba range vba

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

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之外,有没有办法让这个结果得到正确的结果而不管活动表?

1 个答案:

答案 0 :(得分: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

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