MS Excel:获取列的最后一个单元格的内容并使其自动更新

MS Excel:获取列的最后一个单元格的内容并使其自动更新,excel,vba,cell,formula,Excel,Vba,Cell,Formula,以下是我的用例: 在ws“Z”中,我希望给定的单元格检索ws“a”中最后一个(非空)单元格的内容,用于列“C” 我还希望,当我在ws“a”(例如列“C”)中添加新行时,ws“Z”中的单元格会自动更新 更具体地说,ws“A”包含一个历史表,其修订号位于列“C”中,当添加一个新条目时,我希望ws“Z”中的单元格自动反映这个新值 我正在考虑使用VBA编写的公式。所以在某处,我发现了一些东西(最初是宏),我把它转换成了一个函数: Function GetLastRow(strSheet, strCo

以下是我的用例:

  • 在ws“Z”中,我希望给定的单元格检索ws“a”中最后一个(非空)单元格的内容,用于列“C”
  • 我还希望,当我在ws“a”(例如列“C”)中添加新行时,ws“Z”中的单元格会自动更新
更具体地说,ws“A”包含一个历史表,其修订号位于列“C”中,当添加一个新条目时,我希望ws“Z”中的单元格自动反映这个新值

我正在考虑使用VBA编写的公式。所以在某处,我发现了一些东西(最初是宏),我把它转换成了一个函数:

Function GetLastRow(strSheet, strColum) As String

Dim MyRange As Range

Set MyRange = Worksheets(strSheet).Range(strColum & "1")

GetLastRow = Cells(65536, MyRange.Column).End(xlUp).Value

End Sub
Function GetLastRow(strSheet, strColum) As String

Dim MyRange As Range

GetLastRow = Worksheets(strSheet).Range(strColum & "1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp)

End Function
使用Excel 2003,在ws“Z”中,我有一个具有以下公式的单元格:

=GetLastRow("A", "C")
但我有两个问题。虽然它成功地获取了列“C”的最后一个单元格的内容:

  • 该公式不获取ws“A”中的公式,而是获取当前ws中的公式(即“Z”)
  • 每当我在ws“a”中添加一个新条目时,ws“Z”中的单元格根本不会得到更新(即使在强制重新计算时也是如此)
我唯一可以更新单元格的方法是在单元格上键入Enter!8v|

此外,我还尝试直接在公式中对工作表名称进行编码,但它仍然获取当前ws中的最后一个单元格。。。8v(

我做错什么了吗? 或者我应该换一种方式


如果您能帮助我使用这个用例,我将不胜感激。谢谢。

正如L42之前指出的,问题是
单元格(65536,MyRange.Column)。End(xlUp)。Value
您在单元格65536处引用它,在“MyRange”中引用“C列”

这是函数的工作版本:

Function GetLastRow(strSheet, strColum) As String

Dim MyRange As Range

Set MyRange = Worksheets(strSheet).Range(strColum & "1")

GetLastRow = Cells(65536, MyRange.Column).End(xlUp).Value

End Sub
Function GetLastRow(strSheet, strColum) As String

Dim MyRange As Range

GetLastRow = Worksheets(strSheet).Range(strColum & "1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp)

End Function

但是说实话,我更喜欢使用这个公式
索引(A!$C:$C,COUNT(A!$C:$C))
只需要稍微调整一下范围。使用宏有点过分,除非你的C列中有空行,否则我觉得没有必要使用宏。

正如L42之前指出的,问题是
单元格(65536,MyRange.Column)。结束(xlUp).Value
您在单元格65536处引用它,并从“MyRange”中引用“C列”

这是函数的工作版本:

Function GetLastRow(strSheet, strColum) As String

Dim MyRange As Range

Set MyRange = Worksheets(strSheet).Range(strColum & "1")

GetLastRow = Cells(65536, MyRange.Column).End(xlUp).Value

End Sub
Function GetLastRow(strSheet, strColum) As String

Dim MyRange As Range

GetLastRow = Worksheets(strSheet).Range(strColum & "1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp)

End Function

但老实说,我更喜欢使用这个公式
索引(A!$C:$C,COUNT(A!$C:$C))
只需要稍微调整一下范围。使用宏有点过分,除非你的C列中有空行,否则我觉得没有必要使用宏。

米兰已经回答了这个问题,但让我用单元格显式地重新编写你的函数


.HTH

Milanor已经回答了这个问题,但是让我使用单元格显式地重新编写您的函数


.HTH

我发现了如何自动更新函数(用例的第二部分):我必须添加

Application.Volatile
在函数体中。下面是我现在使用的版本:

Function GetLastRowValue(strSheet, strColum) As String

   Application.Volatile

   Dim MyRange As Range

   GetLastRowValue = Worksheets(strSheet).Range(strColum & "1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp)

End Function

感谢所有这些帮助。

我发现了如何自动更新函数(用例的第二部分):我必须添加

Application.Volatile
在函数体中。下面是我现在使用的版本:

Function GetLastRowValue(strSheet, strColum) As String

   Application.Volatile

   Dim MyRange As Range

   GetLastRowValue = Worksheets(strSheet).Range(strColum & "1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp)

End Function

多亏了这些帮助。

我一直在寻找类似的东西,这对我很有用:

  • 构建用于获取列中具有值的最后一行的函数:
  • 在工作表“Z”中输入例程,以便在每次激活工作表时更新该函数:
  • 输入活页Z=LastRow(“A”、“C:C”)的公式y单元格

  • 我一直在寻找类似的东西,这对我很有用:

  • 构建用于获取列中具有值的最后一行的函数:
  • 在工作表“Z”中输入例程,以便在每次激活工作表时更新该函数:
  • 输入活页Z=LastRow(“A”、“C:C”)的公式y单元格

  • 首先,我想你不需要宏来做这件事?你试过了吗?至于
    我做错什么了吗?
    ,你可能需要正确地引用你的对象并显式地处理它。在你当前的代码中,你实际上得到了当前所选工作表的最后一行,因为你没有显式地使用
    单元格。谢谢,我要查找偏移量。但同时,我可以看到我在最后一行使用单元格。此外,它的参数是MyRange,这个参数来自传入参数的指定ws-name。因此我不确定是否理解您为什么说我没有显式使用单元格?如果您能告诉我如何更显式地使用单元格,我将不胜感激ly?(我不熟悉Excel模型)
    MyRange.Column
    因为你只是告诉它从MyRange中获取列,这就是为什么它一直从你当前的工作表中获取值。哦,我明白了。我开始明白了。首先,我想你不需要宏来做这件事?你试过了吗?至于
    我做错什么了吗?
    ,你可能需要引用你的对象正确且明确地处理它。在您当前的代码中,您实际上得到的是当前所选工作表的最后一行,因为您没有明确地使用
    单元格
    。谢谢,我将查找偏移量。但同时,我可以看到我在最后一行使用单元格。此外,它的参数是MyRange,这一个来自s参数中传递了指定的ws-name。因此,我不确定您为什么说我没有显式使用单元格?如果您能告诉我如何更显式地使用单元格,我将不胜感激?(我不熟悉Excel模型)
    MyRange.Column
    因为你只是告诉它从MyRange中获取列,这就是为什么它一直从当前工作表中获取值。哦,我明白了。开始理解了。谢谢。我要试试。你的公式会返回行号(用例需要其中的值!).我猜是函数名引起了混乱。但是对于上述答案,如果我在ws“a”中添加新行,单元格不会自动更新。(请参阅用例第二点)谢谢。我将尝试一下。您的公式返回行号(用例需要值