将数千个Excel文件中的数据编译成一个工作簿的最佳方法?

我有成千上万的excel文件格式完全相同,都位于我们的服务器上的同一文件夹。

我试图做的是从每个单独的Excel文件中提取特定数据,并将它们编译到位于服务器上不同位置的单个Excel文件中。 最好在可以分类,过滤等的Excel表格中

有谁知道什么是最简单的方法来实现呢?

这个“单一的Excel文件”解决scheme包括在任何时候将新文件添加到其他数千个“自动更新”的能力也是理想的。

把这个更笼统地说…

我正在尝试build立一个家庭冲泡采购订单系统。 我们已经有数以千计的个人采购订单,多年来创build,目前做一个“另存为”最近一个创build下一个。

我们现在需要的是能够将这些PO文件中的特定数据合并成一个新的(希望自动更新)采购订单日志文件。

我道歉,如果这没有意义。 我感谢你们所有人的帮助/想法。


更新:下面你会发现我目前正在做的事情,试图实现我所要求的更简单的解决scheme。

我已经制作了一个工作手册,用于收集/提取数据,结果是成百上千(不断增加)的不同的封闭式工作簿。 它基本上是一个采购订单日志,可以在创build个别采购订单时自动收集数据。

此采购订单日志工作簿是一个包含8列的表格,A:H。

列A中有以下公式。

=SUBSTITUTE(IF(ISERROR(INDEX(FL,ROW()-2)),"",INDEX(FL,ROW()-2)),".xlsx","") 

其中“FL”是文件夹位置的名称replace为我们各自的采购订单文件。 如公式所示,它将在该文件夹中的任何现有文件或新文件中search该文件夹位置,然后将该文件名称减去扩展名(.xlsx),并将其传送到列A中相应的行中。

在列A中检索到的数据驱动位于其余列(B:H)中的其余公式。 剩下的公式看起来完全一样,除了他们要求数据的特定单元外。 列B:H中有以下公式。

 =IFERROR(INDIRECT.EXT("'\\MyPath\["&$A3&".xlsx"&"]Purchase Order'!F9"),"") 

你会注意到这个公式正在寻找一个文件名为A的各个单元格+ .xlsx中的任何文件。 一旦find该文件,它正在查找单元格F9中的数据。 剩余的每一列都在不同的单元格中查找数据,但公式的其余部分保持不变。

这应该是一个非常简单的工作手册的肉和土豆。

但是,加class的情况是,现在我们已经有超过一千个这个工作簿正在研究的单个文件,并且导致了计算时间的成倍增加。 现在,我们必须等待30多分钟,以便更新PO日志文件。 随着越来越多的单个PO文件被创build,这个时间越来越长。

好的 – 看下面。 这对我来说是一个小小的testing文件集。 希望你能看到你需要更新它的设置。

将此代码粘贴到常规VBA模块中,并添加对Microsoft Scripting Runtime的引用(在VB编辑器>>工具>>引用中)

编辑 :调整使用没有扩展名的文件名。 请注意:如果您有两个具有相同名称的文件,但一个是* .xls而另一个是* .xlsx,则可能会导致问题

 Sub RefreshMasterList() Const SRC_FOLDER As String = "C:\_Stuff\test\" Const COL_FNAME As Long = 1 Const COL_LAST_MOD As Long = 2 Dim fso As New Scripting.FileSystemObject Dim fold As Scripting.Folder, fl As Scripting.File Dim f As Range, sht As Worksheet, rw As Range, dtlm Dim getInfo As Boolean, wb As Workbook, ws As Worksheet Dim baseName As String Set sht = ThisWorkbook.Sheets("Master") 'clear all file status flag colors sht.Columns(COL_FNAME).Interior.ColorIndex = xlNone Set fold = fso.GetFolder(SRC_FOLDER) For Each fl In fold.Files If fl.Name Like "*.xls*" Then getInfo = False dtlm = Format(fl.DateLastModified, "yyyy-mm-dd-hh:mm:ss") baseName = fso.GetBaseName(fl.Name) 'have this file already ? Set f = sht.Columns(1).Find(baseName, lookat:=xlWhole, _ LookIn:=xlValues) If f Is Nothing Then 'not already listed... Set rw = sht.Cells(Rows.Count, COL_FNAME).End(xlUp) _ .Offset(1, 0).EntireRow With rw .Cells(COL_FNAME).Value = baseName 'flag new .Cells(COL_FNAME).Interior.Color = vbGreen .Cells(COL_LAST_MOD).Value = dtlm End With getInfo = True Else Set rw = f.EntireRow If rw.Cells(COL_LAST_MOD).Value < dtlm Then Debug.Print f.Cells(COL_LAST_MOD).Value, dtlm 'flag updated rw.Cells(COL_FNAME).Interior.Color = vbYellow rw.Cells(COL_LAST_MOD).Value = dtlm getInfo = True Else 'flag no change rw.Cells(COL_FNAME).Interior.Color = RGB(220, 220, 220) End If End If If getInfo Then 'need to add/update from this file? Set wb = Workbooks.Open(fl.Path, , True) With wb.Sheets("Purchase Order") rw.Cells(3).Value = .Range("F9").Value rw.Cells(4).Value = .Range("F10").Value 'etc... End With wb.Close False 'don't save... End If End If Next fl End Sub