Со временем очень легко создать и собрать огромное количество книг Excel. Предположим, у вас есть целая куча книг, в которых вам нужно сделать то же изменение. Например, вам может потребоваться изменить значение, хранящееся в ячейке A10 каждого рабочего листа в каждой книге.

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

Если вы предполагаете, что вам нужно будет выполнить эту задачу только один раз, то самое простое решение — создать текстовый файл, содержащий путь и имя файла каждой из книг, по одной книге на строку. Например, у вас может получиться файл с такими записями:

c:\myfiles\first workbook.xlsx c:\myfiles\second workbook.xlsx c:\myfiles\third workbook.xlsx

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

Такой файл проще всего создать, открыв окно командной строки, перейдя в каталог, содержащий книги, и выполнив следующую команду:

dir /b > myfilelist.txt

Каждый файл в каталоге попадает в файл myfilelist.txt. Вам нужно будет загрузить текстовый файл в текстовый редактор и проверить его, чтобы вы могли удалить посторонние записи. (Например, myfilelist.txt окажется в списке.) Вам также нужно будет добавить имя пути в начало каждой строки в файле.

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

Sub ChangeFiles1()

Dim sFilename As String     Dim wks As Worksheet

Open "c:\myfiles\myfilelist.txt" For Input As #1     Do While Not EOF(1)

Input #1, sFilename  ' Get workbook path and name         Workbooks.Open sFilename

With ActiveWorkbook             For Each wks In .Worksheets                 ' Specify the change to make                 wks.Range("A1").Value = "A1 Changed"

Next         End With

ActiveWorkbook.Close SaveChanges:=True     Loop     Close #1 End Sub

Хотя этот подход отлично работает, если вам нужно обработать только один пакет файлов книги, его можно сделать гораздо более гибким, если вы ожидаете, что в будущем потребуется вносить такие изменения. Самая большая проблема, конечно же, заключается в создании файла myfilelist.txt каждый раз, когда вы хотите обработать пакет файлов. Гибкость добавляется, если макрос может просто использовать каталог, а затем загружать каждую книгу из этого каталога.

Sub ChangeFiles2()

Dim MyPath As String     Dim MyFile As String     Dim dirName As String     Dim wks As Worksheet

' Change directory path as desired     dirName = "c:\myfiles\"



MyPath = dirName & "*.xlsx"

MyFile = Dir(MyPath)

If MyFile > "" Then MyFile = dirName & MyFile

Do While MyFile <> ""

If Len(MyFile) = 0 Then Exit Do

Workbooks.Open MyFile

With ActiveWorkbook             For Each wks In .Worksheets                 ' Specify the change to make                 wks.Range("A1").Value = "A1 Changed"

Next         End With

ActiveWorkbook.Close SaveChanges:=True

MyFile = Dir         If MyFile > "" Then MyFile = dirName & MyFile     Loop End Sub

Этот макрос использует любой каталог, который вы укажете для переменной dirName.

Любой файл книги (с расширением .Xlsx) загружается и обрабатывается.

Другой подход состоит в том, чтобы макрос спрашивал пользователя, какой каталог следует обработать. Для этого можно использовать стандартное диалоговое окно «Файл Excel», как показано в следующем макросе.

Public Sub ChangeFiles3()

Dim MyPath As String     Dim MyFile As String     Dim dirName As String

With Application.FileDialog(msoFileDialogFolderPicker)

' Optional: set folder to start in         .InitialFileName = "C:\Excel\"

.Title = "Select the folder to process"

If .Show = True Then             dirName = .SelectedItems(1)

End If     End With

MyPath = dirName & "\*.xlsx"

myFile = Dir(MyPath)

If MyFile > "" Then MyFile = dirName & MyFile

Do While MyFile <> ""

If Len(MyFile) = 0 Then Exit Do

Workbooks.Open MyFile

With ActiveWorkbook             For Each wks In .Worksheets                 ' Specify the change to make                 wks.Range("A1").Value = "A1 Changed"

Next         End With

ActiveWorkbook.Close SaveChanges:=True

MyFile = Dir         If MyFile > "" Then MyFile = dirName & MyFile     Loop End Sub

_Примечание: _

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

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (8939) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365. Вы можете найти версию этого совета для старого интерфейса меню Excel здесь:

link: / excel-Making_Changes_in_a_Group_of_Workbooks [Внесение изменений в группу рабочих книг].