
Sub MergeExcelFilesToSheets()Dim fldPath As StringDim fileName As StringDim srcWB As WorkbookDim destWB As WorkbookDim destSheet As WorksheetDim sheetName As StringDim i As Long' 设置目标工作簿为当前活动工作簿(也可改为新建工作簿,见注释)Set destWB = ThisWorkbook' 选择文件夹With Application.FileDialog(msoFileDialogFolderPicker).Title = "请选择包含Excel文件的文件夹".AllowMultiSelect = FalseIf .Show <> -1 Then Exit Sub ' 用户取消fldPath = .SelectedItems(1) & "\"End With' 关闭屏幕刷新和警告,提速并防止提示Application.ScreenUpdating = FalseApplication.DisplayAlerts = False' 遍历文件夹中所有Excel文件(可根据需要修改扩展名)fileName = Dir(fldPath & "*.xls*")i = 0Do While fileName <> ""' 打开源工作簿(只读方式)Set srcWB = Workbooks.Open(fldPath & fileName, ReadOnly:=True)' 复制源文件的第一个工作表到目标工作簿的最后srcWB.Sheets(1).Copy After:=destWB.Sheets(destWB.Sheets.Count)Set destSheet = destWB.Sheets(destWB.Sheets.Count)' 生成工作表名称:去掉扩展名sheetName = Left(fileName, InStrRev(fileName, ".") - 1)' 若名称长度超过31字符则截断(Excel工作表名限制)If Len(sheetName) > 31 Then sheetName = Left(sheetName, 31)' 若重名则添加数字后缀If SheetExists(sheetName, destWB) ThenDim suffix As Integersuffix = 1Do While SheetExists(sheetName & "_" & suffix, destWB)suffix = suffix + 1LoopsheetName = sheetName & "_" & suffixEnd IfdestSheet.Name = sheetName' 关闭源工作簿,不保存srcWB.Close SaveChanges:=Falsei = i + 1fileName = Dir() ' 下一个文件Loop' 恢复设置Application.ScreenUpdating = TrueApplication.DisplayAlerts = TrueMsgBox "合并完成!共合并了 " & i & " 个文件。", vbInformationEnd Sub' 辅助函数:检查指定工作簿中是否存在某工作表Private Function SheetExists(sheetName As String, wb As Workbook) As BooleanOn Error Resume NextSheetExists = Not (wb.Sheets(sheetName) Is Nothing)On Error GoTo 0End Function
阅读延伸
【Excel】统计不重复客户数量,不用新函数!2个通用方法,简单又快捷
【简单】一个excel中有多个工作表需要合并,你还在一个个复制吗?只需一秒快速搞定
夜雨聆风