活动工作表名称按顺序更改

时间:2018-03-09 09:00:53

标签: excel excel-vba rename spreadsheet vba

我有一个工作簿,里面有两个名为“WT-1”和“CL-1”的电子表格(可能更多的是带有差异名称)。
当ie“WT-1”处于活动状态时,我希望能够(通过使用分配了宏的按钮)复制此当前(活动)电子表格并按顺序重命名,如WT-2,WT-3,WT -4等。

我认为更改只需要应用于名称中包含“WT-”的电子表格,因为名称更改应仅发送到新工作表。不应触及所有其他现有工作表。这是 - 请帮助:)它改变了一个新电子表格的名称。如果我的工作簿中只有1个工作表,则它不起作用。

Sub changeWSname()

Dim ws As Worksheet
Dim shtName As Variant
Dim Rng As Range
Dim i As Long

With Sheets("wslist")
        Set Rng = .Range("A1", .Range("A" & .Rows.Count).End(xlUp).Address)
        shtName = Application.Transpose(Rng)
        i = LBound(shtName)
End With

For Each ws In ActiveWorkbook.Worksheets
If Left(Trim(ws.Name), 3) = "WT-" Then
        ws.Name = shtName(i)
        i = i + 1
      End If
Next ws
End Sub

宏假设只是为了更改新复制的电子表格的名称。因此,如果我复制WT-2并创建名为WT-2(2)的新工作表并运行宏 - 它将工作并将新工作表名称更改为WT-1(在'wslist'范围内的名字)。这似乎没问题。但是,如果我的工作簿中有任何其他电子表格(活动工作表和已经复制的新工作表除外)它不起作用并给我一个错误1004 - “无法将工作表重命名为与另一个工作表相同的名称,引用的对象库或Visual Basic引用的工作簿“ 当我点击de-bag时,我发现这个突出显示:ws.Name = shtName(i)

1 个答案:

答案 0 :(得分:3)

问题是如果您遇到以下表格的情况

  • WT-1
  • WT-1 (2)
  • WT-2

您的代码尝试将WT-1 (2)重命名为WT-2但已存在。

所以有可能你需要先将这些重命名为其他东西,比如

  • WT-1
  • #WT-2
  • #WT-3

然后在另一个循环中移除#

这样可以防止重命名为已存在的名称。

Option Explicit

Public Sub changeWSname()
    Dim ws As Worksheet
    Dim shtName As Variant
    Dim Rng As Range
    Dim i As Long

    With Sheets("wslist")
        Set Rng = .Range("A1", .Range("A" & .Rows.Count).End(xlUp).Address)
        shtName = Application.Transpose(Rng)
        i = LBound(shtName)
    End With
    For Each ws In ActiveWorkbook.Worksheets
        If Left$(Trim(ws.Name), 3) = "WT-" Then
            'test if we run out of sheet names
            If i > UBound(shtName) Then
                MsgBox "Running out of sheet names … aborting"
                Exit Sub
            End If

            ws.Name = "#" & shtName(i) 'add a # to all new sheet names
            i = i + 1
        End If
    Next ws

    'remove the # from the sheet nam
    For Each ws In ActiveWorkbook.Worksheets
        If Left$(Trim(ws.Name), 1) = "#" Then
            ws.Name = Right$(ws.Name, Len(ws.Name) - 1)
        End If
    Next ws
End Sub

正如QHarr指出的那样,测试你是否用完了工作表名称可能是一个好主意。