Excel VBA .SaveAs rompiendo el ciclo

Tengo un libro de trabajo de Excel dividido en varias hojas de trabajo, 1 por cliente. En mi código, estoy tratando de save cada hoja de trabajo individual del cliente como su propio file de Excel. Sin embargo, el command .SaveAs se rompe la segunda vez que se desencadena en el ciclo. Cualquier puntero sería fantástico.

Dim SchedWorksheet As Worksheet Dim SchedWorkbook As Workbook Dim SchedName As String Set SchedWorkbook = ActiveWorkbook Set SchedWorksheet = ActiveSheet Application.DisplayAlerts = False For Each Worksheet In SchedWorkbook.Sheets If Worksheet.Name = "Instructions" Or Worksheet.Name = "Invoice_Items" Or Worksheet.Name = "Customers" Or _ Worksheet.Name = "Terms" Or Worksheet.Name = "Dilution_Type" Or Worksheet.Name = "Approval_Status" Or _ Worksheet.Name = "Carriers" Then GoTo NextSched End If If Worksheet.Name = "Invoices" Then 'basicScheduleFileName is global set at beginning of program SchedName = basicScheduleFileName & "ALL" Else SchedName = Worksheet.Name End If 'payoutFileName is global set at beginning of program Worksheet.SaveAs Application.ActiveWorkbook.Path & "\" & payoutFileName & "\Basic Schedule" & "\" & SchedName, xlOpenXMLWorkbook NextSched: Next Worksheet 

El error en la segunda iteración es el siguiente: Error en time de ejecución 1004 'Error definido por la aplicación o definido por el object'

También intenté ejecutar este ciclo utilizando el object SchedWorksheet en lugar de Worksheet y obtuve el error "method .SaveAs of object _Worksheet failed" en la segunda iteración.

Pregunta Tengo un código extremadamente similar a su código anterior en mi progtwig que toma un set de datos similar y usa una llamada a exportAsFixedFormat para save cada hoja de trabajo como un PDF. ¿Hay un equivalente para .xlsx? (.csv estaría bien también)

No sé qué valor tiene "payOutFileName", así que lo dejé fuera del código. Tampoco sé el valor de basicScheduleFileName, así que lo configuré en "Algo". Tendrás que cambiar eso a lo que sea que necesites para cambiarlo también. Esto funciona bien al save en mi directory "C \ Files". Puede que sea un poco problemático para ti. Espero que sea un comienzo.

 Sub asdfghj() Dim SchedWorkbook As Workbook Dim SchedName As String Dim basicScheduleFileName As String Dim payoutFileName As String Dim ws As Worksheet Dim wb As Workbook basicScheduleFileName = "Something" Set SchedWorkbook = ActiveWorkbook Application.DisplayAlerts = False For Each ws In SchedWorkbook.Sheets Debug.Print ws.Name If ws.Name = "Instructions" Or ws.Name = "Invoice_Items" _ Or ws.Name = "Customers" Or _ ws.Name = "Terms" Or ws.Name = "Dilution_Type" Or _ ws.Name = "Approval_Status" Or _ ws.Name = "Carriers" Then GoTo NextSched End If If ws.Name = "Invoices" Then SchedName = basicScheduleFileName & "ALL" & ".xlsx" Else SchedName = ws.Name & ".xlsx" End If ws.Activate ' SaveAs Application.ActiveWorkbook.Path & "\" & payoutFileName & "\Basic Schedule" & "\" & SchedName, xlOpenXMLWorkbook Set wb = Workbooks.Add ws.Copy Before:=wb.Sheets(1) wb.Sheets("Sheet1").Delete wb.SaveAs Filename:="C:\Files\" & SchedName, FileFormat:= _ xlOpenXMLWorkbook, CreateBackup:=False wb.Close NextSched: Next ws End Sub 

En primer lugar, gracias a todos los que se tomaron el time y la capacidad intelectual para tratar de resolver mi problema. Finalmente descubrí una solución que funciona.
Primero, me aseguré de eliminar las references de ActiveWorkbook y ActiveSheet para evitar cualquier confusión en Excel.
Segundo Como señaló @NickSlash, era probable que incluso si mi código funcionaba, savea varias copys del mismo file con diferentes nombres. Entonces, para solucionar eso mientras solucionaba mi problema original, cambié mi código para copyr las hojas de trabajo que necesito en un nuevo libro y savelas de esa manera:

 Dim WS As Worksheet Dim WB As Workbook Dim NWB As Workbook Dim SchedName As String Set WB = Workbooks("Basic_Schedule-.xls") WB.Activate 'Application.DisplayAlerts = False For Each WS In WB.Sheets WB.Activate If WS.Name = "Instructions" Or WS.Name = "Invoice_Items" Or WS.Name = "Customers" Or _ WS.Name = "Terms" Or WS.Name = "Dilution_Type" Or WS.Name = "Approval_Status" Or _ WS.Name = "Carriers" Then GoTo NextSched End If If WS.Name = "Invoices" Then SchedName = basicScheduleFileName & "ALL" & ".xlsx" Else SchedName = WS.Name & ".xlsx" End If 'Copy sheet to another WB Set NWB = Workbooks.Add WB.Activate Sheets(WS.Name).Copy After:=NWB.Sheets(NWB.Sheets.Count) NWB.Sheets("Sheet1").Delete NWB.SaveAs filename:=basicScheduleFilePath & "\" & payoutFileName & "\Basic Schedule" & "\" & SchedName NWB.Close WB.Activate NextSched: Next WS 

En lugar de esto:

 'Copy sheet to another WB Set NWB = Workbooks.Add WB.Activate Sheets(WS.Name).Copy After:=NWB.Sheets(NWB.Sheets.Count) NWB.Sheets("Sheet1").Delete NWB.SaveAs filename:=basicScheduleFilePath & "\" & payoutFileName & "\Basic Schedule" & "\" & SchedName NWB.Close WB.Activate 

Haga esto: puede evitar la llamada al método "Activar", y también si tiene una reference a WS como un object, es networkingundante hacer WB.Sheets(WS.Name) cuando WS ya se refiere a la misma Hoja de trabajo.

 'Copy sheet to another WB WS.Copy '## Creates a new workbook with the copied sheet. Set NWB = ActiveWorkbook NWB.SaveAs filename:=basicScheduleFilePath & "\" & payoutFileName & "\Basic Schedule" & "\" & SchedName NWB.Close