用VB把多个excel文件的数据顺序拷到一个excel中

是给朋友整理实验数据用的,两个小需求:

一、要第一列是数据序号,且多个文件数据拷到目的文件的时候数据序号要按顺序排列;

二、每个文件可能有多个worksheet,都要拷贝到目标文件里面。

 

对于office2003以前的excel,是支持Application.FileSearch的,实现代码如下:

Sub Test()

Dim i As Integer, iRow As Integer
Dim strPath As String
Dim TheSheet As Worksheet
iRow = 1
Set TheSheet = ActiveWorkbook.Worksheets("sheet1")
strPath = "D:/Macro/testtest"

With Application.FileSearch
    .LookIn = strPath
    .SearchSubFolders = True
    .Filename = "*.*"
    If .Execute > 0 Then
        For i = 1 To .FoundFiles.Count
        'Range("A" & i) = .FoundFiles(i)
            Workbooks.Open (.FoundFiles(i))
            For j = 1 To ActiveWorkbook.Worksheets.Count
            'ActiveWorkbook.Worksheets(i).Cells(1, 1).Value = "a"
                ActiveWorkbook.Worksheets(j).UsedRange.Copy

                TheSheet.Activate
                While TheSheet.Range("a" & iRow).Value <> ""
                    TheSheet.Cells(iRow, 1) = iRow
                    iRow = iRow + 1
                Wend

                TheSheet.Range("A" & iRow).Select
                ActiveSheet.Paste
                ActiveWorkbook.Save

            Next j

            Workbooks(Workbooks.Count).Close
        Next i
    End If
End With

End Sub

--------------------------------------------------------------------------------------

对于Office2007的用户,Application.FileSearch不支持了,修改后的代码如下:

Sub Test()

Dim i As Integer, iRow As Integer
Dim strPath, Filename, Search_Fullname As String
Dim TheSheet, CurrentSheet As Worksheet
Dim Coll_Docs As New Collection
Dim activeSheetName As String
iRow = 1
Set TheSheet = ActiveWorkbook.Worksheets("sheet1")
strPath = "D:/Macro/testtest"
Filename = "*.xls"
Set Coll_Docs = Nothing

DocName = Dir(strPath & "/" & Filename)

Do Until DocName = ""
    Coll_Docs.Add Item:=DocName
    DocName = Dir
Loop

        For i = Coll_Docs.Count To 1 Step -1
            Search_Fullname = strPath & "/" & Coll_Docs(i)
            Workbooks.Open (Search_Fullname)
            For j = 1 To ActiveWorkbook.Worksheets.Count Step 1
                If j = 1 Then
                    activeSheetName = "sheet" & j
                    Set CurrentSheet = ActiveWorkbook.Worksheets(activeSheetName)
                End If
                CurrentSheet.Activate
                ActiveWorkbook.Worksheets(j).UsedRange.Copy
                TheSheet.Activate
                While TheSheet.Range("a" & iRow).Value <> ""
                    TheSheet.Cells(iRow, 1) = iRow
                    iRow = iRow + 1
                Wend

                TheSheet.Range("A" & iRow).Select
                ActiveSheet.Paste
                ActiveWorkbook.Save

            Next j

            Workbooks(Workbooks.Count).Close
        Next i

End Sub

 

 

<think>我们面对的问题是如何将多个Excel工作表合并到一个Excel文件中。这通常指的是将多个工作簿(即多个Excel文件)中的工作表合并到一个工作簿(一个Excel文件)中,或者将同一个工作簿中的多个工作表合并到一个工作表中。但根据用户问题,更可能是指将多个工作簿中的工作表合并到一个工作簿中。因此,我们需要考虑两种情况: 1. 将多个工作簿(每个工作簿可能包含多个工作表)合并为一个工作簿,即把所有工作表都放在一个工作簿中,每个工作表保持原样。 2. 将多个工作簿中的特定工作表(比如每个工作簿的第一个工作表)合并到一个工作表中(即数据追加)。 由于问题描述是“合并到一个Excel文件中”,可能指的是第一种情况:将多个工作簿的所有工作表合并到一个工作簿中。但有时也可能指第二种情况,即数据合并到一个工作表中。因此,我们需要提供两种常见需求的解决方案。 由于需要调用网络搜索工具,但这里我们无法实际执行网络搜索,因此将基于已有的知识提供解决方案,并注意格式要求。 ### 解决方案1:使用Power Query(Excel内置功能)合并多个工作簿中的工作表(数据追加到一张表) 适用于将多个工作簿中结构相同的工作表数据合并到一张工作表中。 步骤: 1. 将需要合并的工作簿放在同一个文件夹中。 2. 在Excel中,选择“数据”选项卡,点击“获取数据”>“来自文件”>“从文件夹”。 3. 浏览到包含工作簿的文件夹,点击“确定”。 4. 在现的对话框中,点击“转换数据”进入Power Query编辑器。 5. 在Power Query编辑器中,会看到文件夹中的文件列表。点击“合并文件”按钮(在Content列的右侧)。 6. 在弹的对话框中,选择要合并的工作表(通常每个工作簿的第一个工作表,或者选择包含相同名称的工作表),点击“确定”。 7. 此时,所有工作簿中指定工作表的数据将被追加到一起。可以在Power Query编辑器中进行数据清洗。 8. 点击“关闭并上载”,数据将加载到Excel一个工作表中。 ### 解决方案2:使用VBA宏合并多个工作簿的所有工作表(每个工作表保持独立) 适用于将多个工作簿的所有工作表分别复制到一个新的工作簿中。 步骤: 1. 将所有需要合并的Excel工作簿放在同一个文件夹中,并关闭所有Excel文件。 2. 新建一个Excel工作簿,按`Alt+F11`打开VBA编辑器。 3. 在VBA编辑器中,插入一个新模块(菜单:插入>模块)。 4. 复制以下VBA代码到模块中: ```vb Sub MergeWorkbooks() Dim Path As String, FileName As String Dim ws As Worksheet Dim wbTarget As Workbook, wbSource As Workbook Set wbTarget = ThisWorkbook Path = "C:\YourFolderPath\" ' 修改为你的文件夹路径 FileName = Dir(Path & "*.xls*") Application.ScreenUpdating = False Do While FileName <> "" If FileName <> wbTarget.Name Then Set wbSource = Workbooks.Open(Path & FileName) For Each ws In wbSource.Worksheets ws.Copy After:=wbTarget.Sheets(wbTarget.Sheets.Count) Next wbSource.Close SaveChanges:=False End If FileName = Dir() Loop Application.ScreenUpdating = True MsgBox "合并完成!" End Sub ``` 5. 修改代码中的文件夹路径(`Path = "C:\YourFolderPath\"`)为实际路径。 6. 运行宏(按F5或点击运行按钮),该宏将打开指定文件夹中的每个工作簿,并将所有工作表复制到当前工作簿中。 ### 解决方案3:使用Python和pandas库(适合批量处理) 如果熟悉Python,可以使用pandas库来读取多个Excel文件并将它们合并到一个Excel文件的不同工作表中。 步骤: 1. 确保安装了pandas和openpyxl(用于写入Excel): ```bash pip install pandas openpyxl ``` 2. 使用以下Python脚本: ```python import pandas as pd import os # 设置包含Excel文件文件夹路径 folder_path = 'path_to_folder' # 替换为你的文件夹路径 output_file = 'combined.xlsx' # 输的合并文件名 # 创建一个ExcelWriter对象 with pd.ExcelWriter(output_file, engine='openpyxl') as writer: # 遍历文件夹中的所有文件 for file in os.listdir(folder_path): if file.endswith(('.xlsx', '.xls')): file_path = os.path.join(folder_path, file) # 读取Excel文件中的所有工作表 xls = pd.ExcelFile(file_path) # 遍历每个工作表 for sheet_name in xls.sheet_names: df = pd.read_excel(file_path, sheet_name=sheet_name) # 将工作表写入输文件,工作表名改为原文件名+原工作表名(避免重复) new_sheet_name = f"{file[:-5]}_{sheet_name}" # 去掉扩展名,加上工作表名 df.to_excel(writer, sheet_name=new_sheet_name[:31], index=False) # 工作表名最多31字符 print("合并完成!") ``` 注意:此脚本将每个工作簿的每个工作表都写入到同一个Excel文件的不同工作表中。为了避免工作表名称重复,这里使用了原文件名加上原工作表名(并截断至31个字符)。 ### 注意事项 - 在运行VBA或Python脚本前,请备份原始文件,以防操作失误。 - 使用Power Query合并时,要求数据结构相同(列顺序和类型一致)才能正确追加。 - VBA方法在合并大量文件时可能会比较慢,且工作表名称重复时会被自动重命名(不会覆盖)。 根据用户的具体需求(是合并工作表数据还是保留多个工作表),选择合适的方法。 §§相关问题§§: 1. 如何将多个Excel工作表合并到一个工作表中? 2. 如何用VBA合并同一个工作簿中的多个工作表? 3. 如何使用Python合并多个CSV文件一个Excel文件?</think>### 合并多个Excel工作表的方法 #### 方法1:使用Power Query(推荐) 1. **创建新查询** 打开Excel → 选择"数据"选项卡 → 点击"获取数据" → 选择"来自文件" → 点击"从文件夹" 2. **选择文件夹** 浏览包含所有Excel文件文件夹 → 点击"打开" → 在预览窗口中点击"转换数据" 3. **合并文件** 在Power Query编辑器中 → 点击Content列标题旁的合并文件图标(双箭头)→ 选择要合并的工作表(通常选Sheet1)→ 点击"确定" 4. **加载数据** 删除无关列(保留数据列)→ 点击"关闭并上载" → 数据将合并到新工作表中 ```vb ' 方法2:VBA宏(批量合并工作簿) Sub MergeWorkbooks() Dim Path As String, FileName As String Dim ws As Worksheet Set wbTarget = ThisWorkbook Path = "C:\YourFolder\" ' 修改为实际路径 FileName = Dir(Path & "*.xls*") Do While FileName <> "" Set wbSource = Workbooks.Open(Path & FileName) For Each ws In wbSource.Sheets ws.Copy After:=wbTarget.Sheets(wbTarget.Sheets.Count) Next wbSource.Close False FileName = Dir() Loop End Sub ``` #### 方法3:Python脚本(自动化处理) ```python import pandas as pd import os folder_path = 'excel_files/' # 存放Excel文件夹 output_file = 'combined.xlsx' with pd.ExcelWriter(output_file) as writer: for file in os.listdir(folder_path): if file.endswith(('.xlsx', '.xls')): file_path = os.path.join(folder_path, file) xl = pd.ExcelFile(file_path) for sheet_name in xl.sheet_names: df = pd.read_excel(file_path, sheet_name=sheet_name) df.to_excel(writer, sheet_name=f"{file[:15]}_{sheet_name}", index=False) ``` #### 方法4:复制粘贴(少量文件) 1. 打开所有Excel文件 2. 右键点击要移动的工作表标签 → 选择"移动或复制" 3. 在"工作簿"下拉菜单中选择目标文件 4. 勾选"建立副本" → 点击"确定" 5. 重复操作直到所有工作表合并 > **注意事项** > - 合并前备份原始文件 > - 同名工作表会自动重命名(后缀加数字) > - VBA/Python方法需启用宏或安装库(pandas, openpyxl) > - 路径中使用正斜杠`/`避免转义错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值