干货 Tips Rules & Tips
1. 遵守中国大陆相关法律法规
2. 本版还在调整当中

搜以致用之合并当前目录下所有工作簿的全部工作表

查看: 5871|回复: 12
浮碟 发表于 2019-11-25 15:08:52
1.引子

某日,偶得一数据宝库,内含数百 excel 工作簿,每个工作簿又含数万条数据, 我的需求是依据关键字查询到某一条数据。天啦撸,像我这种运气差到总是最后一把钥匙才能打开门的人,不能每查询一次就点开几百个工作簿吧。我要解决这个问题,思路就是把它们合并成一个工作簿(原谅我一个excel和数据库小白,只能想到这种简单粗暴的办法,各位大神有更好的思路请不吝赐教)。各种我能想到的关键词一搜,再加上逐一试错,基本排除各种什么经验介绍的方法,最终锁定CNDS社区的一篇VBA代码(因为评论区里有小白成功过,时间久忘记具体是哪一篇贴文了,在此谢过)。然而,自己一试却总是失败,十分头疼抓狂,不过最终还是通过冷静的分析外加搜索的助力,成功解决了问题,现将正确代码和失败原因分享如下:


2.VBA代码

  1. Sub 合并当前目录下所有工作簿的全部工作表()

  2. Dim MyPath, MyName, AWbName

  3. Dim Wb As Workbook, WbN As String

  4. Dim G As Long

  5. Dim Num As Long

  6. Dim BOX As String

  7. Application.ScreenUpdating = False

  8. MyPath = ActiveWorkbook.Path

  9. MyName = Dir(MyPath & "" & "*.xls")

  10. AWbName = ActiveWorkbook.Name

  11. Num = 0

  12. Do While MyName <> ""

  13. If MyName <> AWbName Then

  14. Set Wb = Workbooks.Open(MyPath & "" & MyName)

  15. Num = Num + 1

  16. With Workbooks(1).ActiveSheet

  17. .Cells(.Range("A1048576").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)

  18. For G = 1 To Sheets.Count

  19. Wb.Sheets(G).UsedRange.Copy .Cells(.Range("A1048576").End(xlUp).Row + 1, 1)

  20. Next

  21. WbN = WbN & Chr(13) & Wb.Name

  22. Wb.Close False

  23. End With

  24. End If

  25. MyName = Dir

  26. Loop

  27. Range("A1").Select

  28. Application.ScreenUpdating = True

  29. MsgBox "共合并了" & Num & "个工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"

  30. End Sub
复制代码


3.操作方法

新建一个excel工作薄,命名后保存到需要合并的多个工作簿所在的文件夹,快捷键alt + f11,双击工程资源管理器里面的sheet1(sheet1),在右侧的代码区粘贴上述代码,执行等待就OK了。


4.失败原因

原来我的excel工作薄里的数据太多了,超出了2003版excel表的最大行数(Excel2003最大行数是65536行,最大列数是256列,Excel2007以上版本最大行数是1048576行,最大列数是16384列)。找到问题根源接下来就好办了,换成excel2007,再把数据合并到一个工作簿的多个工作表,通过同时选中多个工作表来ctrl+f,问题就基本解决了。以上就是我的一次搜以致用的体验,希望也能帮到有需要的虫友。
独角仙之夜 发表于 2019-11-25 22:26:01 来自手机
查找选项中把工作表改成工作簿不行吗?
 楼主| 浮碟 发表于 2019-11-26 06:50:47
独角仙之夜 发表于 2019-11-25 22:26
查找选项中把工作表改成工作簿不行吗?

合并前工作簿太多,选起来也费劲,关键是我不会同时查找多个工作簿,可以教下我怎么查么?
小无奈 发表于 2019-11-26 12:10:29
如果是我的话,会考虑,把每一个工作簿的信息,全部存到数据库里,以后查询的时候,直接用sql 语句就可以查了。。
针对较多的数据,存储在excle 里面 会存在数据量过大,打开缓慢,如果你能忍受,我觉得还Ok
 楼主| 浮碟 发表于 2019-11-26 12:50:36
小无奈 发表于 2019-11-26 12:10
如果是我的话,会考虑,把每一个工作簿的信息,全部存到数据库里,以后查询的时候,直接用sql 语句就可以查 ...

是的,数据库确实方便,但是我的数据库知识多年前已经还给老师了{:5_157:}
小无奈 发表于 2019-11-26 13:13:30
浮碟 发表于 2019-11-26 12:50
是的,数据库确实方便,但是我的数据库知识多年前已经还给老师了  ...

  够用就行,等你真的需要几百万的数据放在一个表格里的时候,在捡起来就完事了{:5_158:}{:5_158:} {:5_158:} {:5_158:}  {:5_158:}{:5_158:} {:5_158:} {:5_158:}  
独角仙之夜 发表于 2019-11-27 09:59:34
浮碟 发表于 2019-11-26 06:50
合并前工作簿太多,选起来也费劲,关键是我不会同时查找多个工作簿,可以教下我怎么查么? ...


查找-选项-范围-工作簿
Snipaste_2019-11-27_09-58-34.jpg
坤坤 发表于 2019-11-27 10:32:31
一、需将excel表转为csv文件方便数据处理和计算。并需要将产生的222个csv文件合并成一个。
参考:https://blog.csdn.net/m0_37717751/article/details/81043721
1、首先把需要导出的Excel文件集中整理到一个文件夹中,并且确定一个用来保存csv文件的路径。#个人建议上述两者不要在一个文件夹里

2、在他处,新建一个Excel文件,点击菜单栏上的“开发工具”,并点击下面的Visual Basic

3、在左侧一栏中双击Sheet1打开代码窗口,输入以下代码:
  1. Sub SaveToCSVs()
  2.     Dim fDir As String
  3.     Dim wB As Workbook
  4.     Dim wS As Worksheet
  5.     Dim fPath As String
  6.     Dim sPath As String
  7.     fPath = "你的excel文件路径,以\结尾"
  8.     sPath = "你要存放输出的csv文件的路径,以\结尾"
  9.     fDir = Dir(fPath)
  10.     Do While (fDir <> "")
  11.         If Right(fDir, 4) = ".xls" Or Right(fDir, 5) = ".xlsx" Then
  12.             On Error Resume Next
  13.             Set wB = Workbooks.Open(fPath & fDir)
  14.             'MsgBox (wB.Name)
  15.             For Each wS In wB.Sheets
  16.                 wS.SaveAs sPath & wB.Name & ".csv", xlCSV
  17.             Next wS
  18.             wB.Close False
  19.             Set wB = Nothing
  20.         End If
  21.         fDir = Dir
  22.         On Error GoTo 0
  23.     Loop
  24. End Sub
复制代码

4、之后点击菜单栏上的“运行”,选择运行子过程/用户窗体。转换过程中会有多个Excel窗口自动显示再关闭。完成后打开设定的文件夹,就能看到转换后的csv文件。#不知何因,每个csv会额外产生两个空的csv文件,删掉即可。



二、将多个csv合并到一个csv中

       1、将所有的csv文件放到一个文件夹中

       2、打开cmd,切换到存放csv的文件夹,

       3、输入命令copy *.csv 总表的文件名.csv
 楼主| 浮碟 发表于 2019-11-27 15:42:15
独角仙之夜 发表于 2019-11-27 09:59
查找-选项-范围-工作簿

这个是可行,但前提还是要把众多的工作薄合到一起
hanxj0327 发表于 2019-11-27 15:49:45
感谢你的分享,很好用,支持一下。
 楼主| 浮碟 发表于 2019-11-27 15:51:25
坤坤 发表于 2019-11-27 10:32
一、需将excel表转为csv文件方便数据处理和计算。并需要将产生的222个csv文件合并成一个。
参考:https://b ...

感谢提供新的思路,这个代码简洁,大致能够看懂意思,有时间来试一下。
werevil 发表于 2019-11-27 16:30:05
我现在看到会代码的人就佩服得五体投地{:5_130:}
独角仙之夜 发表于 2019-11-27 22:35:00
浮碟 发表于 2019-11-27 15:42
这个是可行,但前提还是要把众多的工作薄合到一起

前面没认真看,学习了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

虫部落 陕ICP备14001577号-1川公网安备 51019002003015号联系我们FAQ关于虫部落免责声明虫部落生存法则蛙先知 - AI 玩家社区 🚧

Build with for "make search easier" Copyright © 2013-2024. Powered by Discuz! GMT+8, 2024-5-6 11:31

快速回复 返回顶部 返回列表