劳伦斯需要一种方法来确定工作表的编号,即使该工作表已被重命名。例如,如果一个工作表命名为Sheet11,就很容易弄清楚它是工作表11。如果他将工作表重命名为January,Lawrence仍然需要一种方法来知道它是工作表11。

最好使用用户定义的函数(宏)来解决此问题。实际上,宏可以为每个工作表返回两个数字。第一个是工作表的索引号。此数字表示工作表集合中工作表的工作表对象的索引。可以通过类似于以下内容的宏返回该值:

Function SheetNumber1(shtname As String)

Dim sht As Worksheet

Application.Volatile     For Each sht In ThisWorkbook.Worksheets          If LCase(sht.Name) = LCase(shtname) Then               SheetNumber1 = sht.Index               Exit Function          End If     Next     SheetNumber1 = -1 End Function

在工作表中使用此函数时,它将返回名称已传递给该函数的任何工作表的索引号。如果工作表集合中不存在传递给函数的名称,则函数将返回值-1。例如,在单元格中使用的以下内容将返回集合中名为“ January”的工作表的索引值:

=SheetNumber("January")

这种方法的问题在于Worksheets集合中Worksheet对象的顺序会随着时间而变化。因此,您不能总是假定集合中的第11张工作表是最初为Sheet11的工作表。

确定工作表原始名称(无论如何重命名)的更一致的方法是使用Visual Basic称为工作表的“ CodeName”。这是工作表的属性,可以通过以下方式确定:

Function SheetNumber2(shtname As String)

Dim sht As Worksheet     Dim sTemp As String

Application.Volatile     For Each sht In ThisWorkbook.Worksheets          If LCase(sht.Name) = LCase(shtname) Then               sTemp = sht.CodeName               SheetNumber2 = Val(Mid(sTemp, 6, 4))

Exit Function          End If     Next     SheetNumber2 = -1 End Function

CodeName属性在宏中为只读。它是在创建工作表时分配的,但是可以在Visual Basic编辑器中手动更改它。 CodeName始终是一个字符串,表示应用于工作表的第一个名字,因此它将类似于“ Sheet11”。一旦设置了CodeName,即使将工作表重命名(例如重命名为“ January”),它也将保持稳定(“ Sheet11”)。

在宏示例(SheetNumber2)中,将CodeName属性分配给sTemp变量。在大多数情况下,该名称类似于“ Sheet3”或“ Sheet11”。因此,宏然后获取以第六个字符开头(紧随“ Sheet”之后)的数值。这是函数返回的值。

注意:

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

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

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