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

发布于 2024-11-04 06:34:47 字数 396 浏览 0 评论 0原文

我有大约 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

流年里的时光 2024-11-11 06:34:47

首先从此 Google 查询开始,然后点击第一个链接出现,它会将您带到一篇文章,展示如何迭代一组文件夹中的 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

要获取工作簿的名称,您需要调整“在此处执行您的代码”中的代码以包含 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

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.

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

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, use wbResults.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:

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
箜明 2024-11-11 06:34:47

如果您愿意的话,我会用 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

获取数据后,您可以对其进行详细说明,然后使用相同的 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 :

 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

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.

触ぅ动初心 2024-11-11 06:34:47

每当您连续访问许多 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.

待天淡蓝洁白时 2024-11-11 06:34:47

我同意使用访问 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.

○闲身 2024-11-11 06:34:47

可以用下面的代码来完成

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

It could be done with the following code

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文