如何在所有Excel工作表的末尾添加一个命名工作表?

77

我想在所有现有的工作表末尾添加一个名为"Temp"的Excel表格,但是这段代码无法正常工作:

Private Sub CreateSheet()
    Dim ws As Worksheet
    ws.Name = "Tempo"
    Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
End Sub

你能告诉我为什么吗?


2
因为在分配 .Name 之前您尚未创建 ws。不要混淆:在尝试访问其属性之前,先实例化变量。 - WGS
8个回答

169

试一下这个:

Private Sub CreateSheet()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets.Add(After:= _
             ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    ws.Name = "Tempo"
End Sub

或者使用With子句避免重复调用您的对象。

Private Sub CreateSheet()
    Dim ws As Worksheet
    With ThisWorkbook
        Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
        ws.Name = "Tempo"
    End With
End Sub

如果在代码的其余部分中不需要调用同一工作表上的单元格,上述内容可以进一步简化。

Sub CreateSheet()
    With ThisWorkbook
        .Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = "Temp"
    End With
End Sub

为什么出了问题?你没有在同一个工作簿中创建表格吗? - L42
11
ThisWorkbook是承载正在运行宏的工作簿。ActiveWorkbook是用户正在操作的工作簿(通俗易懂地说)。WorkBooks("somename")是对特定打开的工作簿的引用。 - Massimo Fuccillo
1
不错,但如果工作表已经存在会发生什么?它会抛出一个错误吗? - Ch32k0
1
@Ch32k0 是的。如果相同的名称已经存在或者您使用了无效的名称。 - L42
@L42 哦,我尝试过这个,它实际上确实有效,感谢您的反馈。 - Ch32k0

42
请使用这个简洁的短语:
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "new_sheet_name"

1
抱歉,但是被接受的答案看起来更好。这个答案没有明确指出ThisWorkbook或者ActiveWorkbook。此外,在这里新的工作表对象没有被分配给一个变量,而之后你几乎总是想要使用它来将数据放入工作表中。 - ZygD
1
我认为这个答案是最好的解决方案。代码中没有指定应将工作表分配给变量。显然,他知道它的名称,因为它在代码中被指定了。 - IronWilliamCash

7
ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = "XYZ"

当您添加一个工作表时,无论如何它都将成为活动工作表。


5

试试这个:

Public Enum iSide
iBefore
iAfter
End Enum
Private Function addSheet(ByRef inWB As Workbook, ByVal inBeforeOrAfter As iSide, ByRef inNamePrefix As String, ByVal inName As String) As Worksheet
    On Error GoTo the_dark

    Dim wsSheet As Worksheet
    Dim bFoundWS As Boolean
    bFoundWS = False
    If inNamePrefix <> "" Then
        Set wsSheet = findWS(inWB, inNamePrefix, bFoundWS)
    End If

    If inBeforeOrAfter = iAfter Then
        If wsSheet Is Nothing Or bFoundWS = False Then
            Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = inName
        Else
            Worksheets.Add(After:=wsSheet).Name = inName
        End If
    Else
        If wsSheet Is Nothing Or bFoundWS = False Then
            Worksheets.Add(Before:=Worksheets(1)).Name = inName
        Else
            Worksheets.Add(Before:=wsSheet).Name = inName
        End If
    End If

    Set addSheet = findWS(inWB, inName, bFoundWS)         ' just to confirm it exists and gets it handle

    the_light:
    Exit Function
    the_dark:
    MsgBox "addSheet: " & inName & ": " & Err.Description, vbOKOnly, "unexpected error"
    Err.Clear
    GoTo the_light
End Function

4

尝试使用以下方法:

Worksheets.Add (After:=Worksheets(Worksheets.Count)).Name = "MySheet"

如果你想检查是否已存在同名的工作表,你可以创建以下函数:
Function funcCreateList(argCreateList)
    For Each Worksheet In ThisWorkbook.Worksheets
        If argCreateList = Worksheet.Name Then
            Exit Function ' if found - exit function
        End If
    Next Worksheet
    Worksheets.Add (After:=Worksheets(Worksheets.Count)).Name = argCreateList
End Function

当函数创建完成后,可以从主Sub中调用它,例如:

Sub main

    funcCreateList "MySheet"

Exit Sub

4
尝试修改你的代码顺序。在命名工作表之前必须先创建它。
Private Sub CreateSheet()
    Dim ws As Worksheet
    Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
    ws.Name = "Tempo"
End Sub

thanks,


3
这将给你以下选择:
  1. 覆盖或保留具有相同名称的选项卡。
  2. 将工作表放置在所有选项卡的末尾或当前选项卡旁边。
  3. 选择您的新工作表或活动工作表。

Call CreateWorksheet("New", False, False, False)


Sub CreateWorksheet(sheetName, preserveOldSheet, isLastSheet, selectActiveSheet)
  activeSheetNumber = Sheets(ActiveSheet.Name).Index

  If (Evaluate("ISREF('" & sheetName & "'!A1)")) Then 'Does sheet exist?
    If (preserveOldSheet) Then
      MsgBox ("Can not create sheet " + sheetName + ". This sheet exist.")
      Exit Sub
    End If
      Application.DisplayAlerts = False
      Worksheets(sheetName).Delete
    End If

    If (isLastSheet) Then
      Sheets.Add(After:=Sheets(Sheets.Count)).Name = sheetName 'Place sheet at the end.
    Else 'Place sheet after the active sheet.
      Sheets.Add(After:=Sheets(activeSheetNumber)).Name = sheetName
    End If

    If (selectActiveSheet) Then
      Sheets(activeSheetNumber).Activate
    End If

End Sub

-2

这是一个快速简单的命名选项卡添加到当前工作表:

Sheets.Add.Name = "Tempo"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接