Renier的工作簿中包含十个工作表,命名为Resources 1到Resources10。如果他删除其中一个工作表(例如Resources 3),Renier希望自动重命名其余工作表以“缩小差距”。 ,“ 可以这么说。因此,资源4到资源10将自动重命名为资源3到资源9。

您可以通过多种方式使用宏来完成此任务。一种方法可能不及Renier所希望的自动化,但效果很好:

Sub ReNameSheets()

Dim J As Integer     Dim wks As Worksheet

J = 0     For Each wks In ActiveWorkbook.Worksheets         J = J + 1         wks.Name = "TempSheet " & J     Next wks

J = 0     For Each wks In ActiveWorkbook.Worksheets         J = J + 1         wks.Name = "Resources " & J     Next wks End Sub

该宏简单地浏览了所有工作表,并使用Renier首选的约定对它们进行重命名。可以在需要重命名工作表的任何时候按需运行该宏。

请注意,该代码实际上在工作表中进行了两次命名。第一个是将工作表的名称设置为临时名称,第二个是将它们设置为最终名称。将工作表添加到工作簿时,两次通过有助于避免潜在的问题-例如,如果在资源4之前添加新工作表,则一次通过重命名将尝试将新工作表重命名为资源4,这将生成出现错误,因为此时工作表5也将被命名为资源4。通过两次遍历,您将所有内容重命名为全新内容,然后进行最终名称设置。

对于更自动的方法,您可能需要考虑对Workbook对象使用SheetBeforeDelete事件。删除工作表之前,将立即触发该事件(顾名思义)。这是事件处理程序方法的示例:

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)

Dim sPrefix As String     Dim iNum1 As Integer     Dim iNum2 As Integer     Dim wks As Worksheet

sPrefix = "Resources "

If Left(Sh.Name, Len(sPrefix)) = sPrefix Then         iNum1 = CInt(Right(Sh.Name, Len(Sh.Name) - Len(sPrefix)))

Sh.Name = "TempSheet 9999"

For Each wks In Sheets             If Left(wks.Name, Len(sPrefix)) = sPrefix Then                 iNum2 = CInt(Right(wks.Name, Len(wks.Name) - Len(Prefix)))

If iNum2 > iNum1 Then                     wks.Name = sPrefix & (iNum2 - 1)

End If             End If         Next     End If End Sub

事件处理程序检查是否要删除的工作表以指定的前缀(“资源”)开头。如果是这样,则它将要删除的工作表重命名为临时名称(“ TempSheet 9999”)。

然后,它逐步浏览工作簿中的每个工作表,并重命名任何具有正确前缀和后缀号比要删除的工作表更高的工作表。

这种方法有两个大警告。首先,如果添加工作表,它将无法处理。其次,它将仅可靠地处理单个工作表的删除。如果您一次删除多个工作表,则编号将不正确,并且实际上,由于Excel处理删除的方式,宏可能会崩溃。

如果您预计会经常删除多个工作表,则可以使用其他方法来回避此问题。这依赖于工作簿对象的SheetActivate和SheetDeactivate事件的使用。

' These variables are declared OUTSIDE of the events, ' so they are available globally.



Dim shName As String     Dim Avail As Variant

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

' When the worksheet is deactivated, the name of     ' that worksheet is stored in the shName variable.



shName = Sh.Name End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Dim wks As Worksheet     Dim J As Integer

On Error Resume Next     ' The following line will generate an error if the     ' the worksheet shName was deleted. If the error     ' occurrs, then we can trigger the renaming.

Avail = Sheets(shName).Range("A1")

If Err Then         J = 0         For Each wks In ActiveWorkbook.Worksheets             J = J + 1             wks.Name = "Resources " & J         Next wks     End If     On Error GoTo 0 End Sub

这些事件处理程序之所以起作用,是因为无论何时离开一个工作表(例如,当您激活另一个工作表时)或删除一个工作表时,都会自动触发SheetDeactivate事件。然后触发SheetActivate事件,并从本质上检查是否可以访问以前停用的工作表。如果无法达到,则我们知道它已被删除,我们可以触发所有工作表的重命名。

重命名所使用的方法完全取决于您要如何使用工作表。

注意:

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

链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。

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

本提示(13572)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。