Страницы: 1
RSS
Перебор файлов в подпапках
 
Добрий день!

Есть макрос которий перебирая только файли в папке C:\TMP1 , удаляет  дубли в файле, а нужно еще перебирать и в подпапках, напимер  C:\TMP1\Test
Подправте макрос для перебора в подпапках паки 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
 
Цитата
sergey2303 написал:
Подправте макрос
Там не подправлять надо, а переписывать. Вот алгоритм, пробуйте адаптировать: Просмотреть все файлы в папке
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
подскажите, а почему ошибка
object required (error 424)
на строке
Код
Set objFolder = objFSO.GetFolder(sPath)
 
посмотрите что находится в переменной sPath
убедитесь, что записанный там путь доспупен на вашем компьютере
а еще
убедитесь, что objFSO not is Nothing
Изменено: Ігор Гончаренко - 02.12.2020 13:57:40
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
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
Файла не было -> не тестировал.
 
ошибка
Цитата
object required (error 424)
на строке
Код
For Each vSubFolder In fso.getFolder(Папка).SubFolders

тут, пусто
Код
Имя = Dir(Папка & "*.xls")
 
Код
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
 
Цитата
МатросНаЗебре написал:
Тогда так.
ошибка
object required (error 424)
на строке
Папка = fso.GetFolder(Папка).Path & "\"
 
Внёс изменения в код в #7.
 
ошибка осталась
object required (error 424)
на строке
Папка = fso.GetFolder(Папка).Path & "\"
 
Код
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
Скопировать нужно весь код от начала до конца. Недостаточно заменить одну процедуру.
 
ошибка осталась
Цитата
object required (error 424)
на строке
Код
If fso.folderexists(Папка) Then
 
Код
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
А так?
 
Так работает
Спасибо
 
Предположу, не срабатывало потому, что процедуры помещались в разные модули.
Ниже приведён код, приспособленный для работы в разных модулях, улучшенный в части создания объекта файловой системы.
Код
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

 
Цитата
МатросНаЗебре написал:
Предположу, не срабатывало потому, что процедуры помещались в разные модули.Ниже приведён код, приспособленный для работы в разных модулях, улучшенный в части создания объекта файловой системы.
Подскажите, а в это код(пост #15) возможно добавить поиск файла начиная с даты создания, т.е нужно обработать фалы с определенной даты создания
Изменено: sergey2303 - 10.12.2020 16:34:57
 
sergey2303, кнопка цитирования не для "вижу, жму, банан получу"... Исправьте сообщение. Если цитирование нужно, то из бездумной копии сделайте ЦИТАТУ
Страницы: 1
Наверх