在网上找EXCEL多文件合并的方法,思路:
一、Linux 或者window+cmder,直接用命令行cat合并EXCEL文件,但是,需要安装辅助东西才能直接处理(也许也不可以,但是,可以用文件格式转换工具转换是可行的,把EXCEL文件转换成txt文件,再操作,操作好了,再转换成EXCEL格式);还有一种是perl或者Python有自己自带的EXCEL处理包,能像处理数组一样,实现直接处理EXCEL文件的目的
二、EXCEL自带VBA编程实现合并,但是,网上搜了很多,格式很类似的VBA脚本,都不能很完美的实现合并功能,都或多或少合并有不完整的现象,于是遇到下面的这个版本,可以很好正确的实现合并,就在此把脚本里边每条的功能给详细注释一下,如有不正确的地方,欢迎留言,感激不尽~
脚本:
Sub 合并目录所有工作簿全部工作表()
Dim MP, MN, AW, Wbn, wn #定义变量(MP=MyPath,MN=MyName,AW=ActiveWorkbookName,Wbn=WorkBookName,wn=workbooksheet(i)name),但未指定变量类型,这样不是很规范
Dim Wb As Workbook #定义变量Wb为工作簿类型 #Dim Wbn As string,G As Long #定义变量Wbn为字符型,G为长整型 #Dim Num,ini As Long #定义Num未声明类型,定义并声明ini为长整型
Dim i, a, b, d, c, e #定义变量,但未指定变量类型,这样不是很规范
Application.ScreenUpdating = False #关闭屏幕刷新
MP = ActiveWorkbook.Path #将当前工作簿(活动工作簿)的路径赋值给MP
MN = Dir(MP & "\" & "*.xls") #将当前工作簿(活动工作簿)的路径加上\*.xls后缀,从而捕获到的*位置的所有文件名的值,Dir 会返回匹配 pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名,再一次调用 Dir,且不要使用参数。如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串,并要再次调用 Dir 时,就必须指定 pathname,否则会产生错误。
AW = ActiveWorkbook.Name #将当前工作簿(活动工作簿)的名字赋值给AW(不带后缀,只是名字)
Num = 0 #Num=0
e = 1 #ini=0
Do While MN <> "" #运行下面的DO while 循环,直到MN值为空值
If MN <> AW Then #如果,MN值不等于AW值,就运行IF到END IF之间的判断语句
Set Wb = Workbooks.Open(MP & "\" & MN) #打开MP\路径下名为MN变量值的工作簿,并引用(Set的作用)赋给Wb ##引用赋值如果,对Wb更改了,被引用的也随着更改了,详细见下边PS(3)
a = a + 1 #对a进行循环累加
With Workbooks(1).ActiveSheet #对已打开的所有工作簿中的第一个工作簿中的被激活的工作表运用with语句
For i = 1 To Sheets.Count #在Workbooks(1).ActiveSheet的所有sheet中循环
If Sheets(i).Range("a1") <> "" Then #如果Wb工作簿的第i个工作表的A1单元格内容不为空,就进行IF判断内容,如果为空,跳过IF判断进入For的下一个循环
Wb.Sheets(i).Range("a1").Resize(1, Sheets(i).UsedRange.Columns.Count).Copy .Cell