循环遍历指定文件夹中所有excel文件的代码,以及从特定单元格中提取数据的代码

我有大约50个左右的Excel工作簿,我需要从中提取数据。 我需要从特定单元格,特定工作表中获取数据,并将其编译为一个数据集(最好放入另一个Excel工作簿)。

我正在寻找一些VBA,以便我可以将结果编译到我用来运行代码的工作簿中。

所以,我需要从工作表(“DataSource”)拉动数据的xls或xlsx文件之一,我需要评估单元格(D4),如果它不为空,然后从单元格(F4)拉数据,并把成一个新的行进入编译的数据集。 如上所述循环访问该文件夹中的所有Excel文件。

如果可能,我希望第一列中的第一个数据字段是从结果数据集中提取数据的文件的名称。

有人可以帮我弄这个吗? 我正在寻找VBA,因为我对此比较熟悉,但也对VBScript感兴趣(正如我试图深入了解这些差异)。

首先从这个谷歌查询开始,点击出现的第一个链接,它会显示如何迭代文件夹中的一组Excel文件。

Sub RunCodeOnAllXLSFiles() Dim lCount As Long Dim wbResults As Workbook Dim wbCodeBook As Workbook Application.ScreenUpdating = False Application.DisplayAlerts = False Application.EnableEvents = False On Error Resume Next Set wbCodeBook = ThisWorkbook With Application.FileSearch .NewSearch 'Change path to suit .LookIn = "C:\MyDocuments\TestResults" .FileType = msoFileTypeExcelWorkbooks 'Optional filter with wildcard '.Filename = "Book*.xls" If .Execute > 0 Then 'Workbooks in folder For lCount = 1 To .FoundFiles.Count 'Loop through all 'Open Workbook x and Set a Workbook variable to it Set wbResults = Workbooks.Open(Filename:=.FoundFiles(lCount), UpdateLinks:=0) 'DO YOUR CODE HERE wbResults.Close SaveChanges:=False Next lCount End If End With On Error GoTo 0 Application.ScreenUpdating = True Application.DisplayAlerts = True Application.EnableEvents = True End Sub 

要获取工作簿的名称,您需要在“在此处input您的代码”来wbResults.Name代码以包含wbResults.Name 。 如果它是你想要的文件名,使用wbResults.FullName ,它返回工作簿的名字,包括它在磁盘上的path作为string。

在同一事物上searchVBScript变体会产生许多有用的结果,包括此脚本:

 strPath = "C:\PATH_TO_YOUR_FOLDER" Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True objExcel.DisplayAlerts = False Set objFso = CreateObject("Scripting.FileSystemObject") Set objFolder = objFso.GetFolder (strPath) For Each objFile In objFolder.Files If objFso.GetExtensionName (objFile.Path) = "xls" Then Set objWorkbook = objExcel.Workbooks.Open(objFile.Path) ' Include your code to work with the Excel object here objWorkbook.Close True 'Save changes End If Next objExcel.Quit 

如果你觉得这么做的话,我会在VBScript甚至VB.NET或PowerShell中做。

使用VB.NET,您可以通过OLEDB提供程序访问Excel电子表格,就好像它们是数据库一样。 select一系列值的代码可能如下所示:

  Try Dim MyConnection As System.Data.OleDb.OleDbConnection Dim DtSet As System.Data.DataSet Dim MyCommand As System.Data.OleDb.OleDbDataAdapter MyConnection = New System.Data.OleDb.OleDbConnection _ ("provider=Microsoft.Jet.OLEDB.4.0;" _ " Data Source='testfile.xls'; " _ "Extended Properties=Excel 8.0;") MyCommand = New System.Data.OleDb.OleDbDataAdapter _ ("select * from [Sheet1$]", MyConnection) MyCommand.TableMappings.Add("Table", "TestTable") DtSet = New System.Data.DataSet MyCommand.Fill(DtSet) MyConnection.Close() Catch ex As Exception MsgBox(ex.ToString) End Try 

一旦获得数据,您可以详细说明,然后将结果插入到另一个Excel电子表格中,使用相同的API。

在.NET中调用System.IO.Directory.GetFiles()可以轻松获取文件列表。 只需指定“* .xls”通配符。 一旦你有了列表,只需使用for循环遍历它,依次打开每个文件,然后对该文件执行查询,依此类推。

如果您使用VBScript,那么获取Excel文件列表的首选方法是使用Scripting.FileSystemObject ,特别是GetFolder方法 。 它的工作方式基本相同,但语法略有不同。


如果是VBScript或VB.NET,它可能会运行在Excel之外。 你可以通过双击或从batch file或类似的东西运行它。 使用VB.NET的好处是你可以build立一个交互的graphics化表单 – 它可以显示一个进度条,跟踪你已经经历了多less文件,状态更新,这样的事情。

无论何时您连续访问多个Excel文件,通常可以使用ADODB而不是Excel的自动化对象获得更好的性能。

我同意使用访问Excel对象不是最快的,如果您试图从中检索数据的工作簿和工作表都是一致的(即具有相同的列名等…或至less是列名重新寻找)使用ODBC会更好。 这确实有一些问题,如果你无法绕过它们,或者需要根据内容做一些更复杂的事情,那么可能是没有办法的。 如果是这样的话,我会build议创build一个Excel对象,然后根据需要打开和closures文件,以提高效率。

可以用下面的代码来完成

 Sub LoopThroughFiles() Dim StrFile As String StrFile = Dir("V:\XX\XXX\*.xlsx") Do While Len(StrFile) > 0 Debug.Print StrFile Set wbResults = Workbooks.Open("V:\XX\XXX\" & StrFile) 'DO YOUR CODE HERE wbResults.Close SaveChanges:=True StrFile = Dir Loop End Sub