Vba 如何将文件夹中的多个文件复制到单个电子表格中?
我刚开始使用excel宏。我的问题是一个文件夹中有500个excel文件。我正在寻找一种方法,将这500个文件的第一列和第二列复制到一个电子表格中。这是否可以使用excel VBA完成。感谢您的帮助。请看我录制的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
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