首页 文章

如果找不到现有工作表,则根据范围创建新工作表

提问于
浏览
1

我试图创建一个新的工作表,通过复制'模板',如果不存在 .

表格的名称基于A栏(从'Master'的A5开始的列表) . “主人”中的列表将每天更新 .

我通过循环现有的表格检查列表中的新名称 . 如果列A(Sheet'Master')中的单元格已经有一个带有名称的工作表,则不执行任何操作并转到下一个单元格 . 如果列表中的名称不在工作簿的工作表名称中,则会添加工作表(“模板”的副本)并以单元格值命名 .

我能够创建新的工作表,但是对于每个现有的工作表,宏都会创建其他工作表('template(2)','template(3)','template(4)'等) .

我该怎么做才能消除那些新的'模板(#)'?

这是我的代码:

Sub AutoAddSheet()

Dim MyCell As Range, MyRange As Range

Set MyRange = Sheets("Master").Range("A5")
Set MyRange = Range(MyRange, MyRange.End(xlDown))

For Each MyCell In MyRange

    On Error Resume Next

    Sheets("Template").Copy After:=Sheets(Sheets.Count)

    With Sheets(Sheets.Count)
        .Name = MyCell.Value
        .Cells(2, 1) = MyCell.Value

    End With

    On Error GoTo 0

    MyCell.Hyperlinks.Add Anchor:=MyCell, Address:="", SubAddress:="'" & MyCell.Value & "'!A1"

Next MyCell

End Sub

3 回答

  • 0

    您需要先检查工作表是否存在,这是我写的一个有效的函数:

    Function CheckSheetExists(ByVal name As String)
    
    ' checks if a worksheet already exists
    
    Dim retVal As Boolean
    
    retVal = False
    
    For s = 1 To Sheets.Count
        If Sheets(s).name = name Then
            retVal = True
            Exit For
        End If
    Next s
    
    CheckSheetExists = retVal
    
    End Function
    

    所以,修改你的代码:

    If CheckSheetExists(MyCell.Value) = false then
    
        Sheets("Template").Copy After:=Sheets(Sheets.Count)
    
        With Sheets(Sheets.Count)
            .Name = MyCell.Value
            .Cells(2, 1) = MyCell.Value
    
        End With
    End If
    
  • 1

    你可以用不同的方式尝试 . 首先,遍历工作簿中的所有 Worksheets 并将其名称保存在 sheetNames 数组中 .

    然后,对于范围中的每个单元格,您可以使用 Match 函数查看它是否已存在于工作簿中 . 如果 Match 失败,则表示在工作表名称>>中找不到 MyCell.Value ,因此请创建它 .

    Code

    Option Explicit
    
    Sub AutoAddSheet()
    
    Dim MyCell As Range, MyRange As Range
    Dim sheetNames() As String
    Dim ws As Worksheet
    Dim i As Integer
    
    Set MyRange = Sheets("Master").Range("A5", Sheets("Master").Range("A5").End(xlDown))
    
    ' put all sheet name from Range A5 in "Master" sheet into an array
    
    ReDim sheetNames(1 To 100) ' = Application.Transpose(MyRange.Value)
    
    i = 1
    ' loop through all worksheets and get their names
    For Each ws In Worksheets
        sheetNames(i) = ws.Name
    
        i = i + 1
    Next ws
    
    'resice array to actual number of sheets in workbook
    ReDim Preserve sheetNames(1 To i - 1)
    
    For Each MyCell In MyRange.Cells
    
        ' sheet name not found in workbook sheets array >> create it
        If IsError(Application.Match(MyCell.Value, sheetNames, 0)) Then
            Sheets("Template").Copy After:=Sheets(Sheets.Count)
    
            With Sheets(Sheets.Count)
                .Name = MyCell.Value
                .Cells(2, 1) = MyCell.Value
            End With
    
            MyCell.Hyperlinks.Add Anchor:=MyCell, Address:="", SubAddress:="'" & MyCell.Value & "'!A1"
    
        Else '<-- sheet name exists in array (don't create a new one)
            ' do nothing
        End If
    Next MyCell
    
    ' ====== Delete the worksheets with (#) section =====
    Application.DisplayAlerts = False
    For Each ws In Worksheets       
        If ws.Name Like "*(?)*" Then ws.Delete
    Next ws
    Application.DisplayAlerts = True
    
    End Sub
    
  • 2

    我只是稍微调整了一下代码,以确保所有引用都完全合格 . 它应该更容易理解,并且您不会冒Excel让您对从/到哪里复制感到困惑的风险 .

    经过测试,适合我

    Sub AutoAddSheet()
    
    Dim MyCell As Range, MyRange As Range
    
    Set MyRange = Sheets("Master").Range("A5")
    Set MyRange = Range(MyRange, MyRange.End(xlDown))
    
    Dim wksTemplate As Worksheet
    Set wksTemplate = ThisWorkbook.Worksheets("Template")
    
    For Each MyCell In MyRange
        wksTemplate.Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    
        Dim wsNew As Worksheet
        Set wsNew = ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    
        With wsNew
            .Name = MyCell.Value
            .Cells(2, 1) = MyCell.Value
        End With
    
        MyCell.Hyperlinks.Add Anchor:=MyCell, Address:="", SubAddress:="'" & MyCell.Value & "'!A1"
    Next MyCell
    
    End Sub
    

相关问题