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