1.引子
某日,偶得一数据宝库,内含数百 excel 工作簿,每个工作簿又含数万条数据, 我的需求是依据关键字查询到某一条数据。天啦撸,像我这种运气差到总是最后一把钥匙才能打开门的人,不能每查询一次就点开几百个工作簿吧。我要解决这个问题,思路就是把它们合并成一个工作簿(原谅我一个excel和数据库小白,只能想到这种简单粗暴的办法,各位大神有更好的思路请不吝赐教)。各种我能想到的关键词一搜,再加上逐一试错,基本排除各种什么经验介绍的方法,最终锁定CNDS社区的一篇VBA代码(因为评论区里有小白成功过,时间久忘记具体是哪一篇贴文了,在此谢过)。然而,自己一试却总是失败,十分头疼抓狂,不过最终还是通过冷静的分析外加搜索的助力,成功解决了问题,现将正确代码和失败原因分享如下:
2.VBA代码
- Sub 合并当前目录下所有工作簿的全部工作表()
- Dim MyPath, MyName, AWbName
- Dim Wb As Workbook, WbN As String
- Dim G As Long
- Dim Num As Long
- Dim BOX As String
- Application.ScreenUpdating = False
- MyPath = ActiveWorkbook.Path
- MyName = Dir(MyPath & "" & "*.xls")
- AWbName = ActiveWorkbook.Name
- Num = 0
- Do While MyName <> ""
- If MyName <> AWbName Then
- Set Wb = Workbooks.Open(MyPath & "" & MyName)
- Num = Num + 1
- With Workbooks(1).ActiveSheet
- .Cells(.Range("A1048576").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
- For G = 1 To Sheets.Count
- Wb.Sheets(G).UsedRange.Copy .Cells(.Range("A1048576").End(xlUp).Row + 1, 1)
- Next
- WbN = WbN & Chr(13) & Wb.Name
- Wb.Close False
- End With
- End If
- MyName = Dir
- Loop
- Range("A1").Select
- Application.ScreenUpdating = True
- MsgBox "共合并了" & Num & "个工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"
- End Sub
复制代码
3.操作方法
新建一个excel工作薄,命名后保存到需要合并的多个工作簿所在的文件夹,快捷键alt + f11,双击工程资源管理器里面的sheet1(sheet1),在右侧的代码区粘贴上述代码,执行等待就OK了。
4.失败原因
原来我的excel工作薄里的数据太多了,超出了2003版excel表的最大行数(Excel2003最大行数是65536行,最大列数是256列,Excel2007以上版本最大行数是1048576行,最大列数是16384列)。找到问题根源接下来就好办了,换成excel2007,再把数据合并到一个工作簿的多个工作表,通过同时选中多个工作表来ctrl+f,问题就基本解决了。以上就是我的一次搜以致用的体验,希望也能帮到有需要的虫友。 |