Excel VBA。保存为循环

我有一个Excel工作簿打破了多个工作表,每个客户1。 在我的代码中,我试图将每个客户工作表保存为自己的Excel文件。 但是,.SaveAs命令会在循环中第二次触发。 任何指针都会很棒。

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 

第二次迭代的错误如下所示:运行时错误1004'应用程序定义或对象定义的错误'

我也尝试使用SchedWorksheet对象代替Worksheet运行此循环,并在第二次迭代中获取错误“method .SaveAs of object _Worksheet failed”。

问题我的代码与我的程序中的代码非常相似,它采用类似的数据集,并使用exportAsFixedFormat调用将每个工作表保存为PDF。 是否有.xlsx的等价物? (.csv也可以)

我不知道“payOutFileName”有什么价值,所以我把它从代码中删除了。 我也不知道basicScheduleFileName的值,所以我把它设置为“Something”。 你将不得不改变,以任何你需要改变它。 这个工作正常,当保存到我的目录“C \\文件”可能是一个小马车给你。 希望这将是一个开始。

 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 

首先,感谢所有花费大量时间和精力去解决我的问题的人。 我终于想出了一个可行的解决scheme。
首先我确保摆脱ActiveWorkbook和ActiveSheet引用,以避免在Excel中的任何混淆。
其次, @NickSlash指出,即使我的代码工作,也可能会以不同的名字保存同一文件的多个副本。 所以,为了解决这个问题,我修改了我原来的问题,改变了我的代码,把我需要的工作表复制到一个新的工作簿中,并以这种方式保存:

 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 

而不是这个:

 '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 

这样做 – 您可以避免“激活”方法调用,并且如果您将WS引用为对象,则当WS已经引用同一个Worksheet时,执行WB.Sheets(WS.Name)是多余的。

 '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