20171113xlVba指定文件夹多簿多表分表合并150
'2017年11月13日
'Next_Seven
'功能:文件夹对话框指定文件夹下,合并(复制粘贴)每个Excel文件内的指定子表内容,
'在名为"设置"的工作表A列 输入汇总子表的名称 在B列输入汇总子表的表头行数
'C列自动输出 有效汇总的sheet个数
Public Sub 指定文件夹多簿多表分表合并()
AppSettings True
Dim StartTime As Variant
Dim UsedTime As Variant
StartTime = VBA.Timer Dim FolderPath As String, FileName As String, FilePath As String
Dim Arr As Variant, dSht As Object, Sht As Worksheet, Wb As Workbook
Dim EndRow As Long, EndCol As Long, Ar As Variant
Dim i As Long, j As Long, HeadRow As Long, NextRow As Long
Dim Key As String, NewSht As Worksheet, Rng As Range
Dim OpenWb As Workbook, OpenSht As Worksheet Set dSht = CreateObject("Scripting.Dictionary")
Set Wb = Application.ThisWorkbook
Set Sht = Wb.Worksheets("设置")
With Sht
Application.Intersect(.Range("C:C"), .UsedRange.Offset(1)).ClearContents
EndRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row
If EndRow <= 1 Then
MsgBox "未设置工作表名称!", vbInformation, "AuthorQQ 84857038"
Exit Sub
End If
For i = 2 To EndRow
If Len(.Cells(i, 2).Value) = 0 Then
HeadRow = 1
Else
HeadRow = .Cells(i, 2).Value
End If
Key = Trim(.Cells(i, 1).Text)
dSht(Key) = Array(Key, HeadRow, 0)
Next i
End With '获取文件夹路径
FolderPath = GetFolderPath(ThisWorkbook.Path)
If Len(FolderPath) = 0 Then
MsgBox "您没有选中任何文件夹,本次汇总中断!"
Exit Sub
End If '获取文件名列表
Arr = FsoGetFiles(FolderPath, "*.xls*", "*" & ThisWorkbook.Name & "*")
For i = LBound(Arr) To UBound(Arr)
FilePath = CStr(Arr(i))
Debug.Print FilePath Set OpenWb = Application.Workbooks.Open(FilePath)
For Each OpenSht In OpenWb.Worksheets
Key = OpenSht.Name
If dSht.Exists(Key) Then
Ar = dSht(Key)
HeadRow = Ar(1)
If Ar(2) = 0 Then
'创建新工作表
Set NewSht = AddWorksheet(Wb, Key, True)
If Application.WorksheetFunction.CountA(OpenSht.Cells) > 0 Then
OpenSht.UsedRange.Copy NewSht.Range("A1")
Ar(2) = Ar(2) + 1
End If
Else
Set NewSht = Wb.Worksheets(Key)
If Application.WorksheetFunction.CountA(OpenSht.Cells) > 0 Then
With NewSht
NextRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row + 1
OpenSht.UsedRange.Offset(HeadRow).Copy .Cells(NextRow, 1)
End With
Ar(2) = Ar(2) + 1
End If
End If dSht(Key) = Ar End If
Next OpenSht
OpenWb.Close False Next i With Sht
Set Rng = .Range("A2")
Set Rng = Rng.Resize(dSht.Count, 3)
Rng.Value = Application.Rept(dSht.Items, 1)
End With Set dSht = Nothing
Set Sht = Nothing
Set NewSht = Nothing
Set OpenWb = Nothing
Set OpenSht = Nothing
Set Rng = Nothing UsedTime = VBA.Timer - StartTime
Debug.Print "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
'MsgBox "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
AppSettings False End Sub Private Function GetFolderPath(InitialPath) As String
Dim FolderPath As String
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = InitialPath
.AllowMultiSelect = False
.Title = "请选取Excel工作簿所在文件夹"
If .Show = -1 Then
FolderPath = .SelectedItems(1)
Else
GetFolderPath = ""
'MsgBox "您没有选中任何文件夹,本次汇总中断!"
Exit Function
End If
End With If Right(FolderPath, 1) <> Application.PathSeparator Then FolderPath = FolderPath & Application.PathSeparator
GetFolderPath = FolderPath
End Function
Private Function FsoGetFiles(ByVal FolderPath As String, ByVal Pattern As String, Optional ComplementPattern As String = "") As String()
Dim Arr() As String
Dim FSO As Object
Dim ThisFolder As Object
Dim OneFile As Object
ReDim Arr(1 To 1)
Arr(1) = "None"
Dim Index As Long
Index = 0
Set FSO = CreateObject("Scripting.FileSystemObject")
On Error GoTo ErrorExit
Set ThisFolder = FSO.getfolder(FolderPath)
If Err.Number <> 0 Then Exit Function
For Each OneFile In ThisFolder.Files
If OneFile.Name Like Pattern Then
If Len(ComplementPattern) > 0 Then
If Not OneFile.Name Like ComplementPattern Then
Index = Index + 1
ReDim Preserve Arr(1 To Index)
Arr(Index) = OneFile.Path
End If
Else
Index = Index + 1
ReDim Preserve Arr(1 To Index)
Arr(Index) = OneFile.Path
End If
End If
Next OneFile
ErrorExit:
FsoGetFiles = Arr
Erase Arr
Set FSO = Nothing
Set ThisFolder = Nothing
Set OneFile = Nothing
End Function
Private Function AddWorksheet(ByVal Wb As Workbook, ByVal ShtName As String, Optional ReplaceSymbol As Boolean = True) As Worksheet
Dim Sht As Worksheet
If Len(ShtName) = 0 Or Len(ShtName) > 31 Then
Set AddWorksheet = Nothing
MsgBox "Worksheet名称长度不符!", vbInformation, "AddWorksheet"
Exit Function
Else
On Error Resume Next
Set Sht = Wb.Worksheets(ShtName)
If Err.Number = 9 Then
Set Sht = Wb.Worksheets.Add(After:=Wb.Worksheets(Wb.Worksheets.Count))
Err.Clear
On Error GoTo 0
On Error Resume Next
Sht.Name = ShtName
If Err.Number = 1004 Then
Err.Clear
On Error GoTo 0
If ReplaceSymbol Then
Arr = Array("/", "\", "?", "*", "[", "]")
For i = LBound(Arr) To UBound(Arr)
ShtName = Replace(ShtName, Arr(i), "")
Next i
Set AddWorksheet = AddWorksheet(Wb, ShtName) '再次调用
Else
Set AddWorksheet = Nothing
MsgBox "Worksheet名称含有特殊符号!", vbInformation, "AddWorksheet"
End If
Else
Set AddWorksheet = Sht
End If
ElseIf Err.Number = 0 Then
Set AddWorksheet = Sht
End If
End If
End Function
Public Sub AppSettings(Optional IsStart As Boolean = True)
Application.ScreenUpdating = IIf(IsStart, False, True)
Application.DisplayAlerts = IIf(IsStart, False, True)
Application.Calculation = IIf(IsStart, xlCalculationManual, xlCalculationAutomatic)
Application.StatusBar = IIf(IsStart, ">>>>>>>>Macro Is Running>>>>>>>>", False)
End Sub
20171113xlVba指定文件夹多簿多表分表合并150的更多相关文章
- summernote图片上传功能保存到服务器指定文件夹+php代码+java方法
1.summernote富文本编辑器 summernote是一款基于bootstrap的富文本编辑器,是一款十分好用的文本编辑器,还附带有图片和文件上传功能. 那么在我们网站中想吧这个图片上传到服务器 ...
- JAVA 批量下载服务器文件到本地指定文件夹并重命名
/** * @功能 下载文件到指定文件夹并重命名 * @param url 请求的路径 * @param filePath 文件将要保存的目录 * @param filename 保存到本地的文件名 ...
- 怎么统计指定文件夹下含有.xml格式的文件数目
如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...
- PHP批量清空删除指定文件夹内容
PHP批量清空删除指定文件夹内容: cleancache.php <?php // 清文件缓存 $dirs = array( realpath(dirname(__FILE__) . '/../ ...
- C#实现把指定文件夹下的所有文件复制到指定路径下以及修改指定文件的后缀名
1.实现把指定文件夹下的所有文件复制到指定路径下 public static void copyFiles(string path) { DirectoryInfo dir = new Directo ...
- [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...
- (Python)导出指定文件夹中as文件的完全限定类名
AS3程序在编译的过程中,有一个特点是这样的,不管是项目中的类,还是标准库或者第三方库的类,编译的时候只会把用到的那些类文件编译进去,也就是说,某一些类,只要没有被主程序引用到,那这个文件是不会被编译 ...
- 将java的class文件放到一个指定文件夹下
用javac执行java文件时,要把java文件的class文件放到指定文件夹下,注意文件夹要创建好,执行javac -d 文件夹 ***.java 如图: 在class文件夹下就出现了L的class ...
- Android 遍历sdcard中指定文件夹下的图片(jpg,jpeg,png)
File scanner5Directory = new File(Environment.getExternalStorageDirectory().getPath() + "/scann ...
随机推荐
- centos6.8防火墙模块未加载
使用阿里云服务器下的centos6.8系统,开启或关系或查询防火墙的状态时,提示防火墙模块未加载. 解决办法: modprobe ip_tables #加载ip_tables模块 modprobe i ...
- 启动Activiti项目报错:org.activiti.engine.ActivitiObjectNotFoundException: no deployed process definition found with id '22501'
背景 启动activiti项目时,出现错误org.activiti.engine.ActivitiObjectNotFoundException: no deployed process defini ...
- Flask学习【第9篇】:Flask-script组件
Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任 ...
- js希尔排序
function shellSort (arr) { var len = arr.length; var increment = Math.floor(len/2); while(increment! ...
- oracle 之 定时任务,存储过程和游标等语法案例
--定时任务 declare job20 number; begin sys.dbms_job.submit(job20,'test1;',sysdate,'sysdate+1'); end; --存 ...
- (转)Awesome Object Detection
Awesome Object Detection 2018-08-10 09:30:40 This blog is copied from: https://github.com/amusi/awes ...
- (转)ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks
ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks by KO ...
- facebook api之Marketing API
General information on the Marketing APIs, access, versioning and more. The main use cases for the M ...
- NOIP2018退役祭
退役感受 在写下这个标题的时候,我的心情是复杂的,无非就是感觉像对一位将要赶往战场的士兵说:"你的战争已经输掉了." 退役了,没有什么好说的.无论再怎么抱怨这题出的真烂也无法改变了 ...
- HDU 3047 Zjnu Stadium(带权并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...