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

Jus*_*tin 11 vbscript excel vba loops

我有大约50个左右的Excel工作簿,我需要从中提取数据.我需要从特定单元格,特定工作表中获取数据并编译成一个数据集(最好是另一个excel工作簿).

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

因此,我需要从工作表("DataSource")中提取数据的xls或xlsx文件之一,我需要评估单元格(D4),如果它不为null,则从单元格(F4)中提取数据,然后放入进入编译数据集的新行.循环遍历上面提到的该文件夹中的所有Excel文件.

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

有人可以帮我弄这个吗?我正在寻找VBA,因为我对此更熟悉,但也对VBScript感兴趣(因为我试图深入研究并了解其中的差异).

Phi*_*ler 11

首先从这个谷歌查询开始,然后单击出现的第一个链接,它会带您到一篇文章,显示如何遍历文件夹中的一组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
Run Code Online (Sandbox Code Playgroud)

要获取工作簿的名称,您需要调整"在此处使用您的代码"中的代码wbResults.Name.如果它是您想要的文件名,请使用wbResults.FullName,它返回工作簿的名称,包括其在磁盘上的路径作为字符串.

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

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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不再适用于2003年以后的Excel版本; 显然,Application.FileSearch已从Excel 2007开始弃用. (4认同)
  • 另外,要获取VBScript中单元格的值,请使用`CellValue = objXL.Cells(X,Y).Value`,其中`X`和`Y`分别是行和列值. (2认同)

Che*_*eso 5

如果您愿意,我会在 VBScript 甚至 VB.NET 或 Powershell 中进行。

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

 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
Run Code Online (Sandbox Code Playgroud)

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

在 .NET 中获取文件列表很容易,只需调用System.IO.Directory.GetFiles(); 只需指定“*.xls”通配符。获得列表后,只需使用 for 循环遍历它,依次打开每个文件,然后对该文件进行查询,依此类推。

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


如果它是 VBScript 或 VB.NET,它可能会在 Excel 本身之外运行。您可以通过双击或从批处理文件或类似的文件来运行它。使用 VB.NET 的好处是你可以建立一个交互的图形表单——它可以显示一个进度条,跟踪你浏览了多少文件,状态更新,诸如此类。