8

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

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

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

我想做的事是不可能的吗?

更新

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

4

4 回答 4

4

好的,所以在正确阅读问题后,我会再试一次......

所以,要说明问题:

您想要一个用插件编写的例程,当从另一个工作簿中的 vba 调用时,可以计算出(除其他外)哪个工作簿包含发出调用的 vba,而无需显式传递此信息。

如前所述,这是不可能的(这与从代码访问调用堆栈类似的问题:据我所知这是不可能的)

但是你几乎可以像这样得到你想要的

像这样声明你的日志函数:

Sub MyLogger(wb as Workbook, LogText as String)
    Dim CallerName as String
    CallerName = wb.name
    ' your code...
End Sub

然后无论您调用 sub 使用

MyLogger ThisWorkbook, "Log Text"

不如什么都不通过,但至少它总是一样的

于 2011-02-07T07:05:52.303 回答
2

要获取调用工作簿的名称,请使用

Application.Caller.Worksheet.Parent.Name

Application.Caller 返回有关如何调用 Visual Basic 的信息。如果从在单个单元格中输入的自定义函数调用,则返回指定该单元格的 Range 对象

获得对单元格的引用后,.Worksheet.Parent.Name 为您提供工作簿的名称

请注意,Application.Caller 将根据您的函数的调用方式返回其他内容(有关详细信息,请参阅 VBA 帮助)

于 2011-02-06T06:58:45.513 回答
0

在 Excel 工作表数组输入函数调用调用的加载项函数中,我发现“Application.Caller.Parent.name”给出了工作表名称(选项卡名称,而不是工作表编号)。

于 2016-04-24T21:14:20.127 回答
0

我在编写自定义函数时遇到了同样的问题。函数运行良好,但只要计算或激活另一个工作簿,所有使用该函数的单元格都会恢复为#value。使用此公式处理多个文件时可能会非常令人沮丧。

要获得我使用的工作簿:

Dim CallingWb As Workbook
Set CallingWb = Application.Caller.Parent.Parent

如果您的函数在单元格中,这应该可以工作。

原始帖子为时已晚,但可能对其他人有所帮助!

于 2017-07-21T12:54:30.003 回答