【问题标题】:Active sheet name change in sequence活动工作表名称按顺序更改
【发布时间】:2018-08-17 19:18:45
【问题描述】:

我有一个工作簿,其中包含两个名为“WT-1”和“CL-1”的电子表格(其中可能有更多具有不同名称的电子表格)。
当即“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)

【问题讨论】:

  • 因为这不是免费的代码编写服务,请edit您的问题并添加您已经尝试过的代码。解释你的代码实际上做了什么,它应该做什么,你在哪里卡住了或者你在哪里出错了。
  • 嗨,很抱歉 - 我在这个(或任何)论坛上很新,这是我的第一个帖子。这是我尝试使用的宏:
  • 将 ws 作为 ActiveWorkbook.Worksheets 中每个 ws 的工作表如果 ws.Name Like "WT-*" Then Sheets("wslist").UsedRange.Copy ws.Range("A1").PasteSpecial Paste:=xlPasteAll End If Next ws Worksheets("addresses").Select End Sub
  • 我做到了 - 希望现在可以了吗?
  • 现在您只需要解释该代码有什么问题吗?你有任何错误吗?它做了什么而不是你所期望的? “它不起作用。”不是描述。您拥有哪些工作表名称的列表(在您运行宏之前,以及您在运行它之后的期望)会很好地看到差异。还有一张wslist的截图也不错。

标签: excel rename spreadsheet vba


【解决方案1】:

问题是您是否有以下表格的情况

  • 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 指出的那样,测试您是否用完工作表名称可能是个好主意。

【讨论】:

  • 另外,需要测试数组是否进入 i = UBound(shtName)
  • 现场...非常感谢!精彩的 !很抱歉给我带来了麻烦,因为我不太清楚如何使用这个网站:(
  • Peh,这绝对是一个很棒的解决方案,而且效果很好。 @QHarr 也谢谢你。你们是好人!
  • @Miles 第一次为大家服务。采取tour 并阅读How to Ask 可能会帮助您解决未来的问题。顺便提一句。我刚刚对我的答案进行了编辑,因此请确保您获得了最后的更改。你可以考虑marking it as solved
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多