VBA Excel工作表复制顺序错误

VBA Excel工作表复制顺序错误,excel,vba,Excel,Vba,早上好 我正在使用以下代码: Sub CABsheet() Dim i As Long Dim xNumber As Long Dim xName As String Dim ws As Worksheet Application.ScreenUpdating = False Set ws = Sheets("CAB1") xNumber = Sheets("NIM & BADGER").Range("R27").Value For i = 1 To Numbe

早上好

我正在使用以下代码:

 Sub CABsheet()

 Dim i As Long
 Dim xNumber As Long
 Dim xName As String
 Dim ws As Worksheet

 Application.ScreenUpdating = False

 Set ws = Sheets("CAB1")
 xNumber = Sheets("NIM & BADGER").Range("R27").Value

 For i = 1 To Number
 ws.Copy After:=ActiveWorkbook.Sheets(ws.Index + i - 1)
 ActiveSheet.Name = "CAB" & i + 1
 Next

 ws.Activate

 Application.ScreenUpdating = True

 End Sub
但是我得到了一个错误,这个名字下的工作表已经存在了

当我使用像这样稍加修改的代码时:

 Sub CABsheet()

 Dim i As Long
 Dim xNumber As Long
 Dim xName As String
 Dim ws As Worksheet

 Application.ScreenUpdating = False

 Set ws = Sheets("CAB1")
 xNumber = Sheets("NIM & BADGER").Range("R27").Value

 For i = 2 To Number
 ws.Copy After:=ActiveWorkbook.Sheets(ws.Index + (i - 2))
 ActiveSheet.Name = "CAB" & (i + 1) + 2
 Next

 ws.Activate

 Application.ScreenUpdating = True

 End Sub
然后一个错误消失了,一切似乎都很好,但是

。。。我从5号驾驶室开始计算,而不是2号驾驶室

如果我再修改一点代码

 For i = 2 To xNumber
 ws.Copy After:=ActiveWorkbook.Sheets(ws.Index + (i - 1))
 ActiveSheet.Name = "CAB" & i + 2
 Next

那么顺序是错误的

标签从CAB4开始

从2号出租车开始我需要它们。 我无法删除+2,因为调试器向我显示一个错误,即该名称已被使用


我可以在这段代码中修复什么?

在您的第一个代码示例中

Dim xNumber As Long
您为它设置了一个值

xNumber = Sheets("NIM & BADGER").Range("R27").Value
然后在循环中使用变量
Number
而不是
xNumber

For i = 2 To Number
变量
Number
未声明,也未使用值初始化,因此它是
0

所以这是行不通的。确保使用
选项Explicit
,以便在使用未声明的worng变量名时收到通知


我还建议不要使用
ActiveSheet

Option Explicit

Public Sub CABsheet()
    Application.ScreenUpdating = False

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("CAB1")

    Dim xNumber As Long
    xNumber = ThisWorkbook.Worksheets("NIM & BADGER").Range("R27").Value

    Dim i As Long
    For i = 1 To xNumber
       ws.Copy After:=ThisWorkbook.Sheets(ws.Index + i - 1)
       ThisWorkbook.Sheets(ws.Index + i).Name = "CAB" & i + 1
    Next

    ws.Activate

    Application.ScreenUpdating = True
End Sub
在运行代码之前:

运行代码后:


如果工作表已经存在,您还可以内置一个测试,并询问用户是否应该删除它:

Option Explicit

Public Sub CABsheet()
    Application.ScreenUpdating = False

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("CAB1")

    Dim xNumber As Long
    xNumber = 10

    Dim i As Long
    For i = 1 To xNumber
        ws.Copy After:=ThisWorkbook.Sheets(ws.Index + i - 1)
        If WorksheetExists("CAB" & i + 1) Then
            If MsgBox("Worksheet '" & "CAB" & i + 1 & "' already exists. Do you want to delete it?", vbExclamation + vbYesNo) = vbYes Then
                Application.DisplayAlerts = False
                ThisWorkbook.Sheets("CAB" & i + 1).Delete
                Application.DisplayAlerts = True
                ThisWorkbook.Sheets(ws.Index + i).Name = "CAB" & i + 1
            End If
        Else
            ThisWorkbook.Sheets(ws.Index + i).Name = "CAB" & i + 1
        End If
    Next

    ws.Activate

    Application.ScreenUpdating = True
End Sub

Public Function WorksheetExists(ByVal WorksheetName As String, Optional ByVal InWorkbook As Workbook) As Boolean
    If InWorkbook Is Nothing Then
        Set InWorkbook = ThisWorkbook
    End If

    On Error Resume Next
    Dim ws As Worksheet
    Set ws = InWorkbook.Worksheets(WorksheetName)
    On Error GoTo 0

    WorksheetExists = Not ws Is Nothing
End Function

这不能解决我的问题。我在重写这段代码时犯了一个错误。这在我原来的一本书中是正确的。我认为问题可能出在循环范围内的某个地方,因为代码会拾取第一页,而这不应该发生。@MariuszKrukar再次检查我编辑的代码。我测试了它,它按预期工作。是的,我做了,同样:(调试器:ThisWorkbook.Sheets(ws.Index+I)。Name=“CAB”&I+1当你可能有一些名为
CAB2
的隐藏表时,请检查它。我用一个全新的工作簿进行了测试,它肯定有效。@MariuszKrukar你可以内置一个测试,以获得更好的可用性。请检查我编辑的答案。