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
,因为它不是一个定义的工作簿,而是在此刻处于活动状态的任何工作簿。 另外请注意,ActiveWorkbook
和ThisWorkbook
(这是一个定义的工作簿,它是代码在这一点上运行的工作簿)是有区别的。* -
另一件事是
.Worksheets(x)
可以,但不一定必须是实际移动的工作表。 我会说,因为你移动了最后一张工作表之后的新工作表,还需要访问最后一个工作表:.Worksheets(.Worksheets.Count)
。 -
另外,使用
Worksheets
Sheets
和Worksheets
也有区别。Sheets
集合包含工作表,但也包括图表等,但Worksheets
集合只包含工作表。 因此,您应该决定哪一个是正确的,除非您确实需要Sheets
否则我build议您始终使用Worksheets
。 -
我看到没有必要将variables设置为无。
Set wkbAll = Nothing Set wkbTemp = Nothing
如果我没有完全错误,那么Excel在程序结束时会自动执行此操作。