循环遍历指定文件夹中的所有 Excel 文件并从特定单元格中提取数据的代码
我有大约 50 个左右的 Excel 工作簿,需要从中提取数据。我需要从特定单元格、特定工作表中获取数据并编译成一个数据集(最好是另一个 Excel 工作簿)。
我正在寻找一些 VBA,以便可以将结果编译到我用来运行代码的工作簿中。
因此,我需要从工作表(“DataSource”)中提取数据的 xls 或 xlsx 文件之一,我需要评估单元格(D4),如果它不为空,则从单元格(F4)中提取数据,然后将到已编译数据集中的新行中。如上所述,循环遍历该文件夹中的所有 Excel 文件。
如果可能的话,我希望第一列中的第一个数据字段是从结果数据集中提取数据的文件的名称。
有人可以帮我解决这个问题吗?我正在寻找 VBA,因为我对此更熟悉,但也对 VBScript 感兴趣(因为我正在尝试深入了解它并了解其中的差异)。
I have about 50 or so Excel workbooks that I need to pull data from. I need to take data from specific cells, specific worksheets and compile into one dataset (preferably into another excel workbook).
I am looking for some VBA so that I can compile the results into the workbook I am using to run the code.
So, one of the xls or xlsx files I need to pull the data from, worksheet("DataSource"), I need to evaluate cell(D4), and if its not null, then pull data from cell(F4), and put into a new row into the compiled data set. Looping through all the Excel files in that folder as mentioned above.
And if possible, I would like the first data field in the first column the name of the file the data is being pulled from in the resulting dataset.
Can someone help me with this? I am looking for VBA because I am more familiar with that, but also interested in VBScript (as I am trying to get into that and learn the differences).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
首先从此 Google 查询开始,然后点击第一个链接出现,它会将您带到一篇文章,展示如何迭代一组文件夹中的 Excel 文件。
要获取工作簿的名称,您需要调整“在此处执行您的代码”中的代码以包含
wbResults.Name
。如果这是您想要的文件名,请使用wbResults.FullName
,它以字符串形式返回工作簿的名称,包括其在磁盘上的路径。搜索 同一事物的 VBScript 变体 会产生许多结果很有用,包括这个脚本:
First start with this google query and click the first link that comes up, which takes you to an article showing how to iterate through a group of Excel files in a folder.
To get the name of the workbook, you'll want to adapt the code at "DO YOUR CODE HERE" to include
wbResults.Name
. If it's the filename you want, usewbResults.FullName
, which returns the name of the workbook including its path on disk as a string.A search for a VBScript variation on the same thing yields a number of results that are useful, including this script:
如果您愿意的话,我会用 VBScript 甚至 VB.NET 或 Powershell 来完成。
使用 VB.NET,您可以通过 OLEDB 提供程序访问 Excel 电子表格,就好像它们是数据库一样。选择一系列值的代码可能如下所示:
获取数据后,您可以对其进行详细说明,然后使用相同的 API 将结果插入到另一个 Excel 电子表格中。
在 .NET 中,通过调用
System.IO.Directory.GetFiles()
;只需指定“*.xls”通配符。获得列表后,只需使用 for 循环对其进行迭代,依次打开每个文件,然后对该文件进行查询,依此类推。如果您使用 VBScript,则获取 Excel 文件列表的首选方法是使用
Scripting.FileSystemObject
,特别是 GetFolder 方法。它的工作方式基本相同,但语法略有不同。如果是 VBScript 或 VB.NET,它可能会在 Excel 本身之外运行。您可以通过双击或从批处理文件或类似文件来运行它。使用 VB.NET 的优点是您可以建立一个图形形式进行交互 - 它可以显示一个进度条,跟踪您已经浏览了多少文件,状态更新,诸如此类的事情。
I would do it in VBScript or even, VB.NET or Powershell if you feel so inclined.
Using VB.NET, you can access Excel spreadsheets as if they were databases, via the OLEDB provider. The code to select a range of values might look like this :
Once you get the data you can elaborate on it, then insert the result into another Excel spreadsheet, using the same API.
Getting the list of files is easy in .NET with a call to
System.IO.Directory.GetFiles()
; just specify the "*.xls" wildcard. Once you have the list, just use a for loop to iterate through it, opening each file in turn, then doing the query on that file, and so on.If you use VBScript, then the preferred way to get the list of Excel files is to use the
Scripting.FileSystemObject
, specifically the GetFolder method. It works basically the same way but the syntax is slightly different.If it's VBScript or VB.NET it will probably run outside of Excel itself. You'd run it by double-clicking or from a batch file or something like that. The advantage to using VB.NET is you could put up a graphical form for interaction - it could show a progress bar, tracking how many files you've gone through, status updates, that kind of thing.
每当您连续访问许多 Excel 文件时,通常使用 ADODB 而不是 Excel 的自动化对象可以获得更好的性能。
Whenever you are accessing that many Excel files in succession, you can generally get better performance using ADODB rather than Excel's automation object.
我同意使用访问 Excel 对象不是最快的方法,并且如果您尝试从中检索数据的工作簿和工作表都一致(即具有相同的列名称等...或至少您的列名称相同)正在寻找)最好使用 ODBC。这确实存在一些问题,如果您无法解决这些问题或需要根据内容实际做一些更复杂的事情,那么可能没有办法解决它。如果是这种情况,那么我建议创建一个 Excel 对象,然后根据需要打开和关闭文件,以尝试提高效率。
I agree with using that accessing the Excel object is not the quickest and if the workbooks and sheets that you're trying to retrieve data from are all consistent (i.e have the same column names, etc... or at least the column names you're looking for) it would be better to use ODBC. This does have some issues and if you can't get around them or need to actually do something more complex based on the contents then there may be no way around it. If that's the case then I would suggest creating one Excel object and then opening and closing the files as needed to try to increase the efficiency.
可以用下面的代码来完成
It could be done with the following code