closures临时工作簿

我从网上拿起这个代码。 它将几个Excel文件合并到单个文件中(每个文件在不同的工作表中)。

DATA从中导入的文件不会自动closures 。 这意味着我需要手动closures8-10个文件和“不保存”它们,这需要很多时间。 什么是缺less的代码?

Option Explicit Sub CombineExcelFiles() Dim FilesToOpen Dim x As Integer Dim wkbAll As Workbook Dim wkbTemp As Workbook Dim sDelimiter As String On Error GoTo ErrHandler Application.ScreenUpdating = False sDelimiter = "|" FilesToOpen = Application.GetOpenFilename _ (FileFilter:="Excel Files (*.*xl*), *.*xl*", _ MultiSelect:=True, Title:="Excel Files to Open") If TypeName(FilesToOpen) = "Boolean" Then MsgBox "No Files were selected" GoTo ExitHandler End If x = 1 Set wkbTemp = Workbooks.Open(Filename:=FilesToOpen(x)) wkbTemp.Sheets(1).Copy Set wkbAll = ActiveWorkbook wkbTemp.Close (False) wkbAll.Worksheets(x).Columns("A:A").TextToColumns _ Destination:=Range("A1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, _ Tab:=False, Semicolon:=False, _ Comma:=False, Space:=False, _ Other:=True, OtherChar:="|" x = x + 1 While x <= UBound(FilesToOpen) Set wkbTemp = Workbooks.Open(Filename:=FilesToOpen(x)) With wkbAll wkbTemp.Sheets(1).Move After:=.Sheets(.Sheets.Count) .Worksheets(x).Columns("A:A").TextToColumns _ Destination:=Range("A1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, _ Tab:=False, Semicolon:=False, _ Comma:=False, Space:=False, _ Other:=True, OtherChar:=sDelimiter End With x = x + 1 Wend ExitHandler: Application.ScreenUpdating = True Set wkbAll = Nothing Set wkbTemp = Nothing Exit Sub ErrHandler: MsgBox Err.Description Resume ExitHandler End Sub 

wkbTemp.Close False应该closures工作簿而不保存它。

但是另外一个问题是,为什么在While循环之外处理第一个文件呢? 我看不出有什么理由 因此我们可以缩短代码来:

 Option Explicit Public Sub CombineExcelFiles() Dim FilesToOpen Dim x As Integer Dim wkbAll As Workbook Dim wkbTemp As Workbook Dim sDelimiter As String On Error GoTo ErrHandler Application.ScreenUpdating = False sDelimiter = "|" FilesToOpen = Application.GetOpenFilename _ (FileFilter:="Excel Files (*.*xl*), *.*xl*", _ MultiSelect:=True, Title:="Excel Files to Open") If TypeName(FilesToOpen) = "Boolean" Then MsgBox "No Files were selected" GoTo ExitHandler End If x = 1 Set wkbAll = ActiveWorkbook While x <= UBound(FilesToOpen) Set wkbTemp = Workbooks.Open(Filename:=FilesToOpen(x)) With wkbAll wkbTemp.Sheets(1).Move After:=.Sheets(.Sheets.Count) wkbTemp.Close False .Worksheets(x).Columns("A:A").TextToColumns _ Destination:=Range("A1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, _ Tab:=False, Semicolon:=False, _ Comma:=False, Space:=False, _ Other:=True, OtherChar:=sDelimiter End With x = x + 1 Wend ExitHandler: Application.ScreenUpdating = True Set wkbAll = Nothing Set wkbTemp = Nothing Exit Sub ErrHandler: MsgBox Err.Description Resume ExitHandler End Sub 

一些重要的笔记

  • 如果可能的话,我build议避免使用ActiveWorkbook ,因为它不是一个定义的工作簿,而是在此刻处于活动状态的任何工作簿。 另外请注意, ActiveWorkbookThisWorkbook (这是一个定义的工作簿,它是代码在这一点上运行的工作簿)是有区别的。*

  • 另一件事是.Worksheets(x)可以,但不一定必须是实际移动的工作表。 我会说,因为你移动了最后一张工作表之后的新工作表,还需要访问最后一个工作表: .Worksheets(.Worksheets.Count)

  • 另外,使用Worksheets SheetsWorksheets也有区别。 Sheets集合包含工作表,但也包括图表等,但Worksheets集合只包含工作表。 因此,您应该决定哪一个是正确的,除非您确实需要Sheets否则我build议您始终使用Worksheets

  • 我看到没有必要将variables设置为无。

     Set wkbAll = Nothing Set wkbTemp = Nothing 

    如果我没有完全错误,那么Excel在程序结束时会自动执行此操作。