John想知道VBA中是否有一种方法可以识别用户更改的最后一个单元格。他不想知道该单元格是否由宏更改,而是由用户更改。

答案是肯定的。您可以使用Worksheet_Change事件来编写一个处理程序,该处理程序将记录工作表中任何特定单元格的更改时间。这样的宏可能非常简单,例如:

Private Sub Worksheet_Change(ByVal Target As Range)

Application.StatusBar = Target.Address End Sub

宏仅将最后更改的地址放入状态栏中。您可以通过以下方式修改宏,使其将地址保留在全局变量(在事件处理程序外部声明)中:

Dim sAddr As String

Private Sub Worksheet_Change(ByVal Target As Range)

sAddr = Target.Address(False, False)

End Sub

然后,您可以使用常规宏来检索存储在sAddr变量中的地址,然后对其进行任何处理。

至于确保事件处理程序不记录宏所做的任何更改,执行此操作的唯一方法是在执行将修改工作表的任何宏命令之前关闭事件处理。例如,可以在更改单元格A1内容的命令之前和之后使用以下EnableEvents属性更改:

Application.EnableEvents = False Range("A1") = "Hello"

Application.EnableEvents = True

关闭事件处理后,将不会触发Worksheet_Change事件处理程序,并且不会更新“上次更改”的地址。结果是您最终只能跟踪用户所做的那些更改,而不跟踪宏所做的更改。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3819)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: