我有一个工作簿,它有两个电子表格,名为"WT-1“和"CL-1”(可以用diff更多)。姓名)。
当."WT-1“是活动的,我希望能够(通过使用分配给它的宏的按钮)复制这个当前(活动)电子表格,并按顺序重命名它,如WT-2、WT-3、WT-4等等。
我猜更改只需要应用于包含"WT-“的电子表格,因为名称更改应该只针对新的表。不应触及所有其他现有的工作表。这里是- Pls help :)它更改了一个新电子表格的名称。如果我的工作簿中只有一个以上的工作表,它就不能工作。
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引用的另一个工作表、引用对象库或工作簿相同的名称”,当我单击“de”时,我发现了这一点: ws.Name = shtName(i)。
发布于 2018-03-09 10:19:53
问题是如果你有以下情况的话
WT-1WT-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所指出的,测试工作表名称是否用完可能是个好主意。
https://stackoverflow.com/questions/49190023
复制相似问题