1

我正在尝试创建一个宏,它将复制实际工作表并用字母表的下一个字母命名。第一个工作表“A”始终存在于工作簿中,其他工作表(B、C、D 等)将根据需要添加。我设法将以下可以创建工作表“B”的代码放在一起。问题是在复制工作表“B”时,我收到运行时错误“1004”,表明最后一行代码出错。

Sub newList()
' New_List Macro
Dim PrevLetter As String

PrevLetter = "ActiveSheet.Name"
ActiveSheet.Copy after:=ActiveSheet
ActiveSheet.Name = Chr(Asc(PrevLetter) + 1)

End Sub

你们中的任何人都可以帮忙吗?

4

3 回答 3

1

您应该像这样简单地编写代码:

Sub newList()
' New_List Macro
Dim PrevLetter As String

PrevLetter = ActiveSheet.Name             '<--- Change made to this line
ActiveSheet.Copy after:=ActiveSheet
ActiveSheet.Name = Chr(Asc(PrevLetter) + 1)

End Sub

编辑:这不是“最佳实践代码”的答案。这只是指出您自己的代码中返回错误的内容。这个问题的其他答案(到目前为止)确实是解决这个问题的更复杂和正确的方法。

于 2013-10-27T08:48:38.933 回答
1

正如 Soren 提到的,您的代码给出了错误。

但是,如果在创建“B”后工作表“A”处于活动状态,因为工作表“B”已经存在,您的代码将给出错误。

你可能想试试这个?为此,哪个工作表处于活动状态并不重要。此代码还可以让您创建超出Z. 所以之后的工作表Z将被命名为AAAB等等。

  • 使用此代码,在 XL2007+ 中,您最多可以创建工作表XFD(更多 16383 张)
  • 使用此代码,在 XL2003 中,您最多可以创建工作表IV(更多 255 张)

代码:

Sub newList()
    Dim PrevLetter As String
    Dim ws As Worksheet, wsNew As Worksheet
    Dim wsname As String

    Set ws = ThisWorkbook.Sheets("A")
    ws.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    Set wsNew = ActiveSheet
    wsname = GetNewName
    wsNew.Name = wsname
End Sub

Function GetNewName() As String
    Dim NewWs As Worksheet

    For i = 2 To ThisWorkbook.Sheets(1).Columns.Count
        ColName = Split(ThisWorkbook.Sheets(1).Cells(, i).Address, "$")(1)
        On Error Resume Next
        Set NewWs = ThisWorkbook.Sheets(ColName)

        If Err.Number <> 0 Then
            GetNewName = ColName
            Exit For
        End If
    Next i
End Function
于 2013-10-27T09:06:56.903 回答
0

这是您可以执行此操作的另一种方法:

Sub newList()
' New_List Macro
    Dim PrevLetter As String
    Dim wb As Workbook
    Dim ws1 As Worksheet

    Set wb = ActiveWorkbook
    Set ws1 = wb.ActiveSheet
    PrevLetter = ws1.Name
    ws1.Copy After:=ws1
    Sheets(Sheets.Count).Name = Chr(Asc(PrevLetter) + 1)

    Set wb = Nothing
    Set ws1 = Nothing

End Sub
于 2013-10-27T09:09:07.170 回答