VBA:如何在工作簿/工作表中发生最后一个错误时通过VBA代码获取上次使用的单元格?

最后,我想将单元移动到发生最后一个错误的位置。 编辑:忘了说,我正在使用Excel 2003。

根据评论的要求…

在Excel VBA帮助中查找“应用程序”对象的“调用者”属性。 当你从VBA例程中使用它时,它会告诉你程序的调用来自哪里 – 范围,图表等等。

使用“Application.Caller”时要注意的一个重要的事情是它并不总是一个Range对象。 查看帮助,但该属性返回一个Variant值,该值可以是Range,String或Error。 (如果你感兴趣的话,这是一个Range对象,但是你需要知道这一点。)

由于上述原因,当涉及到对象与值时,VBA语法变幻莫测,使用“Application.Caller”可能会非常棘手。 放一条线,如:

Debug.Print Application.Caller.Address 

在调用者不是Range的情况下,代码将失败。 做的事情如:

 Dim v v = Application.Caller 

将会“编译”,但是当调用者一个Range时会创build循环引用,因为你正在尝试访问调用Range的值。

这一切都意味着最好为自己写一点实用function:

 Public Function currentCaller() As String If TypeOf Application.Caller Is Range Then Dim rng As Range Set rng = Application.Caller currentCaller = rng.Address(External:=True) Else currentCaller = CStr(Application.Caller) End If End Function 

然后从你的error handling程序中调用它,你想知道这个调用来自哪里。

还有一件事情 – 显然这只能告诉你调用者一旦VBA例程已经被调用。 如果您的调用公式中存在错误,则Excel将向您的单元格返回错误值,而无需调用您的VBA例程。

将VBA函数包装在另一个函数中,该函数将单元格位置和值存储为变体。 保持这个“包装”function尽可能的基本,所以它不会导致任何额外的错误。

如果您试图debugging应用程序崩溃错误,则包装函数甚至可以将这些值存储在以逗号分隔的文本文件中。 一旦存储,Excel可以崩溃所有它想要的,你会仍然知道什么单元格的位置和价值,因为你事先存储在Excel之外。

这可以通过一个error handling程序来完成吗?

下面是我的意思的一个例子:

 sub code1() on error goto cell A1 end sub