Vba 如何将文件夹中的多个文件复制到单个电子表格中?

Vba 如何将文件夹中的多个文件复制到单个电子表格中?,vba,excel,Vba,Excel,我刚开始使用excel宏。我的问题是一个文件夹中有500个excel文件。我正在寻找一种方法,将这500个文件的第一列和第二列复制到一个电子表格中。这是否可以使用excel VBA完成。感谢您的帮助。请看我录制的VBA代码。我如何修改此项以实现我的目标 Sub Macro1() ' ' Macro1 Macro ' ' ActiveCell.Range("A1:B1").Select Range(Selection, Selection.End(xlDown)).Se

我刚开始使用excel宏。我的问题是一个文件夹中有500个excel文件。我正在寻找一种方法,将这500个文件的第一列和第二列复制到一个电子表格中。这是否可以使用excel VBA完成。感谢您的帮助。请看我录制的VBA代码。我如何修改此项以实现我的目标

 Sub Macro1()
 '
 ' Macro1 Macro
 '

 '
    ActiveCell.Range("A1:B1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Windows("Book1").Activate
    ActiveSheet.Paste
End Sub

请阅读我在代码中的注释

您必须更正路径(地址)、文件夹名和文件名。

Option Explicit

Sub LoopAllFiles()
Dim myCalc As XlCalculation
Application.EnableCancelKey = xlDisabled
Application.ScreenUpdating = False
Application.Calculation = myCalc
Application.Calculation = xlCalculationManual
Dim folderPath As String
Dim Filename As String
Dim wb As Workbook, wbMaster As Workbook
Dim sh As Worksheet
Dim ColNo As Long
    ColNo = 1
folderPath = "C:\testfolder\" 'contains folder path
'or folderPath = "C:\Users\AshleyLarson\Desktop\LoopThroughFolders\AnyFolder\" 
' ==> Please correct your path otherwise code won't work. <==
If Right(folderPath, 1) <> "\" Then folderPath = folderPath + "\"
Filename = Dir(folderPath & "*.xlsx")
Do While Filename <> ""

    Set wb = Workbooks.Open(folderPath & Filename)
    Set wbMaster = Workbooks.Open(folderPath & "masterfolder\Master Template.xlsx")   ' BE CAREFUL This should be your Master File's path

    wb.Sheets(1).Range("A1:B" & (Range("A" & Rows.Count).End(xlUp).Row) + 100).Copy

    Workbooks("Master Template").Worksheets("Sheet1").Range(Chr(ColNo + 64) & ":" & Chr((ColNo + 1) + 64)).PasteSpecial xlPasteValues
    ColNo = ColNo + 2
    Application.DisplayAlerts = False
    Workbooks(Filename).Save
    Workbooks(Filename).Close
    Workbooks("Master Template.xlsx").Save
    Workbooks("Master Template.xlsx").Close
    Application.DisplayAlerts = True
    Filename = Dir
Loop
   Application.ScreenUpdating = True
   Application.Calculation = myCalc
End Sub
选项显式
子循环所有文件()
Dim myCalc As XLC计算
Application.EnableCancelKey=xlDisabled
Application.ScreenUpdating=False
Application.Calculation=myCalc
Application.Calculation=xlCalculationManual
将folderPath设置为字符串
将文件名设置为字符串
将wb设置为工作簿,wbMaster设置为工作簿
将sh设置为工作表
暗淡的科尔诺
ColNo=1
folderPath=“C:\testfolder\”包含文件夹路径
'或folderPath=“C:\Users\AshleyLarson\Desktop\LoopThroughFolders\AnyFolder\”

'==>请更正路径,否则代码将无法运行 请阅读我在代码中的注释

您必须更正路径(地址)、文件夹名和文件名。

Option Explicit

Sub LoopAllFiles()
Dim myCalc As XlCalculation
Application.EnableCancelKey = xlDisabled
Application.ScreenUpdating = False
Application.Calculation = myCalc
Application.Calculation = xlCalculationManual
Dim folderPath As String
Dim Filename As String
Dim wb As Workbook, wbMaster As Workbook
Dim sh As Worksheet
Dim ColNo As Long
    ColNo = 1
folderPath = "C:\testfolder\" 'contains folder path
'or folderPath = "C:\Users\AshleyLarson\Desktop\LoopThroughFolders\AnyFolder\" 
' ==> Please correct your path otherwise code won't work. <==
If Right(folderPath, 1) <> "\" Then folderPath = folderPath + "\"
Filename = Dir(folderPath & "*.xlsx")
Do While Filename <> ""

    Set wb = Workbooks.Open(folderPath & Filename)
    Set wbMaster = Workbooks.Open(folderPath & "masterfolder\Master Template.xlsx")   ' BE CAREFUL This should be your Master File's path

    wb.Sheets(1).Range("A1:B" & (Range("A" & Rows.Count).End(xlUp).Row) + 100).Copy

    Workbooks("Master Template").Worksheets("Sheet1").Range(Chr(ColNo + 64) & ":" & Chr((ColNo + 1) + 64)).PasteSpecial xlPasteValues
    ColNo = ColNo + 2
    Application.DisplayAlerts = False
    Workbooks(Filename).Save
    Workbooks(Filename).Close
    Workbooks("Master Template.xlsx").Save
    Workbooks("Master Template.xlsx").Close
    Application.DisplayAlerts = True
    Filename = Dir
Loop
   Application.ScreenUpdating = True
   Application.Calculation = myCalc
End Sub
选项显式
子循环所有文件()
Dim myCalc As XLC计算
Application.EnableCancelKey=xlDisabled
Application.ScreenUpdating=False
Application.Calculation=myCalc
Application.Calculation=xlCalculationManual
将folderPath设置为字符串
将文件名设置为字符串
将wb设置为工作簿,wbMaster设置为工作簿
将sh设置为工作表
暗淡的科尔诺
ColNo=1
folderPath=“C:\testfolder\”包含文件夹路径
'或folderPath=“C:\Users\AshleyLarson\Desktop\LoopThroughFolders\AnyFolder\”

'==>请更正路径,否则代码将无法运行 这可以在Power Query中完成,只需在功能区图标上单击几下。不需要VBA

启动新查询

  • 从文件
  • 导航到文件夹
  • 选择所有文件
  • 使用筛选器删除不需要的文件(可选步骤)
  • 组合二进制文件
  • 选择要保留的列
如果文件夹中的文件发生更改,只需刷新查询即可


Power Query是Microsoft for Excel 2010和2013提供的免费附加模块,作为获取和转换功能内置于Excel 2016中

只需在功能区图标上单击几下,即可在Power Query中完成此操作。不需要VBA

启动新查询

  • 从文件
  • 导航到文件夹
  • 选择所有文件
  • 使用筛选器删除不需要的文件(可选步骤)
  • 组合二进制文件
  • 选择要保留的列
如果文件夹中的文件发生更改,只需刷新查询即可

Power Query是Microsoft for Excel 2010和2013提供的免费附加模块,作为获取和转换功能内置于Excel 2016中

这样试试看

Sub Basic_Example_1()
    Dim MyPath As String, FilesInPath As String
    Dim MyFiles() As String
    Dim SourceRcount As Long, Fnum As Long
    Dim mybook As Workbook, BaseWks As Worksheet
    Dim sourceRange As Range, destrange As Range
    Dim rnum As Long, CalcMode As Long

    'Fill in the path\folder where the files are
    MyPath = "C:\Users\Ron\test"

    'Add a slash at the end if the user forget it
    If Right(MyPath, 1) <> "\" Then
        MyPath = MyPath & "\"
    End If

    'If there are no Excel files in the folder exit the sub
    FilesInPath = Dir(MyPath & "*.xl*")
    If FilesInPath = "" Then
        MsgBox "No files found"
        Exit Sub
    End If

    'Fill the array(myFiles)with the list of Excel files in the folder
    Fnum = 0
    Do While FilesInPath <> ""
        Fnum = Fnum + 1
        ReDim Preserve MyFiles(1 To Fnum)
        MyFiles(Fnum) = FilesInPath
        FilesInPath = Dir()
    Loop

    'Change ScreenUpdating, Calculation and EnableEvents
    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    'Add a new workbook with one sheet
    Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    rnum = 1

    'Loop through all files in the array(myFiles)
    If Fnum > 0 Then
        For Fnum = LBound(MyFiles) To UBound(MyFiles)
            Set mybook = Nothing
            On Error Resume Next
            Set mybook = Workbooks.Open(MyPath & MyFiles(Fnum))
            On Error GoTo 0

            If Not mybook Is Nothing Then

                On Error Resume Next

                With mybook.Worksheets(1)
                    Set sourceRange = .Range("A1:C1")
                End With

                If Err.Number > 0 Then
                    Err.Clear
                    Set sourceRange = Nothing
                Else
                    'if SourceRange use all columns then skip this file
                    If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
                        Set sourceRange = Nothing
                    End If
                End If
                On Error GoTo 0

                If Not sourceRange Is Nothing Then

                    SourceRcount = sourceRange.Rows.Count

                    If rnum + SourceRcount >= BaseWks.Rows.Count Then
                        MsgBox "Sorry there are not enough rows in the sheet"
                        BaseWks.Columns.AutoFit
                        mybook.Close savechanges:=False
                        GoTo ExitTheSub
                    Else

                        'Copy the file name in column A
                        With sourceRange
                            BaseWks.cells(rnum, "A"). _
                                    Resize(.Rows.Count).Value = MyFiles(Fnum)
                        End With

                        'Set the destrange
                        Set destrange = BaseWks.Range("B" & rnum)

                        'we copy the values from the sourceRange to the destrange
                        With sourceRange
                            Set destrange = destrange. _
                                            Resize(.Rows.Count, .Columns.Count)
                        End With
                        destrange.Value = sourceRange.Value

                        rnum = rnum + SourceRcount
                    End If
                End If
                mybook.Close savechanges:=False
            End If

        Next Fnum
        BaseWks.Columns.AutoFit
    End If

ExitTheSub:
    'Restore ScreenUpdating, Calculation and EnableEvents
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub
Sub-Basic_示例_1()
将MyPath设置为字符串,将FileInPath设置为字符串
将MyFiles()设置为字符串
暗源计数等于长,Fnum等于长
将mybook设置为工作簿,将BaseWks设置为工作表
变暗源范围作为范围,减小范围作为范围
尺寸与长度相同,计算模式与长度相同
'填写文件所在的路径\文件夹
MyPath=“C:\Users\Ron\test”
'如果用户忘记了,请在末尾添加斜杠
如果正确(MyPath,1)“\”则
MyPath=MyPath&“\”
如果结束
'如果文件夹中没有Excel文件,请退出子文件夹
FilesInPath=Dir(MyPath&“*.xl*”)
如果FilesInPath=“”,则
MsgBox“未找到任何文件”
出口接头
如果结束
'用文件夹中的Excel文件列表填充数组(myFiles)
Fnum=0
在文件输入路径“”时执行此操作
Fnum=Fnum+1
ReDim保留我的文件(1到Fnum)
MyFiles(Fnum)=FilesInPath
FilesInPath=Dir()
环
'更改屏幕更新、计算和启用事件
应用
CalcMode=.Calculation
.Calculation=xlCalculationManual
.ScreenUpdate=False
.EnableEvents=False
以
'添加带有一张工作表的新工作簿
Set BaseWks=工作簿。添加(XLWBATWORKEM)。工作表(1)
rnum=1
'循环遍历数组中的所有文件(myFiles)
如果Fnum>0,则
对于Fnum=LBound(MyFiles)到UBound(MyFiles)
设置mybook=Nothing
出错时继续下一步
设置mybook=Workbooks.Open(MyPath&MyFiles(Fnum))
错误转到0
如果不是的话,我的书什么都不是
出错时继续下一步
使用mybook.工作表(1)
设置sourceRange=.Range(“A1:C1”)
以
如果错误编号>0,则
呃,明白了
设置sourceRange=Nothing
其他的
'如果SourceRange使用所有列,则跳过此文件
如果sourceRange.Columns.Count>=BaseWks.Columns.Count,则
设置sourceRange=Nothing
如果结束
如果结束
错误转到0
如果不是sourceRange,则为Nothing
SourceRcount=sourceRange.Rows.Count
如果rnum+SourceRcount>=BaseWks.Rows.Count,则
MsgBox“很抱歉,工作表中的行数不足”
BaseWks.Columns.AutoFit
mybook.Close savechanges:=False
下地狱
其他的
'复制A列中的文件名
使用sourceRange
基底细胞(rnum,“A”)_
调整大小(.Rows.Count).Value=MyFiles(Fnum)
以
'设置destrange
设置destrange=BaseWks.Range(“B”和rnum)
'我们将值从sourceRange复制到DestrRange