Код для циклического просмотра всех файлов Excel в указанной папке и извлечения данных из определенных ячеек - PullRequest
11 голосов
/ 02 мая 2011

У меня есть около 50 книг Excel, из которых мне нужно получить данные.Мне нужно взять данные из определенных ячеек, определенных рабочих таблиц и скомпилировать их в один набор данных (желательно в другую рабочую книгу Excel).

Я ищу какой-то VBA, чтобы я мог скомпилировать результаты в рабочую книгу, которую я использую длязапустить код.

Итак, один из файлов xls или xlsx, из которого мне нужно извлечь данные, с рабочего листа («DataSource»), мне нужно оценить ячейку (D4), и если она не равна нулю, то извлечь данные из ячейки(F4) и вставьте новую строку в скомпилированный набор данных.Циклически просматривая все файлы Excel в этой папке, как указано выше.

И, если возможно, я бы хотел, чтобы первое поле данных в первом столбце имело имя файла, из которого извлекаются данные, в результирующем наборе данных.

Может кто-нибудь помочь мне с этим?Я ищу VBA, потому что я более знаком с этим, но также интересуюсь VBScript (поскольку я пытаюсь вникнуть в это и изучить различия).

Ответы [ 5 ]

11 голосов
/ 02 мая 2011

Сначала начните с этого запроса 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
4 голосов
/ 02 мая 2011

Я бы сделал это в VBScript или даже в VB.NET или Powershell, если вы так склонны.

Используя VB.NET, вы можете получать доступ к электронным таблицам Excel, как если бы они были базами данных, через поставщика OLEDB.Код для выбора диапазона значений может выглядеть следующим образом:

 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.Вы бы запустили его, дважды щелкнув, или из командного файла, или что-то в этом роде.Преимущество использования VB.NET заключается в том, что вы можете создать графическую форму для взаимодействия - она ​​может отображать индикатор выполнения, отслеживая, сколько файлов вы прошли, обновления статуса и тому подобное.

1 голос
/ 02 мая 2011

Всякий раз, когда вы получаете доступ к такому количеству файлов Excel подряд, вы, как правило, можете повысить производительность, используя ADODB, а не объект автоматизации Excel.

0 голосов
/ 15 сентября 2017

Это можно сделать с помощью следующего кода

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
0 голосов
/ 12 декабря 2014

Я согласен с тем, что доступ к объекту Excel не самый быстрый, и если все рабочие книги и листы, из которых вы пытаетесь извлечь данные, являются непротиворечивыми (т.е. имеют одинаковые имена столбцов и т. Д.) Или, по крайней мере, имена столбцов, которые вы ищете) было бы лучше использовать ODBC. У этого есть некоторые проблемы, и если вы не можете обойти их или вам нужно сделать что-то более сложное на основе содержимого, то, возможно, не будет никакого решения. В таком случае я бы предложил создать один объект Excel, а затем, при необходимости, открывать и закрывать файлы, чтобы повысить эффективность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...