Ситуация, наверное, типичная… Я юзаю два компа: один на работе (под ХРюшей), другой дома (Виста). На обоих компах Excel-2003. Большую часть макросов в Personal.xls и доработок панелей управления (наделал много своих кнопочек для вызова макросов, своих менюшек со своими кнопочками, своих кнопочек в стандартных менюшках...) делаю на работе :-) Хочется и дома иметь такой же настроенный "под себя" Excel, как и на работе. Но к сожалению просто тупо подложить домашнему Ёкселю файл Excel11.xlb вместе с папочкой XLSTART нельзя, т.к. не совпадают пути к макросам, лежащим в Personal.xls А сидеть и просто в режиме настройки перепрописывать макросы, прикреплённые к каждой кнопочке жутко лень. The_Prist в топике "Перенос макросов на другой комп с изменением путей доступа к ним" ( http://www.planetaexcel.ru/forum.php?thread_id=19743 ) предлагал делать это макросом, который пройдётся циклом по всем кнопочкам менюшек и исправит у них путь, прописанный в OnAction: Sub Replace_Personal() ' перенос макросов и настройки видимых панелей на другой компьютер Const NewPath$ = "'C:\Users\MyNewUserName\AppData\Roaming\Microsoft\Excel\XLSTART\PERSONAL.XLS'!" ' если переносить на Vista 'Const NewPath$ = "'C:\Documents and Settings\MyNewUserName\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLS'!" ' если переносить на XP Dim cmdBar As Object, iBtn As Object, sPath$ For Each cmdBar In Application.CommandBars If cmdBar.Visible Then For Each iBtn In cmdBar.Controls On Error Resume Next sPath = iBtn.OnAction If Len(sPath) > 0 Then If InStr(1, sPath, "'!", 1) > 0 Then iBtn.OnAction = NewPath & Mid(sPath, InStr(1, sPath, "!", 1) + 1) End If Next iBtn End If Next cmdBar End Sub
Пробовал. Работает, но не полностью : переписывает пути только у тех кнопочек, которые видны на экране, а у тех кнопочек, которые не видны - нет. Попробовал убрать If cmdBar.Visible Then … - почему-то не помогло :-( Всё равно не правятся пути у кнопочек, спрятанных в недрах выпадающих менюшек... У кого-нибудь есть идеи, как "подпилить"?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Спасибо, Дмитрий. Будем попробовать. А что касается программно создаваемых меню и кнопок, то я не настолько крут чтобы это широко применять. Поэтому все кнопочки и менюшки у меня созданы вручную.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Говорит, что объект не поддерживает данное свойство или метод. Решил, что Дмитрий ошибся в значении параметра при проверке того, что это субменю. Посмотрел в справке, увидал, что могут быть 3 значения MsoBarType: msoBarTypeNormal == 0 msoBarTypeMenuBar == 1 msoBarTypePopup == 2
Заменил в коде: If iBtn.Type = 1 Then ' msoBarTypeMenuBar
Всё равно затыкается в коде на том же месте - For Each oSubBtn In iBtn
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Я Дмитрия-таки домучил на его сайте :) (<EM>http://www.excel-vba.ru/forum/index.php?topic=72</EM>) The-Prist доделал макрос, перепрописывающий у самодельных кнопок панелей управления все пути к макросам, лежащим в Personal.xls, при переносе на другой компьютер. А я его "покрыл лачком" и оформил в отдельный файл. Отлично работает. Очень удобно стало синхронизировать рабочий и домашний Ёксели.
Вот, посмотрите, кому интересно. Может пригодиться.
{quote}{login=Alex_ST}{date=15.05.2011 10:46}{thema=}{post}Я Дмитрия-таки домучил на его сайте :) (<EM>http://www.excel-vba.ru/forum/index.php?topic=72</EM>) The-Prist доделал макрос, перепрописывающий у самодельных кнопок панелей управления все пути к макросам, лежащим в Personal.xls, при переносе на другой компьютер. А я его "покрыл лачком" и оформил в отдельный файл. Отлично работает. Очень удобно стало синхронизировать рабочий и домашний Ёксели.
Вот, посмотрите, кому интересно. Может пригодиться.{/post}{/quote}
спасибо, Алексей. и Вам, и, особенно, Дмитрию. пригодится, конечно.
но у меня вопрос, если можно (файл не смотрел еще, если честно). а можно будет использовать этот макрос для разных версий Excel'я? если у меня дома 2003-й, а на работе 2002-й?
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
С 2003 уже давненько не работал,но когда работал для переноса с кнопками и надстройками использовал штатный "мастер сохранения настроек". проблем не было. единственный минус наверное что нельзя перенести настройки только excel, но поскольку кроме него я ничего и не использовал ,то было не критично.
Я тут ещё чуть подпилил - сделал так, чтобы не вводить руками новый путь (он теперь вычисляется по расположению Personal.xls Намного удобнее стало
Но всё равно меня гложут подозрения, что можно упростить - уж очень похожи циклы в процедурах Replace_Personal и Popup_Btns А нельзя ли как-то избавиться от цикла For Each oBtn In oCmdBar.Controls …Next oBtn в процедуре Replace_Personal, заменив его вызовом Popup_Btns?
Тогда и оформлять ReplaceOnActionPath отдельной процедурой не будет необходимости, а можно будет её код внедрить в код процедуры Popup_Btns
Дмитрий, если бы всё было так просто, я бы и не спрашивал. Я так уже пробовал делать - почему-то далеко не все кнопки и менюшки обрабатываются - примерно 30-40% Я для проверки вместо действительной замены OnAction делал Debug.Print нового OnAction. Посмотрите в приложенном примере, пожалуйста.
Дмитрий, вы как всегда правы.:) Перенёс On Error Resume Next в рекурсивную функцию и всё заработало. Осталось чуть подправить условие замены чтобы не все пути менялись, а только пути к Personal.xls (на всякий случай, чтобы не портились пути к макросам надстроек) Это не сложно. Сделаю сам. Сейчас подкинули срочную работу. Придётся отвлечься. Допилю - выложу финальный результат.
Ну вот, теперь уже, кажется, финальный вариант :) Путь в OnAction теперь меняется только у тех кнопок, которые ссылаются на макросы, расположенные в Personal.xls Да и путь к Personal.xls самостоятельно вбивать в ячейки нет необходимости.
А код, кстати, получился компактный настолько, что его можно даже просто модулем в Personal.xls хранить и при необходимости прямо в нём и запускать.