Страницы: 1
RSS
Одинаковые действия с множеством файлов xlsx
 
Добрый день, уважаемые форумчане!
Есть множество файлов (около 25 таблиц xlsx), абсолютно одинаковых по структуре, но разные по наполнению.
Раз в неделю требуется открыть каждый файл, в ячейке A1 вбить текущую дату и диапазон ячеек O6:AB300 залить определенным цветом.
Вручную это несколько утомительно и отнимает много времени.
Думаю как бы это автоматизировать, не используя в этих файлах макросы, так как эти файлы присылают с разных мест и на удаленных компьютерах не факт что разрешены макросы.
Изменено: vikttur - 13.07.2021 12:45:35
 
Цитата
Александр Иванов написал:
не используя в этих файлах макросы
а в этих файлах макросы и не нужны - нужен один отдельный файл с макросом, который переберет все файлы и сделает нужные действия. Можно их кидать в определенную папку и код там их сам все обработает или выбирать нужные файлы через диалоговое окно. Выбирайте на вкус:
Просмотреть все файлы в папке
Диалоговое окно выбора файлов/папки
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков,Идеально! Отличное решение. Странно, почему  я раньше сам не нашел.
Спасибо!
 
Информация для интересующихся подобным.
В итоге у меня работает следующий макрос:

Код
' Purpose   : http://www.excel-vba.ru/chto-umeet-excel/prosmotret-vse-fajly-v-papke/
'---------------------------------------------------------------------------------------
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 - текущая дата
            wb.Sheets(1).Range("A1").Value = Format(Now, "dd.mm.yyyy")
            'Меняем цвет ячеек A4:D8
            Range("A4:D8").Interior.Color = RGB(100, 150, 250)
            'Ставим пароль на текущий лист каждого файла 123
            wb.Sheets(1).Protect "123"
            wb.Close True
        End If
    Next
    For Each objFolder In objFolder.SubFolders
        GetSubFolders objFolder.Path & Application.PathSeparator
    Next
End Sub
Я запускаю его из специально созданного файла (который находится в любой другой папке), макрос спрашивает путь к папке, в которой лежат изменяемые файлы, потом в каждый файл добавляет в ячейку A1 текущую дату, закрашивает диапазон ячеек A4:D8 и ставит пароль на лист 123.

А как бы сделать отдельный макрос, который предварительно со всех этих файлов в файл с макросом вытащил бы текущее значение ячеек А1 и название соответствующего файла в столбик?

Например, есть таблицы:
файл1 (в ячейке А1 стоит дата 01.01.2021)
файл2 (в ячейке А1 стоит дата 01.05.2021)файл3 (в ячейке А1 стоит дата 01.06.2021)

Файл с макросом. При запуске макроса в этой таблице заполняются данные:
А1 - 01.01.2021 В1 - файл1
А2 - 01.05.2021 В2 - файл2
А3 - 01.06.2021 В3 - файл3

Подскажите, пожалуйста решение?
Рекордером не получилось изобразить, так как он пишет действия с конкретными файлами, а не со всеми файлами из указанной папки.
 
Александр Иванов, на основе макроса:
Код
Private Sub GetSubFolders(sPath)
сделайте его копию (назовите как Вам угодно) и модифицируйте его следующим образом:
0) после "'действия с файлом" удалите строки с 30 по 35 включительно (строки указаны относительно кода в Вашем сообщении);
1) добавьте переменную:
Код
Dim lCounter As Long: lCounter = 0

2) после "'действия с файлом" добавьте следующий код:
Код
    With ThisWorkbook.Worksheets("ИМЯ_ЛИСТА_КУДА_СОБИРАТЬ_ДАННЫЕ_НАПИШИТЕ_ТУТ_СВОЁ").Range("A1")
        .Offset(lCounter).Value = wb.Sheets(1).Range("A1").Value
        .Offset(lCounter, 1).Value = objFile.Name
        lCounter = lCounter + 1
    End With

3) "ИМЯ_ЛИСТА_КУДА_СОБИРАТЬ_ДАННЫЕ_НАПИШИТЕ_ТУТ_СВОЁ" замените на соответствующее значение.
Обязательно протестируйте работу макроса.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, Я видимо что-то не так делаю. Код не работает, ничего не происходит:
Код
Private Sub GetSubFolders2(sPath)
    Dim sPathSeparator As String, sObjName As String
    Dim wb As Workbook
    Dim lCounter As Long: lCounter = 0
    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)
            'действия с файлом
            With ThisWorkbook.Worksheets("Лист1").Range("A1")
        .Offset(lCounter).Value = wb.Sheets(1).Range("A1").Value
        .Offset(lCounter, 1).Value = objFile.Name
        lCounter = lCounter + 1
    End With
            wb.Close True
        End If
    Next
    For Each objFolder In objFolder.SubFolders
        GetSubFolders2 objFolder.Path & Application.PathSeparator
    Next
End Sub
Изменено: Александр Иванов - 16.07.2021 11:26:57
 
Александр Иванов, приложите пару файлов-примеров (согласно правил форума) и файл-сборщик информации - попробую разобраться.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Во вложении любые несколько файлов с введенной датой в ячейке A1
Файл сборщик - это собственно пустой файл с макросом, который при запуске снимает пароль с листа, вводит дату в ячейку, закрашивает определенный диапазон ячеек и паролит лист снова.
Хотелось бы ПЕРЕД записью новой текущей даты в ячейку А1 чтобы даты (А1) из всех файлов записались в файл сборщик (желтым выделил куда их записывать) а в соседнюю ячейку название файла (зеленым выделил), чтобы понимать какая дата к какому файлу относится.
То есть можно например так: Макрос открыл файл, скопировал А1 и имя файла в сборщик, записал новую дату, закрасил цветом, произвел действия с паролем и закрыл. Открыл следующий...
Ну либо так: Сначала со всех файлов собрать информацию в сборщик, а потом уже записывать, закрашивать, паролить... Можно разными макросами, не принципиально.
Цель - филиалы предприятия присылают отчеты и важно понимать от какого числа данный отчет. Они могут по ошибке взять файл от другой даты и прислать. Для этого и хотелось бы в сборщик собрать сначала даты для контроля.
Изменено: vikttur - 16.07.2021 15:00:28
 
Александр Иванов, 1) в файле-сборщике я не вижу как Вы вызываете макрос "GetSubFolders2". 2) Вы зачем-то закомментировали:
Код
With ThisWorkbook.Worksheets("Лист1").Range("A1")
и вписали какую-то отсебятину. 3) в исходном макросе я не увидел рекурсию, потому не до конца Вас проинструктировал.
Исправленный сборщик данных прилагаю. Макрос вызывается по кнопке, исходные данные предыдущих вызовов затираются.
На будущее, лучше пакуйте файлы в ZIP-архив, т.к. RAR не везде можно открыть без помощи стороннего ПО.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал:
и вписали какую-то отсебятину
Прошу прощения, это после того, как у меня не получилось запустить макрос, я стал экспериментировать а вернуть в исходное состояние, указанное Вами, забыл.
Цитата
JayBhagavan написал:
На будущее, лучше пакуйте файлы в ZIP-архив, т.к. RAR не везде можно открыть без помощи стороннего ПО.
Принято)

Спасибо огромное! Макрос работает идеально.
Страницы: 1
Наверх