Vba 在共享驱动器中编译多个.xls文件
我希望Vba 在共享驱动器中编译多个.xls文件,vba,excel,Vba,Excel,我希望将几个日常xls文件编译成一个主文件。该位置位于共享文件夹中,但我也可以将其复制到我的桌面。我正在使用Excel中的“开发者”选项卡,并在网上研究了一些其他来源 Sub GetSheets() Path = "C:\Desktop\test_for_margaret\" Filename = Dir(Path & "*.xls") Do While Filename <> "" Workbooks.Open Filename:=Path & Filena
将几个日常xls文件编译成一个主文件。该位置位于共享文件夹中,但我也可以将其复制到我的桌面。我正在使用Excel中的“开发者”选项卡,并在网上研究了一些其他来源
Sub GetSheets()
Path = "C:\Desktop\test_for_margaret\"
Filename = Dir(Path & "*.xls")
Do While Filename <> ""
Workbooks.Open Filename:=Path & Filename, ReadOnly:=True
For Each Sheet In ActiveWorkbook.Sheets
Sheet.Copy After:=ThisWorkbook.Sheets(1)
Next Sheet
Workbooks(Filename).Close
Filename = Dir()
Loop
End Sub
Sub-GetSheets()
Path=“C:\Desktop\test\u for\u margaret\”
Filename=Dir(路径&“*.xls”)
文件名“”时执行此操作
工作簿。打开文件名:=路径和文件名,只读:=真
对于ActiveWorkbook.Sheets中的每个工作表
Sheet.Copy After:=此工作簿.Sheets(1)
下一页
工作簿(文件名)。关闭
Filename=Dir()
环
端接头
我的VBA知识是有限的,但我认为还有更多的东西需要改变 我似乎无法发表评论(声誉限制),所以我将作为答案发布
正如braX指出的,您正在目录中循环查找“*.xls”文件。如果您的文件是“.xlsx”,那么您将找不到任何匹配项
更新要定义的文件名字符串,如下所示:
Filename = Dir(Path & "*.xls*")
附加的通配符将允许您同时查看.xls文件和.xlsx文件。当然,前提是提供的路径正确。编译还是合并?以下脚本将合并文件夹中的所有Excel文件
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
使用sourceRange
设置减小范围=减小范围_
调整大小(.Rows.Count、.Columns.Count)
以
destrange.Value=sourceRange.Value
rnum=rnum+源计数
如果结束
如果结束
mybook.Close savechanges:=False
如果结束
下一个Fnum
BaseWks.Columns.AutoFit
如果结束
退出主题:
'还原屏幕更新、计算和启用事件
应用
.ScreenUpdate=True
.EnableEvents=True
.Calculation=CalcMode
以
端接头
你试过这个吗?如果是,发生了什么?如果没有,那似乎是首先要做的事情……由于某种原因,宏无法运行。主文件保存为启用宏,但单击“播放”按钮或“调试”按钮不会提示Excel中的任何操作。您确定该文件夹中有XLS文件吗?你确定它们不是XLSX文件吗?我在桌面上创建了一个测试环境(文件夹),这些文件是XLSX,代码将在第3行反映这一点。代码现在运行!如果我想将每个工作簿添加到“主工作簿”中,而不是将其作为主文件中的工作表添加,是否需要更改sheet.Copy After:=ThisWorkbook.Sheets(1)到sheet.Copy After:=例如ThisWorkbook?此外,是否可以将其修改为在第一张工作表之后的每个后续工作表/工作簿的第一行为空,以排除标题?此示例适用于多张图纸。子循环通过表()将ws作为工作表