Внесение изменений в группу рабочих книг (Microsoft Excel)
Со временем очень легко создать и собрать огромное количество книг 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 [Внесение изменений в группу рабочих книг]
.