使用Excel进行数据提取

我每月会收到100+的excel电子表格,我需要一个固定的范围,并粘贴到其他电子表格中来做报告。

我试图写一个VBA脚本来迭代我的Excel文件,并复制范围在一个电子表格,但我还没有能够做到这一点。

是否有捷径可寻?

我几年前写的,但也许会帮助你。 我添加了最新版本的Excel(xlsx)的扩展。 似乎工作。

Sub MergeExcelDocs() Dim lastRow As Integer Dim docPath As String Dim baseCell As Excel.range Dim sysObj As Variant, folderObj As Variant, fileObj As Variant Application.ScreenUpdating = False docPath = Application.GetOpenFilename(FileFilter:="Text Files (*.txt),*.txt,Excel Files (*.xls),*.xls,Excel 2007 Files (*.xlsx),*.xlsx", FilterIndex:=2, Title:="Choose any file") Workbooks.Add Set baseCell = range("A1") Set sysObj = CreateObject("scripting.filesystemobject") Set fileObj = sysObj.getFile(docPath) Set folderObj = fileObj.ParentFolder For Each fileObj In folderObj.Files Workbooks.Open Filename:=fileObj.path range(range("A1"), ActiveCell.SpecialCells(xlLastCell)).Copy lastRow = baseCell.SpecialCells(xlLastCell).row baseCell.Offset(lastRow, 0).PasteSpecial (xlPasteValues) baseCell.Copy ActiveWindow.Close SaveChanges:=False Next End Sub 

编辑:

我应该提到它是如何工作的。 当你启动macros时,它会popup一个打开文件对话框。 双击列表中的第一个文件(或任何文件)。 它将创build一个新的工作簿,然后遍历该文件夹中的所有文件。 对于每个文件,它复制第一个工作表中的所有内容,并将其粘贴到新工作簿的末尾。 这几乎是所有这一切。

下面是一些VBA代码,演示如何遍历目录中的一堆Excel文件并打开每个文件:

 Dim sourcePath As String Dim curFile As String Dim curWB As Excel.Workbook Dim destWB As Excel.Workbook Set destWB = ActiveWorkbook sourcePath = "C:\files" curFile = Dir(sourcePath & "\*.xls") While curFile <> "" Set curWB = Workbooks.Open(sourcePath & "\" & curFile) curWB.Close curFile = Dir() Wend 

希望这将是一个很好的起点,让你能够使用现有的macros代码。

另一个解决scheme是让您的汇总电子表格按文件名访问其他电子表格,并抓取数据本身。

要做到这一点,您需要同时打开所有电子表格,以便更新链接,但即使使用macros,也可能比打开和复制一个更快。 每个电子表格都需要有一个唯一的文件名。

如果电子表格的名称在收到之后才知道,或者定期更改,请在汇总表中创build一列以存储表单的文件名,然后使用string操作构build所需的地址,并获取数据使用INDIRECT()。

从一个特定文件中抓取一个数据单元的示例:

 =INDIRECT("'[C:\path\workbook.xls]MyWorksheet'!$A$2") 

冲洗并重复上述每个电子表格的每个单元格,你想得到。

你应该聪明的如何让string传递给INDIRECT()。 build立它作为一个公式,所以你可以使用字面上相同的公式,每个单元格,你需要检索。

例:

 = INDIRECT("'[" & $A2 & "]MyWorksheet'!$" & ADDRESS(3, COL())) 

上面的公式将转到其文件名在$ A2中的电子表格(注意缺less“2”之前的$,因此您可以将相同的公式粘贴到其他行的其他文件中),并获取MyWorksheet表单元格的值在第三行和当前列(所以,如果这是在你的汇总B2中,它从另一个文件中得到B3)。

调整ADDRESS函数以将偏移量添加到所需的行和列。

上述解决scheme的优点是可以将相同的公式复制并粘贴到需要填充的行和列中,Excel将根据需要调整$ A2和COL()。 非常可维护。

编辑一次,我有类似的情况,我无法一次加载所有的电子表格(超过200)。 我想我最终写了VBA,所以实际上并没有打开并读取Excel文件。 相反,我让它循环遍历文件名,打开每个ODBC连接,并使用ADO从指定的命名范围中读取所需的值(在ODBC中显示为“表” – 工作表也显示为“表“但是有关允许的名称的规则)。 这比打开和closuresExcel文件要快得多,并且具有不会使Excel崩溃的优点。

你试过了吗

 Tools->Macro->Record New Macro 

创造maco做同样的事情

罗德里戈,

我猜你的意思是100多个工作簿,你需要单独打开并复制并粘贴到一个? 听起来很好玩 :)

如果你可以把它们放在一个目录中,打开每个文件是相当容易的,首先要进行search。 (@Mark Biek为你举了一个很好的例子)

一旦你打开了一个文件,然后我将数据复制到一个ADOlogging集,然后你将追加到。 我已经发布了一些代码,用于在一个工作簿中合并多个工作表。

这不完全是你所需要的,但它应该有所帮助。 如果没有,发布多远,我会在这个星期再看一次。

这可以通过在Access中使用TransferSpreadsheet来实现。 看到这个链接:

http://datapigtechnologies.com/blog/index.php/using-access-to-combine-multiple-excel-files-method-2/comment-page-1/#comment-1741

这个解决scheme不需要任何VBA。

在过去,我使用VBA来创build外部参考(链接)。

我在这里发布了它(见例2):

Excel VBA的最佳简短例子

这与使用INDIRECT类似,但不需要打开excel工作簿。

唯一的缺点是,旧的电脑或旧版本的Excel,不知道哪个,可以使这个过程缓慢。 我相信这是因为每次添加一个新的外部引用时,所有其他的外部引用都会被更新。 为了使它更快,我将“计算”设置为“手动”,添加了外部参照,并将“计算”设置为“自动”以更新它们。

之后,如果您只需要这些值,则可以使用“中断链接”或“复制并粘贴特殊值”。