我想在excel加载项中编写一个小日志功能,我将从许多不同的工作簿中调用它。我希望能够通过仅传递日志文本来调用它,并且日志函数本身可以处理时间戳,工作簿名称等。
但是,我不能使用ThisWorkbook或ActiveWorkbook来确定哪个工作簿负责进行调用,因为Thisworkbook将返回对加载项本身的引用,而VBA代码在工作簿中运行而不是具有活动焦点的工作簿在Excel中可以进行调用,但ActiveWorkbook将返回窗口中具有焦点的那个。
Application.Caller看起来像是一个可能的解决方案,但这似乎仅在从单元格调用函数时才起作用,而不是从VBA调用。
我想做的不可能吗?
根据> 1个人,这实际上是不可能的。如果有人碰巧知道一些聪明的解决方法,请说出来。
答案 0 :(得分:4)
好的,所以在正确阅读问题之后我会再试一次......
所以,说明问题:
你想要一个用插件编写的例程,当从另一个工作簿中的vba调用时,可以解决(除其他事项外)哪个工作簿包含进行调用的vba,而不必明确地传递这些信息。
如上所述,这是不可能的(这是从代码访问调用堆栈的类似问题:据我所知不可能的事情)
然而,你几乎可以得到你想要的东西
声明你的日志函数:
Sub MyLogger(wb as Workbook, LogText as String)
Dim CallerName as String
CallerName = wb.name
' your code...
End Sub
然后,无论你在哪里调用子使用
MyLogger ThisWorkbook, "Log Text"
不如传递任何东西,但至少它总是相同的
答案 1 :(得分:2)
要获取呼叫工作簿的名称,请使用
Application.Caller.Worksheet.Parent.Name
Application.Caller返回有关如何调用Visual Basic的信息。如果从在单个单元格中输入的自定义函数调用,则指定返回单元格的Range对象
获得对单元格的引用后,.Worksheet.Parent.Name为您提供工作簿的名称
请注意,Application.Caller将根据您的函数调用方式返回其他内容(有关详细信息,请参阅VBA帮助)
答案 2 :(得分:0)
在Excel工作表数组输入函数调用调用的加载项函数中,我发现“Application.Caller.Parent.name”给出了工作表名称(选项卡名称,而不是工作表编号)。
答案 3 :(得分:0)
编码自定义函数时遇到了同样的问题。函数运行良好,但无论何时计算或激活另一个工作簿,使用该函数的所有单元格都将恢复为#value。使用此公式处理多个文件时可能非常令人沮丧。
获取我使用的工作簿:
git checkout dontDeleteMe.txt
如果您的功能在单元格中,这应该有效。
原帖太迟了,但可能会帮助别人!