|
楼主 |
发表于 2024-4-25 14:06
|
显示全部楼层
Sub 合并当前目录下所有工作簿的全部工作表至一个工作簿中()
' 声明变量
Dim mypath As String, MyName As String, AWbName As String
Dim Wb As Workbook, WbN As String
Dim G As Long
Dim Num As Long
Dim BOX As String
Dim WbDest As Workbook ' 目标工作簿,需要声明这个变量
' 设置目标工作簿为当前活动工作簿
Set WbDest = ActiveWorkbook
' 允许用户选择一个文件夹
With Application.FileDialog(msoFileDialogFolderPicker)
.Show
' 如果没有选择文件夹,则显示消息框并退出子程序
If .SelectedItems.Count = 0 Then
MsgBox "未选择文件夹,操作已取消。", vbExclamation
Exit Sub
End If
mypath = .SelectedItems(1) ' 获取选择的文件夹路径
End With
' 关闭屏幕更新以提高性能
Application.ScreenUpdating = False
' 初始化变量
MyName = Dir(mypath & "\" & "*.xls*") ' 搜索指定路径下的所有 Excel 文件(包括 .xls 和 .xlsx)
AWbName = ActiveWorkbook.Name ' 获取当前活动工作簿的名称
Num = 0 ' 初始化已合并的工作簿数量
WbN = "" ' 初始化已合并的工作簿名称字符串
' 循环遍历指定文件夹下的所有 Excel 文件
Do While MyName <> ""
If MyName <> AWbName Then ' 跳过当前活动工作簿,避免自我复制
' 打开找到的工作簿
Set Wb = Workbooks.Open(mypath & "\" & MyName)
Num = Num + 1 ' 增加已合并的工作簿数量
' 在目标工作簿的当前活动工作表(默认是第一个工作表)中粘贴数据
With WbDest.ActiveSheet ' 注意这里应该明确指定目标工作簿的活动工作表,而不是 Workbooks(1).ActiveSheet
' 在当前活动工作表的最后一个数据行下方插入源工作簿的名称(不包含文件扩展名)
.Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1).Value = Left(MyName, Len(MyName) - 4)
' 循环遍历源工作簿的所有工作表,并将其内容复制到目标工作簿的当前活动工作表中
For G = 1 To Wb.Sheets.Count
Wb.Sheets(G).UsedRange.Copy .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1)
Next G
WbN = WbN & Chr(13) & Wb.Name ' 在已合并的工作簿名称字符串中添加新工作簿的名称和换行符
Wb.Close False ' 关闭源工作簿,不保存更改
End With
End If
' 查找下一个 Excel 文件
MyName = Dir
Loop
' 选中目标工作簿的第一个单元格,以便用户可以看到合并后的数据
WbDest.ActiveSheet.Range("A1").Select
' 重新启用屏幕更新
Application.ScreenUpdating = True
' 显示消息框,告知用户已合并的工作簿数量和名称
MsgBox "共合并了" & Num & "个工作薄下的全部工作表。如下:" & WbN, vbInformation, "提示"
End Sub
用了AI改写了,分享给大伙吧,*.xls*"这里改成doc就是合并word文件。 |
|