Изменение нескольких файлов excel

 

Всем здравствуйте! Проблема у меня такая. Есть около  1000 однотипных файлов в которых нужно заменить названия строк и колонок над данными (не сами данные!)  
Например «Февраль» на «Месяц февраль» и т.д. в 1000 файлах.  
Помогите пожалуйста автоматизировать этот процесс? Подскажите кто знает, как это легче всего сделать?

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

поиск на форуме как открывать файлы из директории.  

  алгоритм:  
1.открыть файл    
2. заменить диапазон.  
3. закрыть файл.

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

Dim FilesToOpen  
   Dim x As Integer  

     FilesToOpen = Application.GetOpenFilename _  
                 (FileFilter:=»Microsoft Excel Files (*.xls), *.xls», _  
                  MultiSelect:=True, Title:=»Выберите файлы»)  
   If TypeName(FilesToOpen) = «Boolean» Then  
       MsgBox «Не выбрано ни одного файла!»  
       GoTo ExitHandler  
   End If  
   x = 1  
   While x <= UBound(FilesToOpen)  
       Workbooks.Open Filename:=FilesToOpen(x)  
…  изменения заголовков  
       ActiveWorkbook.Close  
       x = x + 1  
   Wend

 

Марчук!  
Огромное вам спасибо! Но..Я извиняюсь, я не понимаю как применить этот файл? Мне нужно заменить определенные ячейки в файлах не трогая другие. Объясните пожалуйста, как это сделать?

 

Марчук  
Я имел ввиду как применить ваш скрипт? Какя понял он не из Excel запускается?

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

{quote}{login=}{date=10.02.2009 11:57}{thema=}{post}Марчук  
Я имел ввиду как применить ваш скрипт? Какя понял он не из Excel запускается?{/post}{/quote}  
это макрос и он запускается из excеl

 

Марчук, ругается на строку GoTo ExitHandler, что делать?

 

{quote}{login=}{date=10.02.2009 12:11}{thema=}{post}Марчук, ругается на строку GoTo ExitHandler, что делать?{/post}{/quote}  
добавь в конец перед End Sub  

  ExitHandler:  
   Application.ScreenUpdating = True  
   Exit Sub  
ErrHandler:  
   MsgBox Err.Description  
   Resume ExitHandler

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

 

VovaK

Пользователь

Сообщений: 1716
Регистрация: 01.01.1970

Попробуй функцию… Сам не пробовал, мысль была, а потом по другому оформил.  

  Function GetValue(path, file, sheet, ref, CellAddress)  
               ‘Получает значение из закрытой рабочей книги  
               ‘Функция GetValue имеет четыре аргумента;  
               ‘p a t h— путь к закрытому файлу (например, «d: f i l e s » ) ;  
               ‘f i l e — название рабочей книги (например, «budget .xls»);  
               ‘sheet — название рабочего листа (например, «Лист1»);  
               ‘ref — ссылка на ячейку (например, «С4»).Dim arg As String  
               ‘CellAddress — ссылка на искомую ячейку.  
               ‘ Проверка существования файла  
               ‘  
If Right(path, 1) <> «» Then path = path & » »  
If Dir(path & file) = «» Then  
  GetValue = «Файл не найден»  
Exit Function  
End If  

                 ‘ Создание аргумента  
arg = «‘» & path & «[» & file & » ] » & sheet & «‘!» & _
Range(ref).Range(«Al»).Address(, , xlRlCl)  
               ‘ Выполнение макроса XLM  
GetValue = ExecuteExcel4Macro(arg)  
End Function

 

Если первый раз выбрал какой то файл, а второй раз ничего не выбрал, а просто нажимаю ОК, то сообщение не появляется. Выбирается старый файл.

 

Марчук, пост который выше для Вас

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

{quote}{login=}{date=10.02.2009 01:37}{thema=}{post}Марчук, пост который выше для Вас{/post}{/quote}  
вот те файл  
разберешься?

 

Юрий М

Модератор

Сообщений: 60581
Регистрация: 14.09.2012

Контакты см. в профиле

Марчук, автор просил «не открывая файлы». Скорее всего подразумевалось «в невидимом для пользователя режиме». Не вижу в коде строки Visible = False.    
Если не сделаешь корректный код — напишу что-нибудь интересное и специально ЗААРХИВИРУЮ :-)

 

Юрий М

Модератор

Сообщений: 60581
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=Марчук}{date=10.02.2009 01:56}{thema=Re: }{post}{quote}{login=}{date=10.02.2009 01:37}{thema=}{post}Марчук, пост который выше для Вас{/post}{/quote}  
вот те файл  
разберешься?{/post}{/quote}  
А ведь верно — нажимаю на кнопку открыть не выбрав никакого файла — никакого сообщения. :-)

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

{quote}{login=Юрий М}{date=10.02.2009 02:06}{thema=}{post}Марчук, автор просил «не открывая файлы». Скорее всего подразумевалось «в невидимом для пользователя режиме». Не вижу в коде строки Visible = False.    
Если не сделаешь корректный код — напишу что-нибудь интересное и специально ЗААРХИВИРУЮ :-){/post}{/quote}  
я тогда дома открою и прочитаю :)

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

{quote}{login=Юрий М}{date=10.02.2009 02:11}{thema=Re: Re: }{post}{quote}{login=Марчук}{date=10.02.2009 01:56}{thema=Re: }{post}{quote}{login=}{date=10.02.2009 01:37}{thema=}{post}Марчук, пост который выше для Вас{/post}{/quote}  
вот те файл  
разберешься?{/post}{/quote}  
А ведь верно — нажимаю на кнопку открыть не выбрав никакого файла — никакого сообщения. :-){/post}{/quote}  
счас посмотрю.

 

ytk5kyky

Пользователь

Сообщений: 2410
Регистрация: 01.01.1970

{quote}{login=Юрий М}{date=10.02.2009 02:06}{thema=}{post}Марчук, автор просил «не открывая файлы». Скорее всего подразумевалось «в невидимом для пользователя режиме». {/post}{/quote}Нет. Не открывая файлы — это еще и желательно комп не включать. Пусть силой мысли обновляются.

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

доработал скрытно.  
у меня сообщение показывает если не выбрано ни одного файла :(

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

{quote}{login=Марчук}{date=10.02.2009 02:20}{thema=}{post}доработал скрытно.  
у меня сообщение показывает если не выбрано ни одного файла :({/post}{/quote}  
забыл

 

Марчук  
Вы просто волшебник!!! ОГРОМНОЕ СПАСИБО!!!!!!!!!!  
ТО что нужно!!!! Скачал ваш файл, проверил, поменял на что мне нужно и все!  
Вы гений!!! СПАСИБО еще раз!!!

 

Марчук,  
еще раз здравствуйте! Помогите пожалуйста разобраться. Макрос ваш прекрасно работает на домашнем компьютере с русской виндой, а вот на работе где винда английская вместо русских букв какие то каракули. Отчего это так? Причем я выставил в Editore и Courer(Cyrilic)и Times New Roman(Cyrilic) в нем показывает нормально, а вот когда скрипт работает в Excel вставляет черти что. Не подскажите почему так?

 

Marchuk

Пользователь

Сообщений: 1167
Регистрация: 01.01.1970

#23

16.02.2009 13:13:24

как вариант вместо  русских букв писать английскими буквами, или вообще перевести на английский.  

  вместо  
   MsgBox «Не выбрано ни одного файла!»  

  написать  
   MsgBox «Don`t select file!»  

  вместо  
Title:=»Выберите файлы»)  

  написать  
Title:=»Select files»)  

    с английским у меня слабо.

Содержание

  1. Изменение нескольких файлов excel
  2. Как сделать одинаковые изменения сразу на нескольких листах
  3. Как обновить 100 Excel файлов, чтобы не отсохли руки и пару слов о немецкой диджитализации

Изменение нескольких файлов excel

Приветствую! Суть задачи такова: есть порядка 500 файлов Exel, необходимо внести в них однотипные изменения.
Более примитивно . В 500 фалов в ячейку A1 записать одно и тоже число, например 3 . Или написать один и тот же текст, например «Привет форум» .
Знаю что, если бы эти файлы были листами одной книги, это можно было сделать с помощью выделения Shift-ом. Но тут проблема, что это разные файлы.
Предполагаемые мной пути решения.
1. Как-то объединить(выделить,связать) файлы и совместно их отредактировать. Далее разделить.
2. Написать макрос и выполнить его в 500 файлах.

Подскажите, есть ли у кого опыт и соображения на эту тему?

Приветствую! Суть задачи такова: есть порядка 500 файлов Exel, необходимо внести в них однотипные изменения.
Более примитивно . В 500 фалов в ячейку A1 записать одно и тоже число, например 3 . Или написать один и тот же текст, например «Привет форум» .
Знаю что, если бы эти файлы были листами одной книги, это можно было сделать с помощью выделения Shift-ом. Но тут проблема, что это разные файлы.
Предполагаемые мной пути решения.
1. Как-то объединить(выделить,связать) файлы и совместно их отредактировать. Далее разделить.
2. Написать макрос и выполнить его в 500 файлах.

Подскажите, есть ли у кого опыт и соображения на эту тему? Sputnik

Сообщение Приветствую! Суть задачи такова: есть порядка 500 файлов Exel, необходимо внести в них однотипные изменения.
Более примитивно . В 500 фалов в ячейку A1 записать одно и тоже число, например 3 . Или написать один и тот же текст, например «Привет форум» .
Знаю что, если бы эти файлы были листами одной книги, это можно было сделать с помощью выделения Shift-ом. Но тут проблема, что это разные файлы.
Предполагаемые мной пути решения.
1. Как-то объединить(выделить,связать) файлы и совместно их отредактировать. Далее разделить.
2. Написать макрос и выполнить его в 500 файлах.

Подскажите, есть ли у кого опыт и соображения на эту тему? Автор — Sputnik
Дата добавления — 13.07.2018 в 23:01

Источник

Как сделать одинаковые изменения сразу на нескольких листах

Допустим у Вас есть книга с n-ным количеством однотипных листов. Иногда приходится проделывать в каждом листе одну и ту же операцию. Скажем, написание заголовков или изменение формулы в одной и той же ячейке шаблона. Чаще всего в таких случаях проделывается следующая операция: на одном листе меняются заголовки, затем копируются и поочередно вставляются на остальные листа. Или формула прописывается в одном листе и последовательно вставляется в каждый лист. Долго, нудно и неинтересно. Благо разработчики Microsoft предвидели подобные мучения и снабдили Excel средством для более быстрого осуществления этой задачи.

Для произведения одинаковых изменений сразу на нескольких листах все, что необходимо сделать, это выделить все необходимые листы с зажатой клавишей Shift или Ctrl ( Ctrl позволяет выделить несмежные листы(скажем через один), а с Shift выделяются все листы от первого выделенного до последнего). Теперь все действия, производимые на активном(видимом) листе в точности повторяется на других выделенных листах. И что не менее важно — если прописать в активном листе формулу, то ссылки на других листах будут у каждого свои, т.е. ссылаться формулы будут на тот лист, в котором написаны(если в формуле не указаны явно ссылки на другие листы). То же самое и с копированием. Если на одном листе в ячейке А1 написано Дом, а на другом Холм, то при копировании ячейки А1 на активном листе и вставки её в ячейку А2 , то на каждом листе в ячейку А2 будет скопировано своё значение — Дом и Холм соответственно.

Подобная работа с листами еще называется работой с группой листов. Определить, что на данный момент выделена группа листов(и изменения будут производиться на всех этих листах) очень просто — в заголовке Excel будет отображен текст: [Группа] [Groupe]

Как разгруппировать листы, объединенные в группу:

  • если в группу объединены не все листы книги — выделить любой лист вне группы
  • если в группе все листы книги книги — выделить любой лист, который на данный момент не является активным

Статья помогла? Поделись ссылкой с друзьями!

Источник

Как обновить 100 Excel файлов, чтобы не отсохли руки и пару слов о немецкой диджитализации

Всем привет! На связи Максим и я продолжаю описывать свой университетский опыт работы VBA программистом с Excel. В сегодняшней статье поговорим о том, как можно произвести изменения в десятках, сотнях, миллионах Excel файлов за один заход с помощью одного макроса и как этот концепт может сэкономить вам кучу времени, сил и средств. Данная статья будет полезна тем, кто вынужден часто совершать одинаковые изменения в большом количестве подобных друг другу Excel файлах, тем, кто устал от рутины и хочет автоматизировать процесс обновления рабочих документов или молодым студентам, которые находятся в поисках идей того, как можно выделится своими скиллами на рабочем месте. Бонусом внутри вы найдете пару моих рассуждений на тему дискуссий, которые возникли под моей прошлой статьей (если еще не читали ее, то советую ознакомиться, чтобы лучше понимать фон этой), а именно на тему актуальности Excel и VBA в европейских реалиях и общего уровня диджитализации на немецком рынке. Погнали!

Первым делом я бы хотел украсть минутку вашего времени, чтобы поблагодарить вас всех за активность на моей первой статье. Всего за 2 недели статья набрала 41 тысячу просмотров и стала, если я ничего не упустил, самой просматриваемой статьей на тему VBA на сайте! Это просто фантастика! Стоит признаться, что статья была написана часа за полтора в сонное и ленивое послеобеденное время жаркого летнего дня с целью поделиться с той кучкой людей, которые все-таки откопает ее в песочнице, своим небольшим опытом, а может даже помочь подзаработать копеечку, подкинув интересную на мой взгляд идею заработка. Но под статьей началась очень активная и интересная дискуссия, которая не прекращалась несколько дней. Я перечитал все комменты и был очень рад увидеть, что некоторые люди действительно заинтересовались темой и просили детальнее описать мой опыт программирования на VBA. Как я и обещал, я подготовлю небольшую серию статей, каждая из которых опишет реальные кейсы, с которыми я работал. Я постараюсь как можно проще и понятнее описать, какие практики реально полезные, а какие стоит избегать всеми возможными путями. Не буду больше тянуть, всем еще раз спасибо, теперь точно погнали!

Итак, первая профильная статья должна быть о чем-то, что сыграло в моей короткой карьере весомую роль. Поэтому я решил описать свой первый самостоятельный рабочий проект, успешное закрытие которого принесло мне продление рабочего контракта и изменило мою репутацию внутри отдела с «Какой-то малолетка, приходящий 2 раза в неделю и делающий все, что нам лень» на «Какой-то малолетка, приходящий 2 раза в неделю и делающий все, что нам лень, умеющий делать макросы». В первой статье, я вскользь описал свой отдел, а именно то, что из-за длинной очереди на автоматизацию с помощью стороннего софта, он был вынужден заниматься ею самостоятельно с помощью End-User Computing, облегчая себе жизнь Excel макросами на VBA.

Хочу оспорить мнение некоторых людей из комментариев под прошлым постом, кто говорит, что Excel уже прошлый век и нигде используется, а моя фирма это просто исключение. Ребята, я не зря много раз подчеркивал, что речь идет о рынке, вероятно, самой консервативной страны Европы – Германии. Чтобы коротко описать состояние местного рынка я расскажу вам короткую, но забавную историю. Я недавно проходил собеседование на должность практиканта в одну из крупнейших страховых фирм страны, а точнее в их дочернюю компанию занимающейся диджитализацией страховой и IT задачами в целом. Незадолго до собеседования мне пришел E-Mail от отдела кадров с общей информацией о предстоящем разговоре и рекомендацией о том, что неплохо было бы получше ознакомиться с самой фирмой на их сайте. Я открыл отправленную ими ссылку и предо мной открылась новостная лента этой компании. В закрепе висела статья с топовым названием: «Мы уходим от использования факса!» и фотография главы страховой с очень-очень довольным лицом. Извините, но я в свои 22 года не знаю даже как факсом пользоваться. А он оказывается до сих пор активно используется в немецких страховых фирмах… Факс — это вообще тема тут популярная, что вызывает у меня дикий восторг и истеричный смех. Особенно когда идешь с лекции на тему диджитализации, заходишь в приемную к врачу, а тебе там предлагают отправить твою справку о больничном напрямую работодателю по факсу и спрашивают номер. E-mail пока не освоили. Сразу воодушевляешься и начинаешь представлять как когда вырастешь и станешь взрослым, будешь проводить свои лучшие годы избавляя компании от использования факса в 20’х годах 21 века. Во время самого собеседования разговор, кстати, тоже прошел в интересном ключе. Глава IT отдела резко остановил меня после того, как я сказал, что заинтересован в 4-5 месячном практикуме и сказал, что ему нужен практикант минимум на 2-3 года, так как первые полтора уйдут на ознакомление с ландшафтом всех используемых систем, общее количество которых достигло 250. Ну накопилось за 30 лет, с кем не бывает.

Это я не о том, что тут люди копьями себе еду добывают и шкуры животных носят, я лишь о том, что современные технологии в местных фирмах внедряются очень и очень медленно, поэтому Excel это реально рабочая машинка номер 1 для абсолютного большинства как маленьких, так и больших компаний. Этому виной много факторов: очень жесткое и консервативное законодательство, требующее максимальную безопасность данных, банальное нежелание менять то, что десятилетиями работает и так далее и тому подобное. В государственных учреждениях, если я не ошибаюсь, чисто с юридической стороны вопроса разрешено использовать только офисный пакет от Microsoft, даже переход на версию 365 предвидеться лишь в обозримом будущем. В долгосрочной же перспективе все государственные фирмы планируют пересадить на офисный пакет от местного производителя (который еще пока не разработан), чтобы убрать зависимость от американского софта. Короче вы поняли. Все достаточно плохо. Рукастые ребята, которые хотят и могут сделать по-модному и современному часто сталкиваются с нежеланием и страхом руководства что-то менять. У меня не получилось уговорить даже бесплатную версию Asana внедрить в отдел, а вы говорите про современные облачные решения для работы с данными. Лет через 15 может, торопиться некуда, Excel не подведет.

Но я что-то отошел от темы. Итак, мой первый проект после прихода на должность VBAшника. Этот кейс является хорошим примером корректного использования VBA внутри отдела. Успешная его реализация сэкономила нам много человеко-часов и нервов, плюс дала важный опыт в автоматизации процесса обновления документов внутри отдела.

Важнейшим компонентом нашего отдела является калькуляция. Не углубляясь в бэкграунд, стоит просто сказать, что мой отдел занимается контролем состояния проектов, которых в лучшие времена было около сотни одновременно. Средняя длительность проекта от 5 до 8 лет. По его началу для него создается калькуляция. Она построена на базе единого шаблона, который часто обновляется, и ведется на протяжении всего проекта, вплоть до его окончания. То есть при создании проекта наиболее актуальной версией шаблона может быть, скажем, v. 1.2, а в момент окончания проекта стандартом будет уже v. 1.8. Обновления происходят примерно раз в полгода.

Интересный момент наступает в момент перехода к новому шаблону. Так, новые проекты, которые создаться после внедрения новой версии шаблона будут созданы уже на базе самой актуальной версии. А вот что делать с теми калькуляциями, которые были созданы ранее? Вариант с созданием их заново на базе наиболее актуальной версии шаблона сразу отпадает, так как каждая калькуляция чуть-чуть да индивидуальна и за время проекта обрастает своими дополнительными вспомогательными листами, комментариями и т.д. Было бы глупо заставлять работников отдела каждые полгода начинать вести все их калькуляции заново. Вариант с ручным обновлением кажется уже более реальным решением. Скажем, обновление включает в себя всего 10 мелочей, цвет фона поменять, да формулу обновить. Ну сколько тогда понадобиться времени на обновление? Минут так 10. 10 минут умножить на 100 файлов, получается 1000 минут или 16 с половиной часов, часов 18 вместе с перерывами на кофе. После увеличения минимальной почасовой заработной платы, а она в Германии особо важна для студентов, так как их труд оплачиваться почасово, средняя зарплата студента ITшника будет порядка 15-17 евро в час. То есть процесс обновления 100 файлов будет стоить фирме: 18 часов работы студента умножить на его зарплату в 15 евро в час – 270 евро. Студент на эти деньги сможет целый месяц очень хорошо питаться, а фирма этой затраты в принципе даже не почувствует.

Но что делать, если обновление большое? Скажем, в моем первом проекте в калькуляцию было привнесено около 120 новых изменений. Начиная от замены старых формул на новые и заканчивая полными изменением форматирования целых листов. Давайте повторно рассмотрим все варианты. Вариант с тем, чтобы просто пересоздать все старые калькуляции на базе нового шаблона до сих пор отпадает, работники не желают этим заниматься, а для студента, не имеющего профильные знания в этой среде, задача тяжелая. Обновление вручную? Давайте посчитаем. Возьмем за стандарт, как и в первом примере, что 1 изменение занимает 1 минуту. 120 обновлений в файле – примерно 2 часа на обновление одного документа. Обновление ста документов займет 200 часов, или при средней студенческой выработке в 16 часов в неделю – чуть более 3 месяцев. За эти 3 месяца фантастически увлекательной работы студент получит 3000 евро, это уже более болезненно для фирмы. Учитывайте дополнительно еще то, что студент реально будет 3 месяца просто обновлять калькуляции, в других сферах от него толку не будет. Для других задач нужно либо нанимать другого студента, либо все остальные поручения перекладывать на штатных сотрудников. Плюсом еще и то, что у студентов далеко не всегда все идет гладко и процесс может затянуться еще на пару недель. К тому времени подъедет и новое обновление, а должность студента можно будет официально переименовывать в «специалист по обновлению калькуляций», так как он рискует больше ничем особо и не заниматься. Знаете, что самое ужасное? Они реально так делали… Один из моих предшественников попал на более мелкий апдейт и месяца полтора провел за этим увлекательным занятием.

Какая общая логика процесса? Вместе с каждым обновлением калькуляции я получаю полный и четкий список требуемых обновлений. Например: Лист «ABC», ячейка «A1», новая формула «=СУММ(B1:B3)». То есть я могу быть уверенным, что какую бы калькуляцию я не открыл, там гарантировано будет лист ABC и именно в этом листе в ячейке A1 требуется произвести необходимое обновление. Изменения могут быть разные, какие-то проще, какие-то сложнее. Но стоит признать, что как правило в подобного рода обновлениях речь идет о базовых изменениях по типу замены формул, текста, оформления и строения таблиц. Реже речь заходит о более сложных вещах: обновление условного форматирования, работа с графиками и сводными таблицами.

Открывать файл за файлом и делать все вручную дико скучно, долго и не очень удобно. Плюс есть достаточно большой риск накосячить и даже того не заметив сделать какое-то из 120 изменений неправильно.

Нет, ну я же не зря в универе учу как избавлять людей от факсов, нужно альтернативное решение. И оно достаточно интересное. Файлы Excel можно очень удобно обновлять с помощью других файлов Excel. Хотя правильнее было бы сказать, с помощью макроса для обновления, который будет лежать в другом файле Excel. То есть можно создать своего рода файл-обновитель, внутри которого прописать полный алгоритм для совершения необходимых изменений в выбранном файле, а после использовать этот обновитель для обновления других Excel файлов. Пока не очень понятно? Сейчас поясню подробнее!

Я и далее буду использовать только что мной выдуманное слово «обновитель», так как оно мне понравилось. Общий сценарий использования макроса выглядит следующим образом:

Пользователь открывает Excel файл обновитель.

Обновитель спрашивает пользователя о том, какие именно файлы он хотел бы обновить.

Обновитель открывает файл и совершает в нем требуемые изменения.

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

После успешного обновления всех файлов обновитель отчитывается пользователю, что процесс обновления выбранных файлов завершен.

Пользователь закрывает обновитель и продолжает работу с обновленными файлами.

Вот и вся идея. Не так уж и сложно, да? Тогда посмотрим, как это выглядит в VBA. Для простоты давайте представим, что нам нужно обновить всего 1 файл и мы заранее знаем путь, где он лежит.

Сначала создаем наш файл обновитель, где будет прописан алгоритм обновления для файлов. Создаем новый VBA модуль и начинаем творить. Для начала создадим пару важных переменных:

Как мы ранее договорились, для простоты и ясности кода представим, что мы знаем четкий путь к файлу, который нужно обновить и он у нас всего один. На практике такое конечно оооооочень нереалистично. Напомню, нашей целью является обновить 100 документов и желательно за 1 заход! Прикрутив на этом этапе цикл можно избавить пользователя от того, чтобы он каждый раз должен был выбирать файл вручную. Сделать можно, например, так: пользователь добавляет все файлы, которые необходимо обновить, в заранее установленную папку, макрос обновителя открывает эту папку и итерируя через все файлы внутри папки обновляет их, пока не достигнет последнего файла. Способов работы с файлами множество, каждый выбирает тот, который ему по душе, я не буду приводить тут пример кода, который мы использовали в отделе. По своему опыту могу сказать, что вышеописанный вариант, использующий цикл и папку с файлами нами был отмечен как самый удобный и практичный. Сделать такой цикл не сложно и с помощью гугла процесс реализации этого функционала займет минут 30.

Дальнейшая работа будет происходить с переменной fileToUpdate, так как она представляет собой файл, который требуется обновить и через нее можно получить доступ к любой его части. Сам процесс обновления документа достаточно прост. VBA обладает огромным набором инструментов для удобной работы с элементами внутри документа. Я приведу пару простых примеров ниже, чтобы вы поняли саму суть, а дальше каждый уже сам сможет быстро и просто смастерить то, что нужно именно ему. Я скажу вам так, не было за 2 года моей практики такого обновления, которого я не смог бы автоматизировать. Что-то отнимает больше времени, что-то меньше, но все реально.

С самого начала важно активировать файл и лист, в котором необходимо провести обновление. Это проще всего сделать при помощи метода Activate. Активируем наш обновляемый файл и после этого активируем в нем лист, который требуется обновить:

Вот мы и готовы обновлять выбранный лист! Нужно изменить формулу в ячейке? Без проблем, но есть важное замечание! Формулы в VBA задаются в совершенно другом формате. Чтобы перевести формулу из привычного Excel формата в синтаксис VBA можно воспользоваться функцией записи макроса. Например, в обновляемом файле вам нужно в ячейку A1 вставить формулу “СУММ(B1:B10)”. В любом Excel файле, включите запись макроса, активируйте ячейку A1 и напишите необходимую вам формулу. После этого остановите запись и откройте среду разработки. В автоматически созданном новом модуле вы увидите интерпретацию этой формулы на языке VBA, а именно:

Видите, как сильно отличается формат написания формулы? И это еще совсем простенький пример. Иногда нужно подставлять формулы длинной в 1-2 строки, такие никак кроме как через запись макроса в синтаксис VBA не переведешь.

А вот текст в ячейке проще всего изменить с помощью метода Value, давайте добавим какой-нибудь текст в ячейку A2:

Нужно полностью удалить все в заданном диапазоне?

Либо можно сразу ударить абсолютно все с заданного листа:

Давайте еще добавим новый лист в конец книги и активируем его, чтобы соврешать в нем изменения:

Сделаем так, чтобы в новом листе колонка C по умолчанию была в денежном формате:

Закончим подготовку нашего нового листа тем, что сделаем все будущие надписи в первой строке по умолчанию жирными:

В конце защитим его от нежелательных гостей паролем и скроем его от лишних глаз:

Разберем также несколько более сложных примеров, например настройку сводных таблиц. Давайте удалим из заданной сводной таблицы с названием dataPivot все настройки строк. Для этого в начале создадим переменную, которой присвоим значение таблицы, настройки которой нужно изменить. После этого с помощью цикла пройдем через все настройки строк таблицы и уберем их:

А теперь добавим новую строку в ту же самую сводную таблицу, которая будет представлять данные из параметра newRow:

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

Можно также добавлять новые элементы на страницы, например кнопки:

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

После завершения обновления файла его останется лишь сохранить под новым названием и закрыть. Параметр False в методе Close отменяет сохранение файла перед закрытием, таким образом изначальная версия не будет изменена, а версия со всеми изменения будет носить новое имя и сохранена там, где мы укажем.

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

Могу сказать, что на написание макроса для обновления всех необходимых документов у меня ушло порядка 8 рабочих дней. Тоже немало, но тогда я еще только учился. Получается, что интеграция более чем 120 обновлений в сотню файлов заняла у студента около 64 часов и стоила фирме 960 евро. Поприятнее будет, чем 3000 евро за ручное обновление.

Разберем кратко главные плюсы такого способа обновления файлов.

Во-первых, — это скорость. Обновления, как правило, аналогичны друг другу, что открывает возможность использовать прекрасный и неповторимый Copy-Paste. Одна и та же функция для изменения формулы:

Используется множество раз, меняется лишь значение формулы и ячейка. Можно вынести это в отдельную функцию и быстро и красиво вызывать столько раз, сколько нужно по ходу обновления. Таким образом можно здорово ускорить реализацию рутинных шагов и большая часть времени тогда уйдет на всякие специфичные операции, типа вышеприведенного обновления сводной таблицы.

Во-вторых, гарантия того, что все файлы будут правильно и корректно обновлены. Ручное обновление – опасный процесс, в котором велика вероятность человеческой ошибки. Очень уж легко промахнуться и добавить новую формулу в неправильную ячейку или случайно присвоить новому условному форматированию неправильную настройку. Особенно когда обновление включает в себя большое количество шагов. Хорошо протестированный код обновления исключает человеческий фактор и гарантирует, что все файлы после обновления будут в одинаковом состоянии.

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

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

Будьте креативными! Этот способ обновления позволяет жонглировать данными внутри файлов как вам только захочется! Единственные границы – здравый смысл и ваше воображение. Я очень надеюсь, что эта статья сможет облегчить кому-нибудь жизнь так же, как в свое время эти идеи облегчили мою. Буду рад пообщаться с вами в комментах, пишите было ли интересно и информативно, а также о том, что еще вы бы хотели прочитать на тему Excel. Всем спасибо за внимание и до скорого!

Источник

Хитрости »

22 Август 2018              10724 просмотров


Наверняка многие сталкивались с такой проблемой, что некоторые программы и макросы позволяют работать исключительно с определенными форматами файлов. А в жизни далеко не всегда все файлы в одном формате. Например, модная в последнее время надстройка PowerQuery неравнодушна к файлам xlsb — с ними она порой отказывается нормально работать и предпочитает им более открытые форматы xlsx и xslm.
Решил набросать небольшой практический код, который пересохраняет все файлы в указанной папке в один формат, что избавит от ручной работы в виде открывания и сохранения каждого файла в нужный формат.

'---------------------------------------------------------------------------------------
' Author : The_Prist(Щербаков Дмитрий)
'          Профессиональная разработка приложений для MS Office любой сложности
'          Проведение тренингов по MS Excel
'          http://www.excel-vba.ru
' Purpose:
'---------------------------------------------------------------------------------------
Option Explicit
 
Sub SaveAs_Mass()
    Dim sFolder As String, sFiles As String, sNonEx As String, sNewEx As String
    Dim wb As Workbook
    Dim lPos As Long, lFileFormat As Long, IsDelOriginal As Boolean
 
    'указываем новый формат файлов
    sNewEx = InputBox("Укажите новое расширение для файлов:", "www.excel-vba.ru", "xlsx")
    'определяем числовой код формата файлов
    Select Case sNewEx
        Case "xlt": lFileFormat = 17
        Case "xla": lFileFormat = 18
        Case "xlsb": lFileFormat = 50
        Case "xlsx": lFileFormat = 51
        Case "xlsm": lFileFormat = 52
        Case "xltm": lFileFormat = 53
        Case "xltx": lFileFormat = 54
        Case "xlam": lFileFormat = 55
        Case "xls": lFileFormat = 56
        'если указанный формат не соответсвует ни одному из существующих
        Case Else
            MsgBox "Формат '" & sNewEx & "' не поддерживается", vbCritical, "www.excel-vba.ru"
            Exit Sub
    End Select
 
    '   если надо просматривать файлы в той же папке, что и файл с кодом:
    '       sFolder = ThisWorkbook.Path
    'диалог запроса выбора папки с файлами
    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)
    'запрашиваем - удалять ли исходные файлы после сохранения в новом формате
    IsDelOriginal = MsgBox("Удалять исходные файлы после пересохранения?", vbQuestion + vbYesNo, "www.excel-vba.ru") = vbYes
    'отключаем обновление экрана и показ системных сообщений
    Application.ScreenUpdating = 0
    Application.DisplayAlerts = 0
    'просматриваем все файлы Excel в выбранной папке
    sFiles = Dir(sFolder & "*.xls*")
    Do While sFiles <> ""
        If sFiles <> ThisWorkbook.Name Then
            'получаем имя файла без расширения
            lPos = InStrRev(sFiles, ".")
            sNonEx = Mid(sFiles, 1, lPos)
            'открываем книгу
            Set wb = Application.Workbooks.Open(sFolder & sFiles, False)
            'сохраняем в новом формате и закрываем
            wb.SaveAs sFolder & sNonEx & sNewEx, lFileFormat
            wb.Close 0
            DoEvents
            'если надо удалить исходные файлы после преобразования
            If IsDelOriginal Then
                On Error Resume Next
                Kill sFolder & sFiles
                DoEvents
                On Error GoTo 0
            End If
        End If
        sFiles = Dir
    Loop
    'возвращаем обновление экрана и показ системных сообщений
    Application.ScreenUpdating = 1
    Application.DisplayAlerts = 1
    MsgBox "Файлы преобразованы", vbInformation, "www.excel-vba.ru"
End Sub

Как использовать: Для начала надо убедиться, что разрешены макросы и при необходимости включить их: почему не работает макрос. Затем копируем код выше, в Excel переходим в редактор VBA(Alt+F11) —InsertModule. Вставляем туда скопированный код. Теперь код можно вызывать нажатием клавиш Alt+F8 —SaveAs_MassВыполнить(Run).
Все, что будет необходимо это указать один из форматов и выбрать папку с файлами, для пересохранения. В папке может находится и сам файл с кодом, но он не будет затронут.
Основные запросы и настройки кода:

  • Первым появляется запрос формата файлов(Укажите новое расширение для файлов:) — здесь надо указать формат, который будет назначен выбранным файлам после выполнения команды. Доступные форматы:
      1. xlsx — книга Excel без поддержки макросов. При сохранении в данный формат книг, содержащих макросы, все макросы будут удалены автоматически. Если необходимо сохранить макросы следует выбрать формат — xlsm.
      2. xlsm — книга Excel с поддержкой макросов
      3. xlsb — двоичная книга Excel (с поддержкой макросов)
      4. xlam — надстройка Excel (с поддержкой макросов)
      5. xltx — шаблон Excel (без поддержки макросов)
      6. xltm — шаблон Excel с поддержкой макросов
      7. xls — книга Excel (97-2003)
      8. xla — надстройка Excel (97-2003)
      9. xlt — шаблон Excel (97-2003)

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

  • Далее появляется запрос указать папку с файлами, которые надо пересохранить.
  • И последний запрос — «Удалять исходные файлы после пересохранения?«. Если выбрать да, то после сохранения каждого файла в папке в нужный формат его исходник будет удален. Следует осторожно использовать эту опцию, т.к. удаление файлов происходит без возможности восстановления. Особенно это критично, если пересохранение идет либо в формат xslx, при котором удаляются все макросы из файла, либо при сохранении в устаревший формат xls, который поддерживает не более 65536 строк данных и 256 столбцов. Если какие-то файлы при этом ранее были в более новом формате и содержали большее количество строк или столбцов, то данные будут утеряны(сохранится только 65536 строк и 256 столбцов).

Небольшой практический совет: приложенный код можно применить для удаления макросов из всех указанных книг. Все книги, макросы в которых необходимо удалить, помещаются в одну папку. Далее запускается код и указывается формат «xlsx». Все файлы будут сохранены в этом формате. После этого можно будет файлы пересохранить и в иной формат(xls, например). Но макросов там уже точно не будет.

Изменение формата приведенным кодом возможно только для файлов Excel и не может быть использовано для изменения форматов файлов других программ(OpenOffice, Paint и т.п.).

Скачать пример:

  Сменить формат файлов.xslm (29,8 KiB, 989 скачиваний)

Так же см.:
Просмотреть все файлы в папке
Как удалить макросы в книге?
Сменить формат файлов


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

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

Да! Есть решение. Оказывается можно создать макрос который открывает все файлы в папках и подпапках и вносит изменения. Это сделано. Файл в приложении.

В принципе, этот макрос уже может решить задачу. Но всё же, хочется сделать более удобную версию, которая позволит не редактировать всякий раз макрос, а просто из заполненных ячеек в первом файле перенести всю информацию в остальные 500. Т.е. сделать шаблон который внесёт изменения в остальные 500.
Более примитивно. В первом документе-шаблоне заполнены ячейки A1 = «Привет» и С8=»Пока». При выполнении макроса во все xls файлы в лист 1 в ячейку A1 вносится «Привет» а в C8 «Пока».

Предполагаемые пути решения:
Брать в цикле файлы от 1 до 500
Запускать цикл по документу-шаблону и находить в нём непустые ячейки
Вносить изменения в файл и сохранять
Конец циклов

Вопрос: Как выбрать из документа-шаблона непустые ячейки. Возможно ли это? Не перегрузится ли CPU и не будет ли бесконечный цикл, ведь по сути документ Exel это огромный пустой массив, а мне нужно только пару-тройку ячеек из небольшого диапазона?

Пакетная обработка файлов. Макрос разместить в общем модуле любой книги.

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

sPath = ThisWorkbook.Path & "files2000"

Диапазоны задаются в строках

.Range("B2:B" & lRw).Value = dValue
.Range("C2:D" & lRw).ClearContents

Значение для внесения в диапазон столбца В задано константой. Можно без нее — прописать значением в строке

.Range("B2:B" & lRw).Value = 0.3

Макрос

Sub DataChange()
Dim wBook As Workbook
Dim sPath As String
Dim sFName As String
Dim lRw As Long
Const dValue As Double = 0.3
    With Application: .ScreenUpdating = False: .DisplayAlerts = False: End With
    sPath = ThisWorkbook.Path & "files2000"

    sFName = Dir(sPath & "*.xls*", vbDirectory)

    Do While sFName <> ""
        Set wBook = Workbooks.Open(Filename:=sPath & sFName)

        With wBook
            With .Worksheets(1)
                lRw = .Cells(.Rows.Count, 1).End(xlUp).Row

                If lRw > 1 Then
                    .Range("B2:B" & lRw).Value = dValue
                    .Range("C2:D" & lRw).ClearContents
                    wBook.Save
                End If
            End With

            .Close
        End With

        sFName = Dir 
    Loop

    With Application: .ScreenUpdating = True: .DisplayAlerts = True: End With
    MsgBox "OK", 64, ""
End Sub

Определение последней строки

.Cells(.Rows.Count, 1).End(xlUp).Row - последняя видимая заполненная ячейка столбца А

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

Найти нижнюю границу по размеру пользовательского диапазона (принимаем, что в строке 1 находится «шапка» таблицы):

lRw = .UsedRange.Rows.Count

Недостаток этого варианта — в диапазон попадут все форматированные строки, в том числе и без данных (такое часто встречается при неумелом копировании: заполнено 10 строк, а диапазон — на миллион).

Диапазон заполненных строк относительно ячейки:

lRw = .Range("A1").CurrentRegion.Rows.Count

При этом должна быть уверенность, что диапазон данных неразрывен (данные не разделены пустыми строками и стобцами)

Понравилась статья? Поделить с друзьями:
  • Изменение настроек по умолчанию word
  • Изменение направления текста в excel
  • Изменение надстройки в excel
  • Изменение масштаба рисунка в word
  • Изменение месяца в excel