Недавно я столкнулся с тем, что потребовалось распечатать большое количество строительных смет, но в последний момент оказалось, что номер договора в них указан неверно, потому что в начале месяца он поменялся.
Так появилась задача однотипной замены номера договора и его даты в каждом из *.xlsx файлов, которые были расположены в папках, названных по адресу объекта. Таких папок было множество и некоторые ещё имели вложенные подкаталоги.
Ручной способ, который состоит из использования сочетания клавиш Ctrl + H
хоть и позволял сделать замену во всей книге Microsoft Excel сразу, но подразумевал что придётся открыть каждый файл по отдельности, нажимать несколько раз (под замену не только номер, но и дата) сочетания клавиш для замены, сохранять книгу Экселя, закрывать книгу, открывать новую книгу. В общем совершать множество механических действий.
Я конечно же стал думать, как можно наиболее простым для себя способом сделать это множество автозамен. Выбор сразу пал на VBA - Visual Basic для приложений. Ведь при помощи VBA можно заставить Эксель делать то, чего он не умеет по умолчанию.
Так что в этой статье хочу показать пошаговое руководство по быстрой и массовой автозамены любых данных во множестве файлах Excel с помощью сценария VBA.
TL;DR
'
' Подробнее: https://habr.com/ru/articles/807961/
' Михаил Шардин
'
Sub ReplaceTextInFiles()
Dim FileSystem As Object
Dim HostFolder As String
Dim FileName As String
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
HostFolder = ThisWorkbook.Path
Set FileSystem = CreateObject("Scripting.FileSystemObject")
ProcessFiles HostFolder, FileSystem
MsgBox "Автозамена произведена", vbInformation
End Sub
Sub ProcessFiles(ByVal folderPath As String, ByVal fs As Object)
Dim subFolder As Object
Dim file As Object
For Each file In fs.GetFolder(folderPath).Files
If LCase(file.Name Like "*.xlsx*") Then
Dim wb As Workbook
Set wb = Workbooks.Open(file.Path)
For Each ws In wb.Worksheets
' Начало - ниже все действия, которые необходимо сделать:
Set rng = ws.UsedRange
rng.Replace What:="СТАРОЕ ЗНАЧЕНИЕ", Replacement:="НОВОЕ ЗНАЧЕНИЕ", LookAt:=xlPart, MatchCase:=False
rng.Replace What:="03.04.2024", Replacement:="17.04.2024", LookAt:=xlPart, MatchCase:=False
' Конец всех действий, которые необходимо было сделать
Next ws
wb.Save
wb.Close
End If
Next file
For Each subFolder In fs.GetFolder(folderPath).SubFolders
ProcessFiles subFolder.Path, fs
Next subFolder
End Sub
Подготовка Microsoft Excel
Убедитесь, что Microsoft Excel установлен. Включение вкладки «Разработчик» в Excel позволяет получить доступ к инструментам и функциям, связанным с разработкой, включая макросы, Visual Basic для приложений (VBA). Вот как включить вкладку «Разработчик» в Excel:
1. Запустите Excel на своем компьютере.
2. Перейдите к параметрам. В зависимости от вашей версии Excel действия могут незначительно отличаться:
➡️ Для Excel 2010 и более поздних версий: нажмите вкладку «Файл» в верхнем левом углу, затем выберите «Параметры» в нижней части меню.
➡️ Для Excel 2007: нажмите круглую кнопку Office в верхнем левом углу, затем нажмите «Параметры Excel» в нижней части меню.
3. В диалоговом окне «Параметры Excel» слева вы увидите список категорий. Найдите и нажмите «Настроить ленту» (для Excel 2010 и более поздних версий) или «Популярные» (для Excel 2007).
4. Найдите параметр «Разработчик» в списке справа в разделе «Основные вкладки». Убедитесь, что флажок рядом с «Разработчик» установлен.
4. Установив флажок «Разработчик», нажмите кнопку «ОК» в нижней части диалогового окна «Параметры Excel», чтобы сохранить изменения и закрыть диалоговое окно.
5. После того как вы включили вкладку «Разработчик», вы должны увидеть ее на ленте Excel в верхней части окна Excel вместе с другими вкладками, такими как «Главная», «Вставка» и т.д.
Сценарий VBA для автозамены
Перед массовой автозаменой рекомендую создать резервные копии файлов Excel простым копированием каталогов.
Чтобы вставить сценарий VBA в Excel и выполнить его, выполните следующие действия:
1. Включите вкладку «Разработчик» (если она еще не включена).
2. Получите доступ к редактору Visual Basic:
Нажмите вкладку «Разработчик» на ленте Excel.
В группе «Код» нажмите «Visual Basic» (или нажмите ALT+F11).
3. Вставьте скрипт:
В окне редактора Visual Basic убедитесь, что ваша книга выбрана в окне Project Explorer обычно с именем «VBAProject (имя файла)».
Щелкните правой кнопкой мыши на имя проекта или любую существующую папку модуля.
Выберите «Вставка» > «Модуль» в контекстном меню.
Вставьте код VBA:
'
' Подробнее: https://habr.com/ru/articles/807961/
' Михаил Шардин
'
Sub ReplaceTextInFiles()
Dim FileSystem As Object
Dim HostFolder As String
Dim FileName As String
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
HostFolder = ThisWorkbook.Path
Set FileSystem = CreateObject("Scripting.FileSystemObject")
ProcessFiles HostFolder, FileSystem
MsgBox "Автозамена произведена", vbInformation
End Sub
Sub ProcessFiles(ByVal folderPath As String, ByVal fs As Object)
Dim subFolder As Object
Dim file As Object
For Each file In fs.GetFolder(folderPath).Files
If LCase(file.Name Like "*.xlsx*") Then
Dim wb As Workbook
Set wb = Workbooks.Open(file.Path)
For Each ws In wb.Worksheets
' Начало - ниже все действия, которые необходимо сделать:
Set rng = ws.UsedRange
rng.Replace What:="СТАРОЕ ЗНАЧЕНИЕ", Replacement:="НОВОЕ ЗНАЧЕНИЕ", LookAt:=xlPart, MatchCase:=False
rng.Replace What:="03.04.2024", Replacement:="17.04.2024", LookAt:=xlPart, MatchCase:=False
' Конец всех действий, которые необходимо было сделать
Next ws
wb.Save
wb.Close
End If
Next file
For Each subFolder In fs.GetFolder(folderPath).SubFolders
ProcessFiles subFolder.Path, fs
Next subFolder
End Sub
Строки 33 и 34 из кода выше вы можете добавлять или удалять по мере необходимости.
4. Запустите сценарий VBA:
➡️ Запуск макроса.Можете запустить его, перейдя на вкладку «Разработчик», нажав «Макросы», выбрав макрос и нажав «Выполнить».
➡️ Запуск из VB: Можете запустить ее непосредственно из редактора Visual Basic, поместив курсор внутри процедуры и нажав F5 или выбрав «Выполнить» > «Выполнить Sub/UserForm» из меню.
Готово
Теперь надо проверить результаты и убедится, что он выполнил нужные действия в вашей книге Excel.
И ещё не забудьте сохранить книгу Excel с включенными макросами.
Итоги
Использование сценариев VBA для быстрой замены любого текста в многочисленных файлах Excel предлагает решение проблемы исправления ошибок и автозамены.
Пошаговое руководство, изложенное в этой статье, дает инструмент, позволяющий за минуты выполнить то, что в противном случае потребовало бы часов или даже дней для выполнения вручную.
Автор: Михаил Шардин,
17 апреля 2024 г.
evgepet
Странно. Кто-то минуснул пост, но объяснять причину в каментах не захотел... Я, например, люблю использовать VBA для снижения объёма рутины при работе с Excel. Думаю, пост поможет начинающим (и не только) скриптописателям!