Макрос обновления книги excel

Время на прочтение
13 мин

Количество просмотров 10K

Всем привет! На связи Максим и я продолжаю описывать свой университетский опыт работы 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 файлов. Пока не очень понятно? Сейчас поясню подробнее!

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

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

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

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

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

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

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

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

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

Dim sourceFile As Workbook: Set sourceFile = ThisWorkbook ‘Создаем переменную, которая будет содержать в себе наш обновитель

Dim fileToUpdate As Workbook: Set fileToUpdate = Workbooks.Open("C:VBAFile To Update.xlsm")  ‘Переменная с файлом, который необходимо обновить

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

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

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

fileToUpdate.Activate 
fileToUpdate.Sheets(“Old_Sheet”).Activate

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

Range("A1").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[1]:R[9]C[1])"

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

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

Range("A2").Value = "New Text"

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

Sheets(“Old_Sheet”).Range("B1:B100").ClearContents	‘Удаление значений
Sheets(“Old_Sheet”).Range("B1:B100").ClearFormats	‘Удаление форматирования

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

Sheets(“Old_Sheet”).Cells.ClearContents

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

Sheets.Add(After:=Sheets(Sheets.Count)).Name = "New_Sheet"
Sheets("New_Sheet ").Select

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

Worksheets("New_Sheet ").Columns("C:C").Select
Selection.NumberFormat = "#,##0.00 $"

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

Worksheets("New_Sheet").Rows(1).Font.Bold = True

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

ActiveSheet.Protect ("Password")
Sheets("New_Sheet").Visible = False

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

Dim dataPivot As PivotTable : Set dataPivot = Pivot.PivotTables ( "dataPivot" )

For Each row In dataPivot.RowFields
	row.Orientation = xlHidden
Next row

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

dataPivot.PivotFields("newRow").Orientation = xlRowField

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

ActiveWorkbook.RefreshAll

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

Sheets("New_Sheet ").Buttons.Add(10,10, 110, 37.5).Select	‘Добавляем кнопку по заданным координатам в заданный лист
Selection.OnAction = "bestMakro" ‘При нажатии на кнопку будет запущен макрос с названием bestMakro
Selection.Characters.Text = "Add a new row" ‘Надпись на кнопке

With Selection.Characters(Start:=1, Length:=9).Font ‘Установка дизайна кнопки
        .Name = "Arial"
        .FontStyle = "Standard"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
End With

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

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

fileToUpdate.SaveAs "C:VBAUpdated File.xlsm"
fileToUpdate.Close false

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

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

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

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

Range("A1").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[1]:R[9]C[1])"

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

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

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

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

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

Добрый день!

У меня аналогичная задача, обновлять связи из других файлов (около сотни). Только, мне кажется, немного сложнее.

Есть файлы с данными за день, каждый отдельный файл типа: 01.12.2013.xls, 02.12.2013.xls и т.д.
Так же есть сводная месячная таблица типа: Декабрь.xls., где собираются данные за месяц из файлов по дням.

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

Естественно, что при открытии сводного файла Декабрь.xls. происходит обновление связей, и возникают ошибки, т.к. некоторых файлов еще нет. Пользователь ошибку игнорирует. И сводная таблица берет только данные из тех файлов, которые уже есть в наличии.

Использую Excel 2003.

Задача, периодически (скажем раз в 3 часа), обновлять связи и игнорировать возникающие ошибки.

И если появились новые файлы брать из них данные. Если делаю руками через меню: Правка >> Связи >> Обновить, так же возникает ошибка из-за отсутствующих файлов. Я её игнорирую, и все работает как надо.

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

Например, есть следующие файлы:
01.12.2013.xls
02.12.2013.xls
04.12.2013.xls
05.12.2013.xls
При открытии сводного файла Декабрь.xls, Excel актуализирует данные из всех доступных для чтения, в данный момент, файлов.

При выполнении макроса, обновляются только данные из файлов: 01.12.2013.xls и 02.12.2013.xls
А данные из файлов: 04.12.2013.xls и 05.12.2013.xls уже не актуализируются.

Решение, которое предложил Boroda у меня не работает.

Пробовал так же макрос, который бы открывал и снова открывал сводный файл. Но он тоже не работает. А кроме того его надо размещать в отдельном файле, что тоже не очень удобно.

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

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

Посоветуйте, пожалуйста, что можно сделать!

Skip to content

На чтение 2 мин. Просмотров 8.6k.

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

Содержание

  1. Что делает макрос
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Что делает макрос

Этот макрос — перебирает рабочие листы, а затем перебирает сводные таблицы. На каждом цикле, макрос обновляет сводную таблицу.

Код макроса

Sub ObnovitSvodnieTablici()
'Шаг 1: Объявляем переменные
Dim ws As Worksheet
Dim pt As PivotTable
'Шаг 2: Запускаем цикл через каждый лист книги
For Each ws In ThisWorkbook.Worksheets
'Шаг 3: Запускаем цикл через все сводные таблицы
For Each pt In ws.PivotTables
pt.RefreshTable
Next pt
Next ws
End Sub

Как этот код работает

  1. Шаг 1 первый объявляет объект под названием WS. Это создает контейнер памяти для каждого рабочего листа. Он также объявляет объект под названием PT, который держит
    каждую сводную таблицу.
  2. Шаг 2 просматривает все рабочие листы в этой книге. Обратите внимание, что мы используем ThisWorkbook вместо ActiveWorkbook.
  3. Шаг 3 цикл проходит через все сводные таблицы в каждом листе, а затем запускает RefreshTable метод. После макрос переходит к следующему листу. После того, как все листы были
    оценены, макрос заканчивается. ActiveWorkbook относится к книге, которая в данный момент активна.

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

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

 

Ga

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

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

Добрый день. Подскажите, в какую сторону смотреть?
Есть файл экселя, лежит в одном месте, называется одинаково. Его надо обновлять (актуализировать данные из сторонних источников) и сохранять два раза в день по расписанию.
Хочется автоматизировать.
Какую-нибудь приблуду, которая обновляет файл, а если не получится еще и журнал ошибок выдала или как-нибудь иначе отругалась.

Может кто-то встречал такое? Или в какую сторону рыть?  

 
Вариант 1 БЕСПЛАТНО ПРИ НАЛИЧИИ ЗНАНИЙ

1. Планировщик заданий в винде настраиваете на открытие этого файла в определенное время. (гугл поможет)
2. пишите макрос для файла, с реакцией на открытие и обновление данных(с созданием журнала ошибок, и прочих ваших хотелок) и закрытие файла после обновления с сохранением.

Вариант 2 БЕСПЛАТНО БЕЗ ЗНАНИЙ НО ОЧЕНЬ ТРУДОЗАТРАТНО И ПРИДЁТСЯ ВО ВСЁ ВНИКАТЬ

1. Планировщик заданий в винде настраиваете на открытие этого файла в определенное время. (гугл поможет)
2. если не знаете как всё это написать, разбиваете задачу на большое пунктов, на каждый пункт вашего не понимания 1 вопрос — 1 тема на форуме.

Вариант 3 ПЛАТНО ОСОБО ДУМАТЬ НЕ НАДО

1.Описываем желаемое подробно насколько это получится (Тех задание)
2.Идём сюда

РАБОТА ПЛАТНО

создаём тему, договариваемся с исполнителем.

Изменено: Wild.Godlike14.09.2022 14:00:05

 

JayBhagavan

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

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

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#3

14.09.2022 13:53:32

Цитата
Ga написал: Или в какую сторону рыть?

Писать подробное ТЗ и размещать в разделе «Работа». Волшебной универсальной кнопки не существует.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Ga

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

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

#4

14.09.2022 14:24:50

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

Спасибо за ответ!
Если я правильно поняла, почитав, планировщик именно откроет мне этот файл на компе, мне же надо, что бы все произошло в фоновом режиме. Что бы файл обновлялся самостоятельно. А так это от части хороший вариант, я настрою источники на обновление при открытии файла, но все же придется присутствовать. Как минимум сохранить и закрыть
Макрос внутри файла может работать по расписанию без открытия файла?
Видимо, мне нужно что-то стороннее, что будет открывать файл в фоновом режиме и потом сохранять его через определенное время.  

 

Ga

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

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

#5

14.09.2022 14:28:55

Цитата
написал:
Писать подробное ТЗ и размещать в разделе «Работа». Волшебной универсальной кнопки не существует.

JayBhagavan, если бы мне выделили бюджет на решение этой задачи, я бы так и поступила.

Сейчас меня скорее интересует есть ли уже готовые решения. Наверняка, это распространенное желание. Ты настроил отчет, но хочешь, что бы он без тебя актуализировался. Как в Power BI.

 

«приблуда», обновляющая файл любой структуры и з неизвестного количества источников неизвестной структуры будет иметь много настроек и должна довольно дорого стоить
а решение, приспособленное к вашим файлам, сохраняющее приемник 2 раза в день по расписанию и ведущее лог. ошибок при обновлении нужно написать
при отсутсвии денег на решение, время то у вас есть?
в зависимости от интереса к этому всему и настойчивости:
мой оптимистичный прогноз — у вас что-то получиться через месяц-два
пессимистический прогноз — может и за год не получиться
удачи!

Изменено: Ігор Гончаренко14.09.2022 15:29:55

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

whateverlover

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

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

#7

14.09.2022 16:05:13

Ga, у меня что-то такое наколхожено.
Сделал bat’ник с таким кодом и закинул его в планировщик. Каждый день в 5:30, он открывает мой файл, делает свои дела, сохраняет, закрывает.

Код
Call Run_macros

'запуск макроса'
Sub Run_macros()
   'запускаем Excel-процесс
   set objExcel = CreateObject ("Excel.Application")
   objExcel.Visible = true    
   Op_writ="Путь к файлу и имя файла"
   objExcel.Workbooks.Open (Op_writ)
   'запуск макроса
   objExcel.run "UpdateAll" 
   'по завершению закрываем документ. Пишем только имя файла, без пути
   objExcel.Workbooks("^_^.xlsm").Save
    objExcel.Workbooks("^_^.xlsm").Close(false)
   'закрываем Excel-процесс
    objExcel.Quit
end sub

Но надо понимать, что в Вашем случае значит «обновить файл». У меня за это отвечает макрос, который находится в файле. Я его и запускаю objExcel.run «UpdateAll».
Т.е. сложности открыть файл и закрыть по расписанию нет. Вам надо автоматизировать «обновление».

Изменено: whateverlover14.09.2022 16:09:08

 

Ga

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

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

#8

14.09.2022 16:19:50

Цитата
написал:
Ga, у меня что-то такое наколхожено.
Сделал bat’ник с таким кодом и закинул его в планировщик. Каждый день в 5:30, он открывает мой файл, делает свои дела, сохраняет, закрывает.

Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17      Call   Run_macros       'запуск макроса'    Sub   Run_macros()         'запускаем Excel-процесс         set objExcel = CreateObject (  "Excel.Application"  )         objExcel.Visible = true             Op_writ=  "Путь к файлу и имя файла"         objExcel.Workbooks.Open (Op_writ)         'запуск макроса         objExcel.run   "UpdateAll"         'по завершению закрываем документ. Пишем только имя файла, без пути         objExcel.Workbooks(  "^_^.xlsm"  ).Save          objExcel.Workbooks(  "^_^.xlsm"  ).Close(false)         'закрываем Excel-процесс          objExcel.Quit    end sub   

 
Но надо понимать, что в Вашем случае значит «обновить файл». У меня за это отвечает макрос, который находится в файле. Я его и запускаю objExcel.run «UpdateAll».
Т.е. сложности открыть файл и закрыть по расписанию нет. Вам надо автоматизировать «обновление».

Большое спасибо, с этим уже можно что-то делать! Мне надо просто «нажать «обновить все»», думаю, что найду как.

 

New

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

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

#9

14.09.2022 16:57:16

Цитата
Ga написал:
Мне надо просто «нажать «обновить все»»,
Код
ActiveWorkbook.RefreshAll
 

Ga

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

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

#10

14.09.2022 17:49:59

Цитата
написал:

Цитата
Ga написал:
Мне надо просто «нажать «обновить все»»,

 

Код
    [URL=#]?[/URL]       1      ActiveWorkbook.RefreshAll   

 

Супер! Большое спасибо!

 

Михаил Л

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

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

#11

14.09.2022 18:06:49

Прием

НА МЯСО В ПРОФИЛЕ

«Обновить все» с помощью макроса.Как это сделать,если воможно такое.


Краткость, конечно, сестра таланта, но не в Вашем случае.
«Обновить все» — что все? К какой команде или объекту это относится? _сводные_, диаграммы или еще что?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…
www.excel-vba.ru
Просто СПАСИБО [+оказать+]
Считаешь СПАСИБО мало? Яндекс.Деньги: 41001332272872; WM: R298726502453


«Обновить все» Ctrl+Alt+F5 Обновление в книге всех сведений из источников данных.Excel 2007 во вклатке «Данные»


Я так полагаю, у Вас сломался макрорекордер? Почему все так брезгуют им пользоваться?

ActiveWorkbook.RefreshAll

Да, вдруг Вы не знаете, что такое макрорекордер — почитайте здесь

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…
www.excel-vba.ru
Просто СПАСИБО [+оказать+]
Считаешь СПАСИБО мало? Яндекс.Деньги: 41001332272872; WM: R298726502453



Even we can refresh particular connection and in turn it will refresh all the pivots linked to it.

For this code I have created slicer from table present in Excel:

Sub UpdateConnection()
        Dim ServerName As String
        Dim ServerNameRaw As String
        Dim CubeName As String
        Dim CubeNameRaw As String
        Dim ConnectionString As String

        ServerNameRaw = ActiveWorkbook.SlicerCaches("Slicer_ServerName").VisibleSlicerItemsList(1)
        ServerName = Replace(Split(ServerNameRaw, "[")(3), "]", "")

        CubeNameRaw = ActiveWorkbook.SlicerCaches("Slicer_CubeName").VisibleSlicerItemsList(1)
        CubeName = Replace(Split(CubeNameRaw, "[")(3), "]", "")

        If CubeName = "All" Or ServerName = "All" Then
            MsgBox "Please Select One Cube and Server Name", vbOKOnly, "Slicer Info"
        Else
            ConnectionString = GetConnectionString(ServerName, CubeName)
            UpdateAllQueryTableConnections ConnectionString, CubeName
        End If
    End Sub

    Function GetConnectionString(ServerName As String, CubeName As String)
        Dim result As String
        result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
        '"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False"
        GetConnectionString = result
    End Function

    Function GetConnectionString(ServerName As String, CubeName As String)
    Dim result As String
    result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
    GetConnectionString = result
End Function

Sub UpdateAllQueryTableConnections(ConnectionString As String, CubeName As String)
    Dim cn As WorkbookConnection
    Dim oledbCn As OLEDBConnection
    Dim Count As Integer, i As Integer
    Dim DBName As String
    DBName = "Initial Catalog=" + CubeName

    Count = 0
    For Each cn In ThisWorkbook.Connections
        If cn.Name = "ThisWorkbookDataModel" Then
            Exit For
        End If

        oTmp = Split(cn.OLEDBConnection.Connection, ";")
        For i = 0 To UBound(oTmp) - 1
            If InStr(1, oTmp(i), DBName, vbTextCompare) = 1 Then
                Set oledbCn = cn.OLEDBConnection
                oledbCn.SavePassword = True
                oledbCn.Connection = ConnectionString
                oledbCn.Refresh
                Count = Count + 1
            End If
        Next
    Next

    If Count = 0 Then
         MsgBox "Nothing to update", vbOKOnly, "Update Connection"
    ElseIf Count > 0 Then
        MsgBox "Update & Refresh Connection Successfully", vbOKOnly, "Update Connection"
    End If
End Sub

  1. Что делает макрос
  2. Код макроса
  3. Как работает макрос
  4. Как использовать
  5. Скачать файл

Ссылка на это место страницы:
#zadacha

Ваш Excel-файл может иметь подключения к внешним источникам данных (веб-запросы, соединений MSQuery, сводные таблицы и так далее). В этих случаях было бы полезным иметь возможность автоматически обновить все связи в открытых книгах. Этот макрос представляет собой простой сценарий, который использует метод RefreshAll. Этот метод обновляет все связи в данной книге или на листе. Мы указываем всю книгу. 

Ссылка на это место страницы:
#formula

  1. Private Sub Workbook_Open()
  2. Workbooks(ThisWorkbook.Name).RefreshAll
  3. End Sub

Ссылка на это место страницы:
#kak

В данном макросе мы используем объект ThisWorkbook. Этот объект представляет собой простой и безопасный способ, чтобы указать на текущую книгу. Существует разница между Thisworkbook и ActiveWorkbook

— Объект ThisWorkbook ссылается на книгу, которая содержит код. 

— Объект ActiveWorkbook относится к книге, которая в данный момент активна. 

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

Ссылка на это место страницы:
#touse

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

1. Активируйте редактор Visual Basic, нажав ALT + F11
2. В окне проекта найдите свой проект/имя рабочей книги и нажмите на знак плюс рядом с ним в чтобы увидеть все листы и модуль ЭтаКнига
3. Правой кнопкой мыши нажмите на модуле ЭтаКнига и выберите View Code 
4. В левой верхней части окна выберите объект WorkBook (Excel автоматом предложит написать макрос для события Workbook_Open, если нет, то выполните п.5 
5. В правом верхнем выпадающем списке выберите событие Open

Ссылка на это место страницы:
#file

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

1. Введите свою почту

2. Нажмите Зарегистрироваться

3. Обновите страницу
Вместо этого блока появится ссылка для скачивания материалов.

Привет! Меня зовут Дмитрий. С 2014 года Microsoft Cretified Trainer. Вместе с командой управляем этим сайтом. Наша цель — помочь вам эффективнее работать в Excel. 

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

Подписывайтесь на нас в соц.сетях:

0 / 0 / 0

Регистрация: 05.05.2012

Сообщений: 6

1

Как написать макрос на обновление данных из одной книги в другую

10.05.2012, 21:35. Показов 20707. Ответов 16


Студворк — интернет-сервис помощи студентам

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



0



mc-black

2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

11.05.2012, 17:22

2

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

Visual Basic
1
Workbooks("КнигаКуда.xls").Worksheets("ЛистКуда").Cells(3,1).Value = Workbooks("КнигаОткуда.xls").Worksheets("ЛистОткуда").Cells(1,5).Value

Это пример переноса значения ячейки в первой строке пятого столбца из листа «ЛистОткуда» книги «КнигаОткуда.xls» в ячейку в третьй строке и первом столбце на листе «ЛистКуда» книги «КнигаКуда.xls»



0



Dragokas

Эксперт WindowsАвтор FAQ

17993 / 7619 / 890

Регистрация: 25.12.2011

Сообщений: 11,352

Записей в блоге: 17

11.05.2012, 21:33

3

Ну можете, если короче сделать по аналогии так:

Visual Basic
1
2
3
set Rfrom=Workbooks("КнигаОткуда.xls").sheets("ЛистОткуда")
set Rto=Workbooks("КнигаКуда.xls").sheets("ЛистКуда")
Rto.[A3]=Rfrom.[E1]

Или вариант для копирования из активной книги:

Visual Basic
1
2
3
with Workbooks("КнигаКуда.xls").sheets("ЛистКуда")
    .cells(3,1)=cells(1,5) 'или .cells(3,1)=activeworkbook.sheets("ЛистОткуда").cells(1,5)
end with

копирование из книги, в которой выполняется (из которой запущен) код (не важно активна она или нет):

Visual Basic
1
2
3
with Workbooks("КнигаКуда.xls").sheets("ЛистКуда")
   .range("A3")=thisworkbook.range("E1")
end with

Операторы обращения к ячейкам специально писал по-разному (все это аналоги, можно комбинировать).



0



0 / 0 / 0

Регистрация: 05.05.2012

Сообщений: 6

12.05.2012, 02:19

 [ТС]

4

mc-black, а как написать, чтоб вся строка изменялась, не указывать допустим столбец?



0



mc-black

2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

12.05.2012, 16:12

5

Не вся наверное строка, а первые сколько-то столбцов? Ведь у вас не все же столбцы листа задействованы?

Visual Basic
1
2
3
4
5
    ' Скопирует первые 50 столбцов в 5-й строке одной книги
    ' в первые 50 столбцов 7-й строки другой книги (включая форматирование ячеек)
    With Workbooks("КнигаОткуда.xls").Worksheets("ЛистОткуда")
        .Range(.Cells(5, 1), Cells(5, 50)).Copy Destination:=Workbooks("КнигаКуда.xls").Worksheets("ЛистКуда").Cells(7, 1)
    End With



0



0 / 0 / 0

Регистрация: 05.05.2012

Сообщений: 6

12.05.2012, 16:23

 [ТС]

6

У меня допустим два xls файла, содержимое одинаковое практически.. вот и надо чтоб если я обновила данные в каком-то столбце, в какой-то строке.. чтоб автоматически обновлялись, а не вводить в макросе всё время строку и столбец.



0



2784 / 716 / 106

Регистрация: 04.02.2011

Сообщений: 1,443

12.05.2012, 16:29

7

Ну это надо написать в обработчике событий листа при изменении. Вообще на мутные формулировки не может быть точных ответов. Объяснили бы для чего это нужно и как должно работать, приложили бы пример файлов. А так всё ни о чём.



0



Dragokas

Эксперт WindowsАвтор FAQ

17993 / 7619 / 890

Регистрация: 25.12.2011

Сообщений: 11,352

Записей в блоге: 17

12.05.2012, 20:42

8

В модуль листа

Visual Basic
1
2
3
Private Sub Worksheet_Change(ByVal Target As Range)
Range(Target.Address).Copy Destination:=Sheets("Ëèñò2").Range(Target.Address)
End Sub

Копирует на «Лист2» в ту же позицию все изменения в содержании ячеек, происходящие на активном листе.
Тоже самое и между книгами.



0



0 / 0 / 0

Регистрация: 30.10.2013

Сообщений: 3

30.10.2013, 11:22

9

Помогите пожалуйста чайнику. Заранее прошу не закидывать тапками (( Суть вопроса: есть файл excel условно «Книга1» я его в него ежедневно вношу изменения, ведётся учет расходов. Другому пользователю нужно просматривать этот файл, но так чтобы он там ничего не натыкал, иначе получится каша. Защитой книги пробовал воспользоваться, но постоянно нужно тыкать пароль, на что уходит много времени. Возможно ли сделать кнопку по которой все данные со всех листов «Книги1» копировались в «Книгу2» расположенную на другом компе в сети и там сохранялись. Или каждый раз при сохранении «Книги1» на другом компе автоматически создавался файл «Книга2» с заменой предыдущего.
Я думаю первый вариант проще. Копировать нужно все данные, ячейки, листы, макросы и т.д. Заранее спасибо!!!



0



Султанов

53 / 38 / 3

Регистрация: 25.01.2013

Сообщений: 368

30.10.2013, 11:48

10

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

Добавлено через 11 минут

Цитата
Сообщение от MihailV
Посмотреть сообщение

Или каждый раз при сохранении «Книги1» на другом компе автоматически создавался файл «Книга2» с заменой предыдущего.

Visual Basic
1
2
3
MyFile = "C:Книга1.xls"
OtherFile = "C:DirectorКнига2.xls"
FileCopy MyFile, OtherFile

Добавлено через 2 минуты
вот ещё кое-что нашел — Сохранение копии активной книги в заранее указанную папку
Расположите код в любом стандартном модуле личной книги макросов «Personal.xls» Затем создайте кнопку на панели инструментов. Нужная кнопка представляет команду Настраиваемая кнопка расположенную в категории Макросы. После чего, необходимо назначить созданной кнопке наш макрос.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Sub ActiveWorkbook_SaveCopyAs()
    iPath$ = "C:Мои документыАрхив"
    'Укажите свою папку для сохранения копии активной книги
 
    If ActiveWorkbook Is Nothing Then
       MsgBox "В настоящий момент нет активной книги", vbExclamation, ""
       Exit Sub
    End If
    If Dir(iPath$, vbDirectory) = "" Then
       MsgBox "Указанная папка " & iPath$ & vbNewLine & _
       "была удалена, перемещена или переименована ", vbExclamation, ""
       Exit Sub
    End If
 
    iFileName$ = ActiveWorkbook.Name
    iPath$ = iPath$ & IIf(Right(iPath$, 1) = "", "", "")
    iSaveTime$ = Format(Now, "_dd/mm/yyyy_hh-mm-ss"".xls""")
 
    If ActiveWorkbook.Path <> "" Then
       iFileName$ = Left(iFileName$, Len(iFileName$) - 4) & iSaveTime$
    Else
       iFileName$ = iFileName$ & iSaveTime$
    End If
 
    ActiveWorkbook.SaveCopyAs Filename:=iPath$ & iFileName$
End Sub



1



0 / 0 / 0

Регистрация: 30.10.2013

Сообщений: 3

30.10.2013, 15:42

11

Султанов, спасибо за ответ, пробовал совместный доступ настроить, получается так что второй пользователь может внести изменения, а я потом могу как бы просмотреть их и отменить, но это тоже не вариант каждый раз проверять.
MyFile = «C:Книга1.xls»
OtherFile = «C:DirectorКнига2.xls»
FileCopy MyFile, OtherFile
пробовал этот код вставить в VB
ничего не получилось, может что то не так делаю.
С последним кодом тоже не вышло(((
Если не затруднит, сделайте плз образец



0



Султанов

53 / 38 / 3

Регистрация: 25.01.2013

Сообщений: 368

30.10.2013, 18:26

12

MihailV,

Visual Basic
1
2
3
4
5
Sub fg()
MyFile = "C:Книга1.xlsx"
OtherFile = "C:Книга2.xlsx"
FileCopy MyFile, OtherFile
End Sub

работает

Добавлено через 4 минуты
MihailV,
второй код тоже проверил, работает на ура, не могу вставить скриншоты для наглядности

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Sub ActiveWorkbook_SaveCopyAs()
    iPath$ = "C:Documents and SettingsАдминистраторМои документы"
    'Укажите свою папку для сохранения копии активной книги
 
    If ActiveWorkbook Is Nothing Then
       MsgBox "В настоящий момент нет активной книги", vbExclamation, ""
       Exit Sub
    End If
    If Dir(iPath$, vbDirectory) = "" Then
       MsgBox "Указанная папка " & iPath$ & vbNewLine & _
       "была удалена, перемещена или переименована ", vbExclamation, ""
       Exit Sub
    End If
 
    iFileName$ = ActiveWorkbook.Name
    iPath$ = iPath$ & IIf(Right(iPath$, 1) = "", "", "")
    iSaveTime$ = Format(Now, "_dd/mm/yyyy_hh-mm-ss"".xls""")
 
    If ActiveWorkbook.Path <> "" Then
       iFileName$ = Left(iFileName$, Len(iFileName$) - 4) & iSaveTime$
    Else
       iFileName$ = iFileName$ & iSaveTime$
    End If
 
    ActiveWorkbook.SaveCopyAs Filename:=iPath$ & iFileName$
End Sub

Добавлено через 4 минуты
в первом варианте MihailV, у меня существует Книга1, я делаю дубликат под названием Книга2
во втором варианте активная (открытая книга) сохраняется по указанному пути с добавление даты и времени в наименование файла
оба варианта работают
назначить на любой из вариантов кнопку думаю не составит труда



1



0 / 0 / 0

Регистрация: 30.10.2013

Сообщений: 3

01.11.2013, 09:37

13

Султанов, спасибо огромное за помощь! Сейчас попробую ещё раз



0



zanafar

0 / 0 / 0

Регистрация: 13.11.2013

Сообщений: 15

13.11.2013, 15:33

14

Я прошу прощения за флуд, но не стал флудить ещё больше создавая новую тему, тем более, что вопрос связан именно с этим макросом.

Цитата
Сообщение от Султанов
Посмотреть сообщение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Sub ActiveWorkbook_SaveCopyAs()
    iPath$ = "C:Documents and SettingsАдминистраторМои документы"
    'Укажите свою папку для сохранения копии активной книги
 
    If ActiveWorkbook Is Nothing Then
       MsgBox "В настоящий момент нет активной книги", vbExclamation, ""
       Exit Sub
    End If
    If Dir(iPath$, vbDirectory) = "" Then
       MsgBox "Указанная папка " & iPath$ & vbNewLine & _
       "была удалена, перемещена или переименована ", vbExclamation, ""
       Exit Sub
    End If
 
    iFileName$ = ActiveWorkbook.Name
    iPath$ = iPath$ & IIf(Right(iPath$, 1) = "", "", "")
    iSaveTime$ = Format(Now, "_dd/mm/yyyy_hh-mm-ss"".xls""")
 
    If ActiveWorkbook.Path <> "" Then
       iFileName$ = Left(iFileName$, Len(iFileName$) - 4) & iSaveTime$
    Else
       iFileName$ = iFileName$ & iSaveTime$
    End If
 
    ActiveWorkbook.SaveCopyAs Filename:=iPath$ & iFileName$
End Sub

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



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

13.11.2013, 16:56

15

Этот макрос называется ActiveWorkbook_SaveCopyAs, что можно перевести как «сохранение копии активной книги под другим именем».
Так что (как надеюсь теперь понятно) не получится сделать «чтобы этот макрос не копировал всю страницу»,

Вам нужен совершенно другой макрос. Из этого макроса даже кажется кроме End Sub и нечего взять



0



0 / 0 / 0

Регистрация: 13.11.2013

Сообщений: 15

14.11.2013, 11:46

16

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Этот макрос называется ActiveWorkbook_SaveCopyAs, что можно перевести как «сохранение копии активной книги под другим именем».
Так что (как надеюсь теперь понятно) не получится сделать «чтобы этот макрос не копировал всю страницу»,

Вам нужен совершенно другой макрос. Из этого макроса даже кажется кроме End Sub и нечего взять

Хорошо, тогда не могли бы Вы подсказать решение для моей проблемы? я знаю что оно существует.

Добавлено через 27 минут
Оказывается всё очень просто… С копированием разобрался. А как сделать так, чтобы при выполнении макроса он открывал файл сам? чтобы в начале исполнения была 1 открытая книга. Т.е — «Выделение столбцов и сток» — «Копирование» — «Открытие второй книги» — «Обновление данных»

Добавлено через 2 часа 46 минут
Проблему решил)



0



0 / 0 / 0

Регистрация: 27.05.2020

Сообщений: 1

27.05.2020, 18:14

17

Добрый день, подскажите пожалуйста, как создать кнопку ла листе в Excel, чтобы при нажатии на нее данные из одной книги Excel и переносились в другую книгу ?
Причем, в двух книгах два параметра: Название строки и значения к Названиям (к каждой строки свое значение). Необходимо, чтобы Макрос искал одинаковые Названия строки из 1-й Книги Excel и если Название совпадает с Названием строки из 2-й книги, он подставлял нужное Значение из 1-й Книги Excel в Значение 2-й Книги.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

27.05.2020, 18:14

Помогаю со студенческими работами здесь

Копирование данных из одной книги в другую
Всем привет! Мне нужно скопировать данные из 4 таблиц из одной книги в одну общую таблицу в…

Копирование данных из одной книги в другую
Добрый день, форумчане!

Продолжаю писать свой макрос и опять не получается некоторая операция.

Перенос данных из одной книги в другую
как вытащить данные из исходной таблицы и поместить их в итоговую с помощью макросов.Исходная…

Перенос данных из одной книги в другую
Уважаемые форумчане, с Наступающим Новым годом!:)

Помогите, пожалуйста, решить задачку. Есть…

Макрос копирование данных из одной книги в другу, по выбору
Доброе утро, помогите с макросом, копирование данных из одной книги в другу, по выбору. Т.е. при…

Экспорт данных из одной книги excel в другую
Коллеги, возникла довольно трудная для меня задача. Итак, что требуется.

В CRM есть…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

17

Понравилась статья? Поделить с друзьями:
  • Макрос номер ячейки excel
  • Макрос начать запись excel
  • Макрос названия листов в книге excel
  • Макрос нажатия клавиш excel
  • Макрос нажатия enter в excel