【问题标题】:Possible to tell which workbook called a function in an Excel Add-In (xla)可以判断哪个工作簿调用了 Excel 加载项 (xla) 中的函数
【发布时间】:2011-02-04 17:41:23
【问题描述】:

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

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

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

我想做的事不可能吗?

更新

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

【问题讨论】:

  • 我有 95% 的把握完全按照你的意愿去做是不可能的,所以我会让某人 100% 肯定地给我们一个正式的答案。您可能已经使您的日志例程看起来像 log(callingWbk As Workbook, text As String),并使用 ThisWorkbook 作为参数从每个位置调用它。不过,您可以在每个调用您的插件记录器的工作簿中设置一个本地日志例程,这样您的实际日志调用就可以保持简单。

标签: excel excel-addins xla vba


【解决方案1】:

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

所以,陈述问题:

您希望在插件中编写一个例程,当从另一个工作簿中的 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"

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

【讨论】:

    【解决方案2】:

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

    Application.Caller.Worksheet.Parent.Name
    

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

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

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

    【讨论】:

    • 这一切都是真的,但我认为@tbone 正在寻找某种方法来在调用不是来自范围时获取该信息。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      获取我使用的工作簿:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多