在Excel中复制表格

时间:2016-03-09 22:45:21

标签: excel vba excel-vba

我正在尝试构建一个电子表格来跟踪项目数据,包括每个项目的工作表和提供摘要信息的概述表。我根据一组样本项目构建了一张表,这一切似乎都按照我的预期运作。但是,添加一个新项目需要花费很多精力,因此我决定给用户一个单击按钮,一个对话框来询问一个项目名称,然后让脚本完成剩下的工作。

我创建了一个模板表(方便地标题为" Template"),并且我尝试使用Worksheets("Name").Copy方法将该表的重复脚本编写到工作簿的末尾在MSDN上。这种尝试反映在下面的前几行代码中。之后,我将模板行添加到概览表的列表末尾(名为" Dashboard")。

最终发生的事情(据我所知)是工作表无法复制,工作簿中的最后一个工作表被选中,ActiveSheet.Name = Name最终重命名,炸毁我的信息中心使用INDIRECT查找和表示数据的工作表。

这是我目前拥有的代码(效率低下):

Sub AddSOW()
    ' Duplicate the template sheet
    Dim Name As String
    Name = InputBox("SOW Name")
    Worksheets("Template").Copy After:=Sheets(Sheets.Count)
    ActiveSheet.Name = Name


    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 = Name
        End If
    Next x
End Sub

没有错误被抛出,它只是不起作用。单步通过也没有帮助。

1 个答案:

答案 0 :(得分:0)

事实证明我造成了我自己的问题。

为了确保用户不修改模板工作表,我将其隐藏起来。复制它也复制.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