可以判断哪个工作簿在Excel加载项(xla)中称为函数
-
29-10-2019 - |
题
我想在Excel加载项中编写一个小记录函数,因为我将从许多不同的工作簿中调用。我希望能够通过仅传递日志文本来调用它,并且日志函数本身可以处理时间戳, workbookname 等。 但是,我不能使用本网站或ActiveWorkbook来确定哪位工作簿负责拨打电话,因为Timworkbook将返回对加载项的引用,而在工作簿以外的工作簿中运行的VBA代码在Excel中可以拨打电话,但是ActiveWorkbook将返回一个侧重于窗口的那个。
application.caller看起来像一个可能的解决方案,但这似乎只有在从单元格中调用函数时,而不是从VBA。
是我想要做什么不可能的?
更新
根据> 1人,这实际上是不可能的。如果有人碰巧知道一些聪明的解决方法,请发表讲话。
解决方案
好的,因此,正确阅读问题后,我会重试...
因此,要说明问题:
您想要一个用外接程序编写的例程,当从另一个工作簿中的vba调用时,可以(其中包括)哪个工作簿包含进行了调用的vba,而不必显式传递此信息。
如上所述,这是不可能的(这与从代码访问调用堆栈是一个类似的问题:据我所知这是不可能的)
但是,您几乎可以得到想要的东西
像这样声明您的日志功能: 通用标签
那么无论您在哪里使用次级使用, 通用标签
不如不传递任何东西,但至少它总是一样的
其他提示
要获取调用工作簿的名称,请使用 通用标签
Application.Caller返回有关如何调用Visual Basic的信息。如果是通过在单个单元格中输入的自定义函数调用的,则返回一个用于指定该单元格的Range对象
已经引用了该单元格,.Worksheet.Parent.Name为您提供了工作簿的名称
请注意,Application.Caller将根据函数的调用方式返回其他内容(有关详细信息,请参见VBA帮助)
在由Excel工作表数组输入的函数调用调用的外接函数中,我发现“ Application.Caller.Parent.name”给出了工作表名称(表名,而不是工作表编号)。
编码自定义函数时,我遇到了同样的问题。该函数运行良好,但是无论何时计算或激活另一个工作簿,使用该函数的所有单元格都将恢复为#value。使用此公式处理多个文件时,可能会非常沮丧。
要获取我使用的工作簿: 通用标签
如果您的函数位于单元格中,这应该可以工作。
对于原始帖子为时已晚,但可能会对其他人有所帮助!