2014-09-22 1 views
0

Я пытаюсь скопировать список листов, сохраняя каждый в качестве другого файла. Он продолжает давать мне error 1004, говоря, что Copy method of Worksheet class failed. Выбор линии Sheets(i).Copy. Мне нужно сделать копию листа, а не копировать и вставлять значение в другое место, поскольку мне нужно форматирование, которое нужно переносить.Создание копии рабочего листа в цикле

Может кто-нибудь помочь исправить ошибку, поскольку я не могу найти то, что я сделал неправильно?

Sub CSR() 

Dim wb As Workbook, First As Integer, Last As Integer, i As Integer, j As Integer 
Dim rng As Range 
Dim wk As Worksheet 
Dim filepath As String 
Dim filename As String 

Set wb = ThisWorkbook 

filepath = "H:\Finance\Danny Bland\" 
wb.Activate 
First = Sheets("LIVE FLEET").Index 
Last = Sheets("Email Attachment").Index 

For i = First + 1 To Last - 1 


wb.Activate 
Set wk = wb.Sheets(i) 
wk.Activate 
filename = Sheets(i).Name 
Sheets(i).Activate 
Sheets(i).Copy 

Cells.Copy 
Range("A1").PasteSpecial xlPasteValues 

ActiveWorkbook.SaveAs filename:=filepath & filename & ".xlsx" 
ActiveWorkbook.Close 

Next i 

End Sub 
+0

что значение 'i', когда код перерывов? – 2014-09-22 13:21:57

+0

Это на самом деле ничего не делает, поэтому я предполагаю, что это '2', поскольку это первое используемое значение. – DannyBland

+0

. Хорошо, вот сделка: когда вы пытаетесь ссылаться на« Лист »с индексом' i', вам нужно убедиться, что Лист с таким индексом действительно существует. Есть несколько способов справиться с этим, но если вы можете дать нам скриншот о структуре ваших листов, которая поможет нам придумать решение. – 2014-09-22 13:25:38

ответ

1

Попробуйте это:

Private Const filepath As String = "H:\Finance\Danny Bland\" 

Sub CSR() 

    Dim wb As Workbook 
    Dim wk As Worksheet 

    Set wb = ThisWorkbook 
    wb.Activate 

    For Each wk In Sheets ' for all sheets in the workbook 
     ' if sheet name isn't live fleet or email attachment 
     If wk.Name <> "LIVE FLEET" Or wk.Name <> "Email Attachment" Then 
      ExportSheet wk ' you want to export it 
     End If 
    Next 

End Sub 

' you may need to modify this so exactly suit your needs 
Private Sub ExportSheet(sh As Worksheet) 

    sh.Copy 
    sh.Cells.Copy 
    sh.Range("A1").PasteSpecial xlPasteValues 

    sh.SaveAs filename:=filepath & sh.Name & ".xlsx" 
    sh.Parent.Close 

End Sub 
+0

Не совсем уверен, что мне нужно для редактирования, чтобы сделать эту работу. По какой причине это невозможно сделать с помощью цикла «i»? – DannyBland

+0

@ DannyBland Я могу, но если индексы листа сдвинутся по какой-либо причине, код, вероятно, будет прерываться каждый раз. Итерация коллекции листов и исключение 2 листов представляется более разумной в этом случае -> вы получаете ссылку на каждый лист, который не является «Живым флотом» или «Вложение электронной почты», игнорируя их индексы. – 2014-09-22 14:05:11

+0

Первый лист всегда будет первым листом, а последний всегда будет последним. В середине могут быть простыни, но это не должно вызывать никаких дополнительных проблем? – DannyBland

Смежные вопросы