繁体   English   中英

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

[英]VBA: How to get the last used cell by VBA code when the last error occured in a Workbook/Worksheet?

最后,我想将单元格移动到发生最后一次错误的位置。 编辑:忘了说我正在使用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时创建循环引用,因为您试图访问调用Range的值。

这意味着最好为自己编写一个小实用函数:

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

然后从错误处理程序中调用它,您想知道调用的来源。

还有一件事 - 显然,只有在实际调用VBA例程后,这才能告诉您调用者。 如果调用公式中有错误,Excel将向您的单元格返回错误值,而不会调用您的VBA例程。

将VBA函数包装在另一个函数中,该函数将单元格位置和值存储为变体。 保持这个“包装”功能尽可能基本,这样就不会产生任何其他错误。

如果您正在尝试调试应用程序崩溃错误,则包装函数甚至可以将这些值存储在逗号分隔的文本文件中。 存储后,Excel可能会崩溃所需的全部内容,您仍然可以知道单元格位置和值是什么,因为您事先将它们存储在Excel之外。

这可以用错误处理程序完成吗?

我的意思如下:

sub code1()
on error goto cell A1
end sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM