凯文的工作簿包含36个工作表。他需要一种方法,在每个工作表中都有工作表名称(在工作表的选项卡中)

在该工作表的单元格中。他创建了一个用户定义的函数,该函数返回工作表名称,但在所有36个工作表上都返回相同的名称-执行用户定义的函数时将显示任何工作表的名称。他想知道是否可以使用用户定义函数(UDF)形式的宏,该宏将始终返回使用该函数的工作表的名称。换句话说,在他的36个工作表工作簿中,它应该返回36个不同的结果,具体取决于使用它的工作表。

简短的答案是肯定的,有办法。实际上,有两种方法。而且,很有趣的是,如果您不想使用宏或函数。例如,下面是一个常规工作表公式,该公式将在工作表的任何单元格中起作用:

=MID(CELL("filename",A1),FIND("]",CELL("filename",A1))+1,255)

此公式中的CELL函数的实例返回工作表的全名,包括文件名和文件路径。使用FIND函数会导致除去工作表名称以外的所有内容。

请注意,在CELL函数的每个实例中均使用单元格引用(A1)。这将强制CELL函数返回包含单元格引用的工作表的名称;没有它,您将为该公式的每个实例获得相同的结果(第一个工作表)。

您还应该知道,如果在新工作簿中使用该公式(尚未保存的公式),该公式将不会返回有效结果。您需要保存工作簿,以便它实际上具有可以由CELL函数成功返回的名称。如果工作簿或工作表名称包含右括号字符(“]”),它也将无法正常工作。在这种情况下,您将需要使用本技巧中讨论的其他解决方案之一。

如果您更喜欢使用用户定义的函数,则可以尝试一些简单的操作,例如此函数:

Function TabName1() As String     Application.Volatile     TabName1 = ActiveSheet.Name End Function

但是,此函数不能提供理想的结果,因为它总是返回活动工作表的名称。这意味着,如果在工作簿的每个工作表上都调用了该函数,它将始终返回每个工作表上的活动工作表的名称,而不是使用该函数的工作表的名称。以下功能可提供更好的结果:

Function TabName2() As String     Application.Volatile     TabName2 = Application.Caller.Parent.Name End Function

如果您认为要使用该功能来引用工作簿中其他地方的工作表名称,则此功能将更适合您:

Function TabName3(cell As Range)

TabName3 = cell.Worksheet.Name End Function

此版本的函数要求您为要使用其名称的工作表上的单元格提供单元格引用(任何单元格引用)。

当然,如果您不想使用用户定义的函数,则可以简单地创建一个宏,该宏会将每个工作表选项卡的名称填充到每个工作表的同一单元格中。例如,下面的宏逐步浏览工作簿中的每个工作表,并将每个工作表的名称放入单元格A1中。

Sub TabName4()

For J = 1 To ActiveWorkbook.Sheets.Count         Sheets(J).Cells(1, 1).Value = Sheets(J).Name     Next End Sub

您应该注意,这种方法不是动态的(每次更改工作表名称或添加新工作表时都需要重新运行)。它还会覆盖单元格A1中的所有内容。 (如果要将工作表名称放在每个工作表的不同单元格中,请更改“单元格”集合中使用的值。)

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3793)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: