Код для циклического просмотра всех файлов Excel в указанной папке и извлечения данных из определенных ячеек.

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

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

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

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

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


person Justin    schedule 01.05.2011    source источник
comment
Похоже, ты почти продвинулся с планированием. У вас есть конкретные вопросы по синтаксису или методам?   -  person jonsca    schedule 02.05.2011
comment
да ... просто синтаксис, используемый для достижения этого в целом. Как мне перебрать все файлы excel (xls или xlsx) в указанной папке?   -  person Justin    schedule 02.05.2011
comment
также как мне указать новую строку для данных, извлекаемых из «следующего» файла excel?   -  person Justin    schedule 02.05.2011
comment
Какая версия Excel нужна для работы? Например, подход Application.FileSearch не будет работать в 2007/10.   -  person Tim Williams    schedule 02.05.2011
comment
это как просмотреть все файлы в папке   -  person    schedule 03.10.2013


Ответы (5)


Сначала начните с этого запроса 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
person Phil.Wheeler    schedule 02.05.2011
comment
Кроме того, чтобы получить значение ячейки в VBScript, используйте CellValue = objXL.Cells(X, Y).Value, где X и Y — значения строки и столбца соответственно. - person Phil.Wheeler; 02.05.2011
comment
Этот ответ больше не действителен для версий Excel после 2003 года; по-видимому, Application.FileSearch устарел, начиная с Excel 2007. - person tbone; 28.03.2012
comment
я видел, что он обнаруживает ~$<filename>.xls что можно сделать, чтобы отфильтровать их? - person thesummersign; 12.04.2013
comment
Ну, условная логика кажется наиболее очевидным ответом. If Left(myFilenameString, 2) = ~$ Then... в противном случае, я думаю, вы можете получить свойства файла и проверить, есть ли что-то, что отличает этот файл резервной копии от исходного (не знаю навскидку). - person Phil.Wheeler; 15.04.2013

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

person Cheeso    schedule 02.05.2011

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

person Nilpo    schedule 02.05.2011

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

person Christopher J. Scharer    schedule 12.12.2014

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

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
person Rakesh kumar    schedule 15.09.2017