Страницы: 1
RSS
Макрос для копирования макросов из одной книги в другую, без привязки к первой
 
Добрый день!  
 
Перерыл кучу тем и форумов, так и не нашёл ответа. Нашёл здесь работающий макрос для панели, но он не подошёл под мою ситуацию. Ещё нашёл вариант пользоваться personal.xlsb, тоже, кажется не вариант.  
 
Суть - есть уже почти полностью готовый инструмент на Экселе по созданию новой книги с формулами, оформлением и прочим. Единственное, что осталось - научить этот инструмент переносить в новую книгу часть макросов, которая там нужна.  
 
Макросы я переношу простым кодом  
 
ActiveWorkbook.VBProject.VBComponents("Module1").Export ("c:\Module1.bas")  
Application.VBE.ActiveVBProject.VBComponents.Import ("c:\Module1.bas")  
Kill ("c:\Module1.bas")  
 
Макрос успешно переносится, но!  
 
Графическая кнопка (по сути - форма прямоугольника) на листе имеет привязку к этому макросу. При копировании листа с кнопкой, затем экспорта-импорта модуля, кнопка остаётся привязанной к первому документу. Убрать бы путь (и тут меня можно ткнуть в тему, про убирание пути у панели макросов - но, я ж пишу, к этой кнопке он не работает, к VB кнопке, кстати, тоже).  
 
Personal.xlsb тоже не вариант - поскольку документ должен быть использован на бесчисленном множестве компьютеров. Или научите принудительно импортировать эти модули в личную книгу каждого пользователя.  
 
Как реализовать этот программный перенос макроса?
 
Плохо понял... Если кнопка привязана к макросу, например, Макрос1, и Вы импортировали этот макрос, то этот макрос и сработает по этой кнопке. Если не так, то что нужно?
 
Есть файл с уже имеющейся кнопкой, привязанной к макросу в этом файле. Макрос переносится в новый файл посредством команды экспорта, импорта, кнопка, вместе с листом, так же переносятся в новый файл.  
 
Получается, что в новом файле и кнопка есть, и макрос есть, но по нажатию кнопки открывается старый файл, потому что привязка кнопки к старой копии макроса сохраняется. Вот как её не сохранять?
 
Варианты:  
1. Макрос в модуль листа и копировать целиком лист в новый файл.  
2. На кнопку назначить нейтральный (промежуточный) макрос с одной строкой:  
Call Макрос1  
Предполагается, что этот Макрос1 будет импортироваться со стандартным модулем.
 
хм, хорошая идея  
попробую завтра, отпишусь
 
Попробовал.  
Переношу макросы в лист, делаю привязку кнопок к макросам в листе. Создаётся новый документ - привязка к старому всё равно.  
С промежуточными макросами та же самая фигня :(
 
Сделал на листе две кнопки, код в листе.  
Зашёл в скриптэдитор в 2003, нашёл название файла у одной из кнопок, удалил.  
Проверил - обе кнопки работают.  
Сохранился.  
Скопировал вручную лист в новую книгу - одна кнопка вызывает код из новой книги, вторая из первой книги.  
Т.е. если предварительно файл подготовить - то получится.  
Но думаю должен быть и другой вариант.
 
Я тоже об этом думал, но тут невозможно удалять вручную.  
Сейчас пишу макрос, чтобы он менял название макроса, убирая путь.  
Пока не работает (
 
Я понял, что изначально есть файл, из которого нужно кодом скопировать лист с макросами и кнопками.  
Почему этот файл нельзя заранее вручную подготовить?
 
Нет. Есть файл, который создаёт новую книгу с макросами и кнопками. Считайте это книгой-инструментом, которая создаёт книгу с макросами и кнопками. Какой она будет - выбирает пользователь, поэтому заранее подготовить нельзя.  
 
Я додумался, что менять пути макроса можно. НО! Макрос запускается из старой книги, которая в процессе работы закрывается. Почему-то в новой изменения не происходят - где я ошибаюсь, не подскажите? Вот сокращенный код:  
 
Application.ScreenUpdating = False  
ActiveWorkbook.VBProject.VBComponents("Module1").Export ("c:\Module1.bas")  
   Sheets(Array("Scorecard", "Reserved", "CopyData")).Select  
   Sheets(Array("Scorecard", "Reserved", "CopyData")).Copy  
Workbooks("TM Scorecard Builder - копия.xlsm").Close (False)  
Application.VBE.ActiveVBProject.VBComponents.Import ("c:\Module1.bas")  
Kill ("c:\Module1.bas")  
   ActiveSheet.Shapes.Range(Array("Bevel 11")).Select  
   Selection.OnAction = "Лист1.SCAs"  
Application.ScreenUpdating = True  
 
Что я думал делаться должно?  
 
1) Блокируется экран  
2) Экспорт модуля  
3) Выбор и копирование листов  
4) Закрытие старой книги без сохранения  
5) Импорт модуля  
6) Удаление экспортированного модуля  
7) Выбор и замена назначенного макроса  
8) Разблокировка экрана  
 
Как это работает на самом деле  
 
1) Блокируется экран  
2) Экспорт модуля  
3) Выбор и копирование листов  
4) Закрытие старой книги без сохранения  
5) Импорт модуля  
6) Удаление экспортированного модуля  
7) Разблокировка экрана  
 
То бишь, как я вижу, переназначение просто не происходит. Почему??? Моё подозрение в том, что сначала надо выбрать вновь созданную книгу - но как?  
 
предварительное удаление файла из пути ничего не даёт  
он вовзращается автоматически при копировании листов
 
Заметил интересное - если листы не скопировать, а переместить в новую книгу, то все пути макросов переназначаются автоматически. Но при этом всё после команды перемещения (а именно импорт модулей с макросами) не происходит.
 
А если попробовать СНАЧАЛА импорт?
 
всё  
и правда  
сначала обработка, потом закрытие книги  
это решило проблему :)  
урааа, работает
Страницы: 1
Читают тему
Наверх