Sub MergeSelectedFilesIntoCurrentWorkbook()
Dim ws As Worksheet
Dim wb As Workbook
Dim targetWorkbook As Workbook
Dim fileNames As Variant
Dim i As Integer
Dim sheet As Worksheet
Dim csvWs As Worksheet
' 选择文件
fileNames = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls*), *.xls*; CSV Files (*.csv), *.csv", _
Title:="选择要合并的Excel/CSV文件", _
MultiSelect:=True)
' 如果没有选择文件,则退出
If IsArray(fileNames) = False Then
MsgBox "没有选择文件,操作取消。"
Exit Sub
End If
' 禁用屏幕更新以提高速度
Application.ScreenUpdating = False
' 设置当前工作簿
Set targetWorkbook = ThisWorkbook
' 循环遍历选择的文件
For i = LBound(fileNames) To UBound(fileNames)
' 根据文件扩展名进行处理
If Right(fileNames(i), 4) = ".csv" Then
' 处理CSV文件
Set wb = Workbooks.Open(fileNames(i))
Set csvWs = wb.Sheets(1)
csvWs.Copy After:=targetWorkbook.Sheets(targetWorkbook.Sheets.Count)
wb.Close False
ElseIf Right(fileNames(i), 4) = "xlsx" Or Right(fileNames(i), 4) = ".xls" Then
' 处理Excel文件
Set wb = Workbooks.Open(fileNames(i))
For Each sheet In wb.Sheets
sheet.Copy After:=targetWorkbook.Sheets(targetWorkbook.Sheets.Count)
Next sheet
wb.Close False
End If
Next i
' 重新启用屏幕更新
Application.ScreenUpdating = True
MsgBox "所有选定的文件已成功合并到当前工作簿中。"
End Sub
-
文件选择 :
Application.GetOpenFilename
方法允许选择.xls
,.xlsx
, 和.csv
文件。MultiSelect:=True
允许一次选择多个文件。 -
文件类型判断:代码通过检查文件的扩展名来决定如何处理:
- CSV文件:打开文件后,只包含一个工作表,因此直接复制该工作表到目标工作簿中。
- Excel文件 :对于
.xls
和.xlsx
文件,代码将遍历所有工作表并复制到目标工作簿。
-
文件关闭:在处理完每个文件后,源文件将被关闭以释放资源。
使用方法
- 打开目标工作簿。
- 按
ALT + F11
打开VBA编辑器。 - 插入新模块 (
Insert > Module
) 并粘贴代码。 - 运行宏 (
F5
键),选择你需要合并的Excel/CSV文件。
注意事项
- CSV文件的格式:CSV文件通常只包含数据,没有格式或公式。当它们被合并时,数据将被直接复制到目标工作簿中,格式将使用默认的工作表格式。
- 重复工作表名称:如果目标工作簿中已有相同名称的工作表,Excel将自动重命名新复制的工作表(如 "Sheet1 (2)"),以避免名称冲突。