Vba 在Excel中复制工作表

Vba 在Excel中复制工作表,vba,excel,Vba,Excel,我正试图构建一个电子表格来跟踪项目数据,每个项目都有一个工作表和一个提供摘要信息的概览表。我构建了一个基于项目样本集的工作表,它似乎都按照我预期的方式工作。但是,添加一个新项目需要非常小心,因此我决定给用户一个按钮来单击,一个对话框来询问项目名称,然后让脚本来完成其余的工作 我创建了一个模板工作表(方便地称为“模板”),并尝试使用工作表(“名称”)。按照MSDN上的建议复制方法,将该工作表的副本编写到工作簿的末尾。这一尝试反映在下面的前几行代码中。之后,我获取一个模板行,并将其添加到概览表(名为

我正试图构建一个电子表格来跟踪项目数据,每个项目都有一个工作表和一个提供摘要信息的概览表。我构建了一个基于项目样本集的工作表,它似乎都按照我预期的方式工作。但是,添加一个新项目需要非常小心,因此我决定给用户一个按钮来单击,一个对话框来询问项目名称,然后让脚本来完成其余的工作

我创建了一个模板工作表(方便地称为“模板”),并尝试使用
工作表(“名称”)。按照MSDN上的建议复制
方法,将该工作表的副本编写到工作簿的末尾。这一尝试反映在下面的前几行代码中。之后,我获取一个模板行,并将其添加到概览表(名为“Dashboard”)列表的末尾

最终发生的事情(据我所知)是工作表没有复制,工作簿中的最后一张工作表被选中,而
ActiveSheet.Name=Name
最终将其重命名,炸毁了我的仪表板工作表,该工作表使用
INDIRECT
查找和表示数据

以下是我目前拥有的代码(尽管效率很低):


不会抛出错误,只是不起作用。单步走也没用。

原来是我自己造成了问题

为了确保用户不会修改模板工作表,我将其隐藏起来。复制它还复制了
.Visible
属性设置,因此这些工作表实际上是被复制的,但是由于它们不可见,所以书中最后一张可见的工作表被选中,因此被重命名

我用一些错误检查更新了代码,所以取消输入框不会导致问题。这是工作代码

Sub AddSOW()
    Dim SName As String

    SName = InputBox("SOW Name")
    ' Duplicate the template sheet
    If SName <> "" Then
        Worksheets("Template").Visible = True
        Worksheets("Template").Copy After:=Sheets(Sheets.Count)
        ActiveSheet.Name = SName
        Worksheets("Template").Visible = False
        Sheets("Dashboard").Select
        ' Find the last row of data
        FinalRow = Cells(Rows.Count, 1).End(xlUp).Row
        ' Loop through each row
        For x = 2 To FinalRow
            ' Decide if to copy based on column A
            ThisValue = Cells(x, 1).Value
            If ThisValue = "Template" Then
                Cells(x, 1).Resize(1, 50).Copy
                NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
                Cells(NextRow, 1).Select
                ActiveSheet.Paste
                ActiveCell.Value = SName
            End If
        Next x
    End If
End Sub
Sub AddSOW()
像绳子一样模糊
SName=输入框(“SOW名称”)
'复制模板工作表
如果我是“”那么
工作表(“模板”)。可见=真
工作表(“模板”).Copy After:=工作表(Sheets.Count)
ActiveSheet.Name=SName
工作表(“模板”)。可见=假
工作表(“仪表板”)。选择
'查找最后一行数据
FinalRow=单元格(Rows.Count,1).End(xlUp).Row
'循环通过每一行
对于x=2到最终路径
'根据A列决定是否复制
此值=单元格(x,1)。值
如果ThisValue=“Template”,则
单元格(x,1)。调整大小(1,50)。复制
NextRow=单元格(Rows.Count,1)。结束(xlUp)。行+1
单元格(下一步,1)。选择
活动表。粘贴
ActiveCell.Value=SName
如果结束
下一个x
如果结束
端接头

首先,
Name
可能是一个受保护的词,因此请将变量重命名为类似于
SName
的名称。其次,由于您将模板工作表复制到末尾,请尝试将
ActiveSheet.Name=SName
替换为
工作表(Sheets.Count)。Name=SName
使用
工作表(Sheets.Count)。Name=SName
引发错误:
运行时错误“1004”:应用程序定义或对象定义错误
Sub AddSOW()
    Dim SName As String

    SName = InputBox("SOW Name")
    ' Duplicate the template sheet
    If SName <> "" Then
        Worksheets("Template").Visible = True
        Worksheets("Template").Copy After:=Sheets(Sheets.Count)
        ActiveSheet.Name = SName
        Worksheets("Template").Visible = False
        Sheets("Dashboard").Select
        ' Find the last row of data
        FinalRow = Cells(Rows.Count, 1).End(xlUp).Row
        ' Loop through each row
        For x = 2 To FinalRow
            ' Decide if to copy based on column A
            ThisValue = Cells(x, 1).Value
            If ThisValue = "Template" Then
                Cells(x, 1).Resize(1, 50).Copy
                NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
                Cells(NextRow, 1).Select
                ActiveSheet.Paste
                ActiveCell.Value = SName
            End If
        Next x
    End If
End Sub