Vba excel перебор папок

Хитрости »

20 Июль 2012              137516 просмотров


Просмотреть все файлы в папке

Иногда необходимо проделать однотипные операции с несколькими файлами, расположенными в одной папке. Можно открывать каждый по очереди:
Workbooks.Open «C:Новая папкаКнига1.xlsx»
Workbooks.Open «C:Новая папкаКнига2.xlsx»
и т.д.
Но если файлов много и все с разными именами, то это не очень практично и совсем лишено гибкости. При помощи Visual Basic for Application можно решить проблему. При этом файлы можно просматривать как в одной папке, так и включая вложенные «подпапки».

  • Все файлы в папке
  • Все файлы включая подпапки
  • Просмотреть все диски

 
Все файлы в папке

Ниже приведен код, который перебирает все файлы в папке, открывает их и на первом листе каждого файла записывает текст

«www.excel-vba.ru»

в ячейку

A1

:

Sub Get_All_File_from_Folder()
    Dim sFolder As String, sFiles As String
    Dim wb As Workbook
    'диалог запроса выбора папки с файлами
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    'отключаем обновление экрана, чтобы наши действия не мелькали
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & "*.xls*")
    Do While sFiles <> ""
        'открываем книгу
        Set wb = Application.Workbooks.Open(sFolder & sFiles)
        'действия с файлом
        'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru
        wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
        'Закрываем книгу с сохранением изменений
        wb.Close True 'если поставить False - книга будет закрыта без сохранения
        sFiles = Dir
    Loop
    'возвращаем ранее отключенное обновление экрана
    Application.ScreenUpdating = True
End Sub

sFiles = Dir(sFolder & «*.xls*») — Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё — «*.xls», то будут просмотрены только файлы с расширением xls, а если указать xlsx — то файлы с расширением xlsx и никакие другие.
Если хотите перебрать файлы других форматов, а не Excel, то просто замените «*.xls» на нужное расширение. Например «*.doc». Также, если хотите собрать только файлы с определенными символами/словами в имени, то можно указать так: sFiles = Dir(sFolder & «*отчет*.xls*»). Будут просмотрены все файлы, содержащие в имени слово «отчет»(например «отчет за июнь.xls», «отчет за июль.xls», «сводный отчет.xls» и т.п.).


 
Все файлы включая подпапки

В коде выше есть одна проблема: что если необходимо открыть файлы не только в указанной папке, но и во всех её подпапках? В версиях Excel 2003 и младше это решалось с помощью метода

.FileSearch

, но в старших версиях данный метод по каким-то причинам был заблокирован разработчиками Microsoft. И осталось действовать только через рекурсивный метод перебора папок. Ниже приведен код, который открывает все файлы Excel в указанной папке, включая все подпапки.
Для этого используется встроенная в офис библиотека

File System Object

:

Option Explicit
 
Dim objFSO As Object, objFolder As Object, objFile As Object
 
Sub Get_All_File_from_SubFolders()
    Dim sFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    Application.ScreenUpdating = False
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    GetSubFolders sFolder
    Set objFolder = Nothing
    Set objFSO = Nothing
    Application.ScreenUpdating = True
End Sub
Private Sub GetSubFolders(sPath)
    Dim sPathSeparator As String, sObjName As String
    Dim wb As Workbook
    Set objFolder = objFSO.GetFolder(sPath)
    For Each objFile In objFolder.Files
        If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then
            'открываем книгу
            Set wb = Application.Workbooks.Open(sPath & objFile.Name)
            'действия с файлом
            'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru
            wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
            wb.Close True 'wb.Close False '- если в коде надо будет закрывать книгу без сохранения
        End If
    Next
    For Each objFolder In objFolder.SubFolders
        GetSubFolders objFolder.Path & Application.PathSeparator
    Next
End Sub

Код делает тоже самое, что и первый, но открывает и изменяет ячейку A1 первого листа для всех файлов Excel в выбранной папке и всех её подпапках(включая все вложенные до последнего уровня).

If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then

Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё — «*.xls», то будут просмотрены только файлы с расширением xls, а если указать xlsx — то файлы с расширением xlsx и никакие другие.
Если добавить условие: If objFSO.GetBaseName(objFile) Like «*книга*» Then
то будут обработаны файлы, которые в имени содержат слово «книга». При этом регистр букв имеет значение. Т.е. если файл содержит в имени слово «Книга», то он не будет обработан.
Думаю теперь Вы легко сможете проделать необходимые операции с множеством файлов.

Скачать пример:

  Все файлы в папке и подпапках.xls (61,5 KiB, 8 202 скачиваний)

В примере я закомментировал строки, открывающие файл и вносящие изменения в ячейку

A1

и заменил это созданием списка имен всех файлов в папках и подпапках. По окончании работы кода имена всех файлов записываются в столбец «А» нового листа(лист создается автоматически). Сделано для того, чтобы при тестировании кода случайно не повредить информацию в файлах.


 
Просмотреть все файлы на всех дисках

В последнее время участились вопросы как просмотреть еще и все диски на ПК. Ниже выкладываю код, который просматривает все подключенные диски и просматривает все файлы во всех папках дисков:

Sub Get_All_drives()
    Dim objDrives As Object, objDrive As Object
 
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objDrives = objFSO.Drives
    For Each objDrive In objDrives
        If objDrive.IsReady Then
            GetSubFolders objDrive.DriveLetter & ":"
        End If
    Next objDrive
End Sub

Для работы кода необходимо разместить его в том же модуле, что и код просмотра файлов в подпапках. Без него код просмотра дисков работать не будет, т.к. обращается к процедуре GetSubFolders(которая и приведена в коде перебора файлов в подпапках).
Скачать пример:

  Все файлы в папке и подпапках.xls (61,5 KiB, 8 202 скачиваний)

В примере код сканирует все диски и выводит в столбец А нового листа(лист создается автоматически) пути ко всем файлам.

Так же см.:
Как средствами VBA переименовать/переместить/скопировать файл
Как сменить формат сразу для нескольких файлов Excel
Как удалить папку или все файлы из папки через VBA
Собрать и просуммировать данные из разных файлов при помощи PowerQuery


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

The Dir function is the way to go, but the problem is that you cannot use the Dir function recursively, as stated here, towards the bottom.

The way that I’ve handled this is to use the Dir function to get all of the sub-folders for the target folder and load them into an array, then pass the array into a function that recurses.

Here’s a class that I wrote that accomplishes this, it includes the ability to search for filters. (You’ll have to forgive the Hungarian Notation, this was written when it was all the rage.)

Private m_asFilters() As String
Private m_asFiles As Variant
Private m_lNext As Long
Private m_lMax As Long

Public Function GetFileList(ByVal ParentDir As String, Optional ByVal sSearch As String, Optional ByVal Deep As Boolean = True) As Variant
    m_lNext = 0
    m_lMax = 0

    ReDim m_asFiles(0)
    If Len(sSearch) Then
        m_asFilters() = Split(sSearch, "|")
    Else
        ReDim m_asFilters(0)
    End If

    If Deep Then
        Call RecursiveAddFiles(ParentDir)
    Else
        Call AddFiles(ParentDir)
    End If

    If m_lNext Then
        ReDim Preserve m_asFiles(m_lNext - 1)
        GetFileList = m_asFiles
    End If

End Function

Private Sub RecursiveAddFiles(ByVal ParentDir As String)
    Dim asDirs() As String
    Dim l As Long
    On Error GoTo ErrRecursiveAddFiles
    'Add the files in 'this' directory!


    Call AddFiles(ParentDir)

    ReDim asDirs(-1 To -1)
    asDirs = GetDirList(ParentDir)
    For l = 0 To UBound(asDirs)
        Call RecursiveAddFiles(asDirs(l))
    Next l
    On Error GoTo 0
Exit Sub
ErrRecursiveAddFiles:
End Sub
Private Function GetDirList(ByVal ParentDir As String) As String()
    Dim sDir As String
    Dim asRet() As String
    Dim l As Long
    Dim lMax As Long

    If Right(ParentDir, 1) <> "" Then
        ParentDir = ParentDir & ""
    End If
    sDir = Dir(ParentDir, vbDirectory Or vbHidden Or vbSystem)
    Do While Len(sDir)
        If GetAttr(ParentDir & sDir) And vbDirectory Then
            If Not (sDir = "." Or sDir = "..") Then
                If l >= lMax Then
                    lMax = lMax + 10
                    ReDim Preserve asRet(lMax)
                End If
                asRet(l) = ParentDir & sDir
                l = l + 1
            End If
        End If
        sDir = Dir
    Loop
    If l Then
        ReDim Preserve asRet(l - 1)
        GetDirList = asRet()
    End If
End Function
Private Sub AddFiles(ByVal ParentDir As String)
    Dim sFile As String
    Dim l As Long

    If Right(ParentDir, 1) <> "" Then
        ParentDir = ParentDir & ""
    End If

    For l = 0 To UBound(m_asFilters)
        sFile = Dir(ParentDir & "" & m_asFilters(l), vbArchive Or vbHidden Or vbNormal Or vbReadOnly Or vbSystem)
        Do While Len(sFile)
            If Not (sFile = "." Or sFile = "..") Then
                If m_lNext >= m_lMax Then
                    m_lMax = m_lMax + 100
                    ReDim Preserve m_asFiles(m_lMax)
                End If
                m_asFiles(m_lNext) = ParentDir & sFile
                m_lNext = m_lNext + 1
            End If
            sFile = Dir
        Loop
    Next l
End Sub

i know the question was asked many times before, i have checked the previous suggestions but i couldn’t make my code run.

So, i have a folder called «Report» which contains multiple folders as well. These folders contains .xlsx and .zip files.

Each file contains also a folder called «2016» and under it 12 folders «January», «February»,…, «December».

Here is an example of one Subfolder
enter image description here

What i want to do is, to loop through all these subFolders and move the .xlsx and .zip files to the monthly folder based on createdDate.

For example, all .xlsx and .zip in a location created in November they will be moved to the folder «November» in «2016» in the same location.

I created this macro but it’s time consuming because everytime i need to change the path of each subfloder and run it for each subFolder.

Sub Move_Files_To_Folder()

Dim Fso As Object
Dim FromPath As String
Dim ToPath As String
Dim FileInFromFolder As Object

'Change Path
FromPath = "C:ReportShipment"
ToPath = "C:ReportShipment2016"

Set Fso = CreateObject("scripting.filesystemobject")

For Each FileInFromFolder In Fso.GetFolder(FromPath).Files

'Change month and year
If (Month(FileInFromFolder.DateCreated)) = 11 And (year(FileInFromFolder.DateCreated)) = 2016 _
And (InStr(1, FileInFromFolder.name, ".xlsx") Or InStr(1, FileInFromFolder.name, ".zip")) Then
FileInFromFolder.Move (ToPath & MonthName(Month(FileInFromFolder.DateCreated)) & "")
End If

Next FileInFromFolder

End Sub

I want to automate my macro so that it will work on all the subfolders Not one by one and changing the path everytime.
Any suggestions please ? Thank you very much.

Макрос VBA загрузки списка файлов из папки

Функция FilenamesCollection предназначена для получения списка файлов из папки, с учётом выбранной глубины поиска в подпапках.

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

К статье прикреплено 2 примера файла с макросами на основе этой функции:

  • Пример в файле FilenamesCollection.xls выводит список файлов на чистый лист новой книги (формируя заголовки) 
  • Пример в файле FilenamesCollectionEx.xls более функционален — он, помимо списка файлов из папки, отображает размер файла, и дату его создания, а также формирует в ячейках гиперссылки на найденные файлы.
    Вывод списка производится на лист запуска, параметры поиска файлов задаются в ячейках листа (см. скриншот)

Смотрите также расширенную версию макроса на базе этой функции:

Макрос FolderStructure выводит в таблицу Excel список файлов и подпапок с отображением структуры (вложенности файлов и подпапок)

ПРИМЕЧАНИЕ: Если вы выводите на лист список имен файлов картинок (изображений), то при помощи этой надстройки вы сможете вставить сами картинки в ячейки соседнего столбца (или в примечания к этим ячейкам)

Внимание: если требуется, чтобы поиск не зависел от регистра символов в маске файла
(к примеру, обнаруживались не только файлы .txt, но и .TXT и .Txt),
поставьте первой строкой в модуле директиву Option Compare Text

Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _
                             Optional ByVal SearchDeep As Long = 999) As Collection
    ' © EducatedFool  excelvba.ru/code/FilenamesCollection
    ' Получает в качестве параметра путь к папке FolderPath,
    ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением)
    ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются).
    ' Возвращает коллекцию, содержащую полные пути найденных файлов
    ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)

    Set FilenamesCollection = New Collection    ' создаём пустую коллекцию
    Set FSO = CreateObject("Scripting.FileSystemObject")    ' создаём экземпляр FileSystemObject
    GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск
    Set FSO = Nothing: Application.StatusBar = False    ' очистка строки состояния Excel
End Function
 
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
                                 ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
    ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO
    ' перебор папок осуществляется в том случае, если SearchDeep > 1
    ' добавляет пути найденных файлов в коллекцию FileNamesColl
    On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
    If Not curfold Is Nothing Then    ' если удалось получить доступ к папке

        ' раскомментируйте эту строку для вывода пути к просматриваемой
        ' в текущий момент папке в строку состояния Excel
        ' Application.StatusBar = "Поиск в папке: " & FolderPath

        For Each fil In curfold.Files    ' перебираем все файлы в папке FolderPath
            If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Path
        Next
        SearchDeep = SearchDeep - 1    ' уменьшаем глубину поиска в подпапках
        If SearchDeep Then    ' если надо искать глубже
            For Each sfol In curfold.SubFolders    ' перебираем все подпапки в папке FolderPath
                GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep
            Next
        End If
        Set fil = Nothing: Set curfold = Nothing    ' очищаем переменные
    End If
End Function

‘ Пример использования функции в макросе:

Sub ОбработкаФайловИзПапки()
    On Error Resume Next
    Dim folder$, coll As Collection
 
    folder$ = ThisWorkbook.Path & "Платежи"
    If Dir(folder$, vbDirectory) = "" Then
        MsgBox "Не найдена папка «" & folder$ & "»", vbCritical, "Нет папки ПЛАТЕЖИ"
        Exit Sub        ' выход, если папка не найдена
    End If
 
    Set coll = FilenamesCollection(folder$, "*.xls")        ' получаем список файлов XLS из папки
    If coll.Count = 0 Then
        MsgBox "В папке «" & Split(folder$, "")(UBound(Split(folder$, "")) - 1) & "» нет ни одного подходящего файла!", _
               vbCritical, "Файлы для обработки не найдены"
        Exit Sub        ' выход, если нет файлов
    End If
 
    ' перебираем все найденные файлы
    For Each file In coll
        Debug.Print file        ' выводим имя файла в окно Immediate
    Next
End Sub

Этот код позволяет осуществить поиск нужных файлов в выбранной папке (включая подпапки), и выводит полученный список файлов на лист книги Excel:

Sub ПримерИспользованияФункции_FilenamesCollection()
    ' Ищем на рабочем столе все файлы TXT, и выводим на лист список их имён.
    ' Просматриваются папки с глубиной вложения не более трёх.

    Dim coll As Collection, ПутьКПапке As String
    ' получаем путь к папке РАБОЧИЙ СТОЛ
    ПутьКПапке = CreateObject("WScript.Shell").SpecialFolders("Desktop")
    ' считываем в колекцию coll нужные имена файлов
    Set coll = FilenamesCollection(ПутьКПапке, ".txt", 3)
 
    Application.ScreenUpdating = False    ' отключаем обновление экрана
    ' создаём новую книгу
    Dim sh As Worksheet: Set sh = Workbooks.Add.Worksheets(1)
    ' формируем заголовки таблицы
    With sh.Range("a1").Resize(, 3)
        .Value = Array("№", "Имя файла", "Полный путь")
        .Font.Bold = True: .Interior.ColorIndex = 17
    End With
 
    ' выводим результаты на лист
    For i = 1 To coll.Count ' перебираем все элементы коллекции, содержащей пути к файлам
        sh.Range("a" & sh.Rows.Count).End(xlUp).Offset(1).Resize(, 3).Value = _
        Array(i, Dir(coll(i)), coll(i))    ' выводим на лист очередную строку
        DoEvents    ' временно передаём управление ОС
    Next
    sh.Range("a:c").EntireColumn.AutoFit    ' автоподбор ширины столбцов
    [a2].Activate: ActiveWindow.FreezePanes = True ' закрепляем первую строку листа
End Sub

Ещё один пример использования:

Sub ЗагрузкаСпискаФайлов()
    ' Ищем файлы в заданной папке по заданной маске,
    ' и выводим на лист список их параметров.
    ' Просматриваются папки с заданной глубиной вложения.

    Dim coll As Collection, ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%
 
    ПутьКПапке$ = [c1]    ' берём из ячейки c1
    МаскаПоиска$ = [c2]    ' берём из ячейки c2
    ГлубинаПоиска% = Val([c3])    ' берём из ячейки c3
    If ГлубинаПоиска% = 0 Then ГлубинаПоиска% = 999    ' без ограничения по глубине

    ' считываем в колекцию coll нужные имена файлов
    Set coll = FilenamesCollection(ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%)
 
    Application.ScreenUpdating = False    ' отключаем обновление экрана

    ' выводим результаты (список файлов, и их характеристик) на лист
    For i = 1 To coll.Count    ' перебираем все элементы коллекции, содержащей пути к файлам

        НомерФайла = i
        ПутьКФайлу = coll(i)
        ИмяФайла = Dir(ПутьКФайлу)
        ДатаСоздания = FileDateTime(ПутьКФайлу)
        РазмерФайла = FileLen(ПутьКФайлу)
 
        ' выводим на лист очередную строку
        Range("a" & Rows.Count).End(xlUp).Offset(1).Resize(, 5).Value = _
        Array(НомерФайла, ИмяФайла, ПутьКФайлу, ДатаСоздания, РазмерФайла)
 
        ' если нужна гиперссылка на файл во втором столбце
        ActiveSheet.Hyperlinks.Add Range("b" & Rows.Count).End(xlUp), ПутьКФайлу, "", _
                                   "Открыть файл" & vbNewLine & ИмяФайла
 
        DoEvents    ' временно передаём управление ОС
    Next
End Sub

PS: Найти подходящие имена файлов в коллекции можно при помощи следующей функции:

Function CollectionAutofilter(ByRef coll As Collection, ByVal filter$) As Collection
    ' Функция перебирает все элементы коллекции coll,
    ' оставляя лишь те, которые соответствуют маске filter$ (например, filter$="*некий текст*")
    ' Возвращает коллекцию, содержащую только подходящие элементы
    ' Если элементы не найдены - возвращается пустая коллекция (содержащая 0 элементов)
    On Error Resume Next: Set CollectionAutofilter = New Collection
    For Each Item In coll
        If Item Like filter$ Then CollectionAutofilter.Add Item
    Next
End Function
  • 301787 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

 

sergey2303

Пользователь

Сообщений: 350
Регистрация: 07.04.2015

#1

02.12.2020 13:07:18

Добрий день!

Есть макрос которий перебирая только файли в папке C:TMP1 , удаляет  дубли в файле, а нужно еще перебирать и в подпапках, напимер  C:TMP1Test
Подправте макрос для перебора в подпапках паки C:TMP1

Код
Sub uble_rem2()
   Dim Папка$, Имя$
   Dim wb As Workbook
   Dim smallrng As Range
   Dim WS_Count As Integer
   Dim lRow As Long
Dim T As Integer
 
   Application.ScreenUpdating = False
  
   Папка = "C:TMP1" & ""
   
      Имя = Dir(Папка & "*.xls")
      
   Do While Имя <> ""
   file = Папка & Имя
   Workbooks.Open file, ReadOnly:=False, IgnoreReadOnlyRecommended:=True, UpdateLinks:=True
 WS_Count = ActiveWorkbook.Worksheets.Count
lRow = Cells(Rows.Count, 1).End(xlUp).Row
Range("A5:Z" & lRow).RemoveDuplicates Array(1, 2, 26)
 
wb.Sheets(1).Activate
    ActiveWorkbook.Save
    ActiveWorkbook.Close
      Имя = Dir
   Loop
   Application.ScreenUpdating = True
End Sub
 

Дмитрий(The_Prist) Щербаков

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#2

02.12.2020 13:31:00

Цитата
sergey2303 написал:
Подправте макрос

Там не подправлять надо, а переписывать. Вот алгоритм, пробуйте адаптировать:

Просмотреть все файлы в папке

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

sergey2303

Пользователь

Сообщений: 350
Регистрация: 07.04.2015

#3

02.12.2020 13:50:17

подскажите, а почему ошибка
object required (error 424)
на строке

Код
Set objFolder = objFSO.GetFolder(sPath)
 

посмотрите что находится в переменной sPath
убедитесь, что записанный там путь доспупен на вашем компьютере
а еще
убедитесь, что objFSO not is Nothing

Изменено: Ігор Гончаренко02.12.2020 13:57:40

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

МатросНаЗебре

Пользователь

Сообщений: 5516
Регистрация: 05.02.2014

#5

02.12.2020 14:14:09

Код
Sub ruble()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim Папка As String
    Папка = "C:TMP1" & ""
    
    uble_rem2 Папка
    
End Sub
'
Sub uble_rem2(ByVal Папка As String)
    Dim Имя$
    Dim wb As Workbook
    Dim smallrng As Range
    Dim WS_Count As Integer
    Dim lRow As Long
    Dim T As Integer
    Dim sfile As String
  
   Application.ScreenUpdating = False
   
   'Папка = "C:TMP1" & ""
    
      Имя = Dir(Папка & "*.xls")
       
   Do While Имя <> ""
        sfile = Папка & Имя
        Workbooks.Open sfile, ReadOnly:=False, IgnoreReadOnlyRecommended:=True, UpdateLinks:=True
        WS_Count = ActiveWorkbook.Worksheets.Count
        lRow = Cells(Rows.Count, 1).End(xlUp).Row
        Range("A5:Z" & lRow).RemoveDuplicates Array(1, 2, 26)
        
        wb.Sheets(1).Activate
        ActiveWorkbook.Save
        ActiveWorkbook.Close
        Имя = Dir
   Loop
   
    Dim vSubFolder As Variant
    For Each vSubFolder In fso.getFolder(Папка).SubFolders
        uble_rem2 vSubFolder
    Next
   
   Application.ScreenUpdating = True
End Sub

Файла не было -> не тестировал.

 

sergey2303

Пользователь

Сообщений: 350
Регистрация: 07.04.2015

#6

02.12.2020 15:01:29

ошибка

Цитата
object required (error 424)

на строке

Код
For Each vSubFolder In fso.getFolder(Папка).SubFolders

тут, пусто

Код
Имя = Dir(Папка & "*.xls")
 

МатросНаЗебре

Пользователь

Сообщений: 5516
Регистрация: 05.02.2014

#7

02.12.2020 15:18:06

Код
Dim fso As Object
'
Sub ruble()
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    Dim Папка As String
    Папка = "C:TMP1" & ""
     
    uble_rem2 Папка
     
End Sub
'
Sub uble_rem2(ByVal Папка As String)
    Dim Имя$
    Dim wb As Workbook
    Dim smallrng As Range
    Dim WS_Count As Integer
    Dim lRow As Long
    Dim T As Integer
    Dim sfile As String
   
   Application.ScreenUpdating = False
    
   'Папка = "C:TMP1" & ""
   Папка = fso.GetFolder(Папка).Path & ""
     
      Имя = Dir(Папка & "*.xls")
        
   Do While Имя <> ""
        sfile = Папка & Имя
        Workbooks.Open sfile, ReadOnly:=False, IgnoreReadOnlyRecommended:=True, UpdateLinks:=True
        WS_Count = ActiveWorkbook.Worksheets.Count
        lRow = Cells(Rows.Count, 1).End(xlUp).Row
        Range("A5:Z" & lRow).RemoveDuplicates Array(1, 2, 26)

        wb.Sheets(1).Activate
        ActiveWorkbook.Save
        ActiveWorkbook.Close
        Имя = Dir
   Loop
    
    Dim vSubFolder As Variant
    For Each vSubFolder In fso.GetFolder(Папка).SubFolders
        uble_rem2 vSubFolder
    Next
    
   Application.ScreenUpdating = True
End Sub

Тогда так.

Изменено: МатросНаЗебре02.12.2020 15:20:03

 

sergey2303

Пользователь

Сообщений: 350
Регистрация: 07.04.2015

#8

02.12.2020 15:26:38

Цитата
МатросНаЗебре написал:
Тогда так.

ошибка
object required (error 424)
на строке
Папка = fso.GetFolder(Папка).Path & «»

 

Внёс изменения в код в #7.

 

ошибка осталась
object required (error 424)
на строке
Папка = fso.GetFolder(Папка).Path & «»

 

МатросНаЗебре

Пользователь

Сообщений: 5516
Регистрация: 05.02.2014

#11

02.12.2020 15:48:44

Код
Dim fso As Object
Sub ruble()
    
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    Dim Папка As String
    Папка = "C:TMP21" & ""
     
    uble_rem2 Папка
     
End Sub
Sub uble_rem2(ByVal Папка As String)
    Dim Имя$
    Dim wb As Workbook
    Dim smallrng As Range
    Dim WS_Count As Integer
    Dim lRow As Long
    Dim T As Integer
    Dim sfile As String
   
   Application.ScreenUpdating = False
    
   'Папка = "C:TMP1" & ""
   If fso.folderexists(Папка) Then
   Папка = fso.GetFolder(Папка).Path & ""
     
      Имя = Dir(Папка & "*.xls")
        
   Do While Имя <> ""
        sfile = Папка & Имя
        Workbooks.Open sfile, ReadOnly:=False, IgnoreReadOnlyRecommended:=True, UpdateLinks:=True
        WS_Count = ActiveWorkbook.Worksheets.Count
        lRow = Cells(Rows.Count, 1).End(xlUp).Row
        Range("A5:Z" & lRow).RemoveDuplicates Array(1, 2, 26)        wb.Sheets(1).Activate
        ActiveWorkbook.Save
        ActiveWorkbook.Close
        Имя = Dir
   Loop
    
    Dim vSubFolder As Variant
    For Each vSubFolder In fso.GetFolder(Папка).SubFolders
        uble_rem2 vSubFolder
    Next
    Else
        MsgBox "Не нашёл папку " & vbCrLf & Папка, vbInformation
    End If
    
   Application.ScreenUpdating = True
End Sub

Скопировать нужно весь код от начала до конца. Недостаточно заменить одну процедуру.

 

sergey2303

Пользователь

Сообщений: 350
Регистрация: 07.04.2015

#12

02.12.2020 15:55:34

ошибка осталась

Цитата
object required (error 424)

на строке

Код
If fso.folderexists(Папка) Then
 

МатросНаЗебре

Пользователь

Сообщений: 5516
Регистрация: 05.02.2014

#13

02.12.2020 16:12:18

Код
Sub ruble()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    Dim Папка As String
    Папка = "C:TMP1" & ""
     
    uble_rem2 Папка
     
End Sub
Sub uble_rem2(ByVal Папка As String)
    Dim Имя$
    Dim wb As Workbook
    Dim smallrng As Range
    Dim WS_Count As Integer
    Dim lRow As Long
    Dim T As Integer
    Dim sfile As String
   
   Application.ScreenUpdating = False
    
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
   'Папка = "C:TMP1" & ""
   If fso.folderexists(Папка) Then
   Папка = fso.GetFolder(Папка).Path & ""
     
      Имя = Dir(Папка & "*.xls")
        
   Do While Имя <> ""
        sfile = Папка & Имя
        Workbooks.Open sfile, ReadOnly:=False, IgnoreReadOnlyRecommended:=True, UpdateLinks:=True
        WS_Count = ActiveWorkbook.Worksheets.Count
        lRow = Cells(Rows.Count, 1).End(xlUp).Row
        Range("A5:Z" & lRow).RemoveDuplicates Array(1, 2, 26)        wb.Sheets(1).Activate
        ActiveWorkbook.Save
        ActiveWorkbook.Close
        Имя = Dir
   Loop
    
    Dim vSubFolder As Variant
    For Each vSubFolder In fso.GetFolder(Папка).SubFolders
        uble_rem2 vSubFolder
    Next
    Else
        MsgBox "Не нашёл папку " & vbCrLf & Папка, vbInformation
    End If
    
   Application.ScreenUpdating = True
End Sub

А так?

 
 

МатросНаЗебре

Пользователь

Сообщений: 5516
Регистрация: 05.02.2014

#15

03.12.2020 09:23:20

Предположу, не срабатывало потому, что процедуры помещались в разные модули.
Ниже приведён код, приспособленный для работы в разных модулях, улучшенный в части создания объекта файловой системы.

Код
Public fso As Object

Sub ruble()
    Set fso = CreateObject("Scripting.FileSystemObject")
      
    Dim Папка As String
    Папка = "C:TMP1" & ""
      
    uble_rem2 Папка
      
End Sub
Sub uble_rem2(ByVal Папка As String)
    Dim Имя$
    Dim wb As Workbook
    Dim smallrng As Range
    Dim WS_Count As Integer
    Dim lRow As Long
    Dim T As Integer
    Dim sfile As String
    
   Application.ScreenUpdating = False
     
    'Dim fso As Object
    'Set fso = CreateObject("Scripting.FileSystemObject")
     
   'Папка = "C:TMP1" & ""
   If fso.folderexists(Папка) Then
   Папка = fso.GetFolder(Папка).Path & ""
      
      Имя = Dir(Папка & "*.xls")
         
   Do While Имя <> ""
        sfile = Папка & Имя
        Workbooks.Open sfile, ReadOnly:=False, IgnoreReadOnlyRecommended:=True, UpdateLinks:=True
        WS_Count = ActiveWorkbook.Worksheets.Count
        lRow = Cells(Rows.Count, 1).End(xlUp).Row
        Range("A5:Z" & lRow).RemoveDuplicates Array(1, 2, 26)        wb.Sheets(1).Activate
        ActiveWorkbook.Save
        ActiveWorkbook.Close
        Имя = Dir
   Loop
     
    Dim vSubFolder As Variant
    For Each vSubFolder In fso.GetFolder(Папка).SubFolders
        uble_rem2 vSubFolder
    Next
    Else
        MsgBox "Не нашёл папку " & vbCrLf & Папка, vbInformation
    End If
     
   Application.ScreenUpdating = True
End Sub

 

sergey2303

Пользователь

Сообщений: 350
Регистрация: 07.04.2015

#16

10.12.2020 15:35:40

Цитата
МатросНаЗебре написал:
Предположу, не срабатывало потому, что процедуры помещались в разные модули.Ниже приведён код, приспособленный для работы в разных модулях, улучшенный в части создания объекта файловой системы.

Подскажите, а в это код(пост

#15

) возможно добавить поиск файла начиная с даты создания, т.е нужно обработать фалы с определенной даты создания

Изменено: sergey230310.12.2020 16:34:57

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#17

10.12.2020 16:28:10

sergey2303, кнопка цитирования не для «вижу, жму, банан получу»… Исправьте сообщение. Если цитирование нужно, то из бездумной копии сделайте ЦИТАТУ

Like this post? Please share to your friends:
  • Vba excel переменные на всю форму
  • Vba excel перебор массива
  • Vba excel переменные массивы переменных
  • Vba excel перебор всех ячеек
  • Vba excel переменные в одну строку