可以告诉Excel加载项中哪个工作簿称为函数(xla)

时间:2011-02-04 17:41:24

标签: excel-vba excel-addins xla vba excel

我想在excel加载项中编写一个小日志功能,我将从许多不同的工作簿中调用它。我希望能够通过仅传递日志文本来调用它,并且日志函数本身可以处理时间戳,工作簿名称等。

但是,我不能使用ThisWorkbook或ActiveWorkbook来确定哪个工作簿负责进行调用,因为Thisworkbook将返回对加载项本身的引用,而VBA代码在工作簿中运行而不是具有活动焦点的工作簿在Excel中可以进行调用,但ActiveWorkbook将返回窗口中具有焦点的那个。

Application.Caller看起来像是一个可能的解决方案,但这似乎仅在从单元格调用函数时才起作用,而不是从VBA调用。

我想做的不可能吗?

更新

根据> 1个人,这实际上是不可能的。如果有人碰巧知道一些聪明的解决方法,请说出来。

4 个答案:

答案 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

如果您的功能在单元格中,这应该有效。

原帖太迟了,但可能会帮助别人!