2016-03-09 3 views
0

Я пытаюсь создать электронную таблицу для отслеживания данных проекта, с листом для каждого проекта и обзорным листом, который предоставляет сводную информацию. Я построил лист на основе типового набора проектов, и все это, похоже, работает так, как я ожидал. Однако добавление нового проекта требует большой заботы и кормления, поэтому я решил дать пользователю кнопку для клика, диалог, чтобы спросить название проекта, и пусть сценарий сделает все остальное.Дублирующие листы в Excel

Я создал лист шаблона (удобно под названием «Шаблон»), и я попытался выполнить дублирование этого листа в конце книги с использованием метода Worksheets("Name").Copy, как предложено в MSDN. Эта попытка отражена в первых нескольких строках кода ниже. После этого я беру строку шаблона и добавляю ее в конец списка на обзорном листе (под названием «Панель мониторинга»).

Что происходит (насколько я могу судить, что лист не копируется, последний лист в книге выбирается, а 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 

ошибок не вышвырнут, это просто не работает. Переход через не помогает.

+0

Во-первых, «Имя», вероятно, является защищенным словом, поэтому переименуйте переменную в нечто вроде «SName». Во-вторых, поскольку вы копируете лист шаблона до конца, попробуйте заменить 'ActiveSheet.Name = SName' на' Sheets (Sheets.Count) .Name = SName' – Chrismas007

+0

Использование 'Sheets (Sheets.Count) .Name = SName' выбрасывает error: 'Runtime error '1004': Определенная пользователем или объектная ошибка' –

ответ

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