2

想象一下,我有一个包含 3 个选项卡、SheetA、SheetB 和 SheetC 的 xls 工作簿。我想编写一个简单的 VBA 函数,它返回调用该函数的工作表的名称。

Function SheetName as String
    SheetName = ???
End Function

因此,如果我在 Tab SheetB 中调用 =SheetName(),它将始终返回 SheetB。

笔记:

 ActiveSheet.Name

不起作用,因为如果您在 SheetA 上并计算工作簿,它将返回 SheetA。

4

2 回答 2

3

这有效:

Function SheetName as String
    SheetName = Application.Caller.Worksheet.Name
End Function

我应该提到,作为一个实际问题,你应该非常谨慎地在任何函数中使用这样的调用者敏感特性。稍后,当您(或更糟的是,其他人)尝试调试某些东西时,如果您没有意识到从代码或在调试器/立即窗口中调用该函数时的行为与实际不同,那将是一场真正的噩梦在实际使用中。

于 2013-07-09T14:50:03.520 回答
2

你可以这样做:

Function sheetName(rng As Range) As String
    sheetName = rng.Parent.Name
End Function

只需传递工作表调用的范围(甚至与公式所在的范围相同)。

在工作表 1 中,

=sheetName(A1)

返回 Sheet1

在 Sheet2 中

=sheetName(Sheet1!A1)

也返回 Sheet1。

于 2013-07-09T14:39:42.913 回答