Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
28.03.2024, 23:03:13

Войти
На форуме добавлена возможность подписки на RSS-ленты любого раздела форума. Подписаться можно, нажав на иконку RSS , расположенную левее наименования раздела.
33 233 Сообщений в 5 454 Тем от 6 750 Пользователей
Последний пользователь: Alex1210
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Полезные решения
| | |-+  Как перенести настройки Excel на другой компьютер?
Страниц: 1 2 [Все]   Вниз
Печать
Автор Тема: Как перенести настройки Excel на другой компьютер?  (Прочитано 54655 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« : 13.05.2011, 19:18:00 »

Ситуация, наверное, типичная…
Я юзаю два компа: один на работе (под ХРюшей), другой дома (Виста). На обоих компах Excel-2003.
Большую часть макросов в Personal.xls и доработок панелей управления (наделал много своих кнопочек для вызова макросов, своих менюшек со своими кнопочками, своих кнопочек в стандартных менюшках...) делаю на работе  Подмигивающий
Хочется и дома иметь такой же настроенный "под себя" Excel, как и на работе.
Но к сожалению просто тупо подложить домашнему Ёкселю файл Excel11.xlb вместе с папочкой XLSTART нельзя, т.к. не совпадают пути к макросам, лежащим в Personal.xls
А сидеть и просто в режиме настройки перепрописывать макросы, прикреплённые к каждой кнопочке жутко лень.
The_Prist на Планете в топике "Перенос макросов на другой комп с изменением путей доступа к ним" предлагал делать это макросом, который пройдётся циклом по всем кнопочкам менюшек и исправит у них путь, прописанный в 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 …
- почему-то не помогло  Грустный
Всё равно не правятся пути у кнопочек, спрятанных в недрах выпадающих менюшек...
У кого-нибудь есть идеи, как "подпилить"?
Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #1 : 13.05.2011, 19:28:53 »

Что ж, Алексей, отвечу и здесь Улыбка Возможно, надо еще по вып.меню шариться. Но необходимо знать, где именно они расположены. Если это меню создано программно(как и кнопки), то надо еще делать проверку:

Код:
    For Each cmdBar In Application.CommandBars
        If cmdBar.Visible Then
            For Each iBtn In cmdBar.Controls
                If iBtn.Type <> 1 Then
                    For Each oSubBtn In iBtn
                        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 oSubBtn
                End If
                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

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #2 : 13.05.2011, 20:04:27 »

Спасибо, Дмитрий.
Будем попробовать.
А что касается программно создаваемых меню и кнопок, то я не настолько крут чтобы это широко применять. Поэтому все кнопочки и менюшки у меня созданы вручную.
Записан

С уважением, Алексей
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #3 : 14.05.2011, 22:14:57 »

Не идёт.
Затыкается на строке
Код:
For Each oSubBtn In iBtn
Говорит, что объект не поддерживает данное свойство или метод.
Решил, что вы ошиблись в значении параметра при проверке того, что это субменю. Посмотрел в справке, увидал, что могут быть 3 значения MsoBarType:
msoBarTypeNormal == 0
msoBarTypeMenuBar == 1
msoBarTypePopup == 2

Заменил в коде:
Код:
If iBtn.Type = 1 Then ' msoBarTypeMenuBar
Всё равно затыкается в коде на том же месте -
Код:
For Each oSubBtn In iBtn
Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #4 : 14.05.2011, 22:41:12 »

На самом деле правильней вообще так:
If iBtn.Type > 2 Then
т.к. 3 и 4 это типы с подменю. Спотыкаеться может потому, что у Вас не совсем так созданы кнопки. Я говорил про созданные через надстройки. Предложил как вариант. Возможно у созданных вручную конструктором меню немного другие свойства. Надо будет завтра поэкспериментировать. Правда только в том случае, если Алексей раскроет секрет того, как именно пошагово создаются эти выпадающие меню(и создаются ли).
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #5 : 15.05.2011, 10:23:00 »

Все действия по ручной настройке интерфейса Еxcel "под себя" произведены в режиме настройки и абсолютно стандартны.
Есть такие типы самодельных элементов:
1. Постоянно видимая на любой из стандартных панелей управления кнопка для вызова своего макроса (надеюсь, как её сделать в режиме настройки из "болванки"-смайлика  Улыбка пошагово объяснять не нужно?)
2. Кнопка для вызова своего макроса, вставленная в одно из стандартных выпадающих меню одной из стандартных панелей. Например, в меню "Сервис" у меня вставлена кнопочка вызова макроса NoDupes_InRange (не вам и не мне объяснять, что этот макрос делает Улыбка )
3. Самодельное раскрывающееся меню, постоянно видимое на одной из стандартных панелей  Меню сделано опять же стандартно "ручками" в режиме настройки из элемента "новое меню".
4. Самодельное раскрывающееся меню с кнопками для вызова своих макросов, встроенное в одно из стандартных раскрывающихся меню одной из стандартных панелей Например, в меню "Вставить" у меня после стандартного пункта "Формулу..." добавлено своё меню "UDF...", внутри которого размещены кнопки для вызова макросов, вставляющих в выбранную ячейку наиболее нужных мне UDF-ок.
Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #6 : 15.05.2011, 10:44:45 »

Тогда все просто:
Код:
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$, oSubBtn As Object
    For Each cmdBar In Application.CommandBars
        If cmdBar.Visible Then
            Debug.Print cmdBar.Name
            For Each iBtn In cmdBar.Controls
                On Error Resume Next
                If iBtn.Type = 10 Then
                    For Each oSubBtn In iBtn.Controls
                        sPath = oSubBtn.OnAction
                        If Len(sPath) > 0 Then
                            If InStr(1, sPath, "'!", 1) > 0 Then oSubBtn.OnAction = NewPath & Mid(sPath, InStr(1, sPath, "!", 1) + 1)
                        End If
                    Next oSubBtn
                Else
                    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
                End If
            Next iBtn
        End If
    Next cmdBar
End Sub

Вроде должно работать.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #7 : 15.05.2011, 12:35:21 »

Дмитрий, спасибо.
Уже ПОЧТИ полностью работает.
Остались проблемы:
1. Если какое-то меню в момент не открыто (например, меню "рисование" или "конструктор"), то в нем OnAction и не исправляется. Сразу же по ходу и вопрос: а почему в макросе обрабатываются только видимые панели инструментов? (If cmdBar.Visible Then...)
В общем попробовал этот If cmdBar.Visible убрать. В скрытых панелях инструментов мои кнопочки на панелях заработали!
Так что этот мелкий трабл я поборол  Улыбка
2. Не работают кнопки в самодельных раскрывающихся меню, встроенных в стандартные раскрывающиеся меню.
Я так понимаю, что это уже вложение следующего уровня - не oSubBtn, а oSubSubBtn  Улыбка
и его нужно тоже обрабатывать аналогично.
Мог бы попробовать написать и сам, но к сожалению, не нашёл ничего в справке про проверяющийся номер типа: If iBtn.Type = 10, хотя можно было бы сделать и по аналогии... Но не люблю использовать и писать макросы, которые не понимаю как работают  Непонимающий
Честно говоря, к тому же боюсь запутаться во вложенных циклах Обеспокоенный
« Последнее редактирование: 15.05.2011, 12:37:57 от Alex_ST » Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #8 : 15.05.2011, 12:51:07 »

1. Эта строка осталась как пережиток с изначальной темы. Там кнопки были все видимые и данную строку я применил для ускорения работы кода.
2. Как вариант применить рекурсию

Код:
Option Explicit

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 sPath As String
Sub Replace_Personal()   ' перенос макросов и настройки видимых панелей на другой компьютер
    Dim cmdBar As Object, iBtn As Object, oSubBtn As Object
    For Each cmdBar In Application.CommandBars
        For Each iBtn In cmdBar.Controls
            On Error Resume Next
            If iBtn.Type = 10 Then
                Call Popup_Btns(iBtn.Controls)
            Else
                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
            End If
        Next iBtn
    Next cmdBar
End Sub
Function Popup_Btns(oSubPopupBtns As Object)
    Dim oSubBtn As Object, iBtn As Object
    For Each oSubBtn In oSubPopupBtns
        If oSubBtn.Type = 10 Then
            Call Popup_Btns(oSubBtn.Controls)
        Else
            sPath = oSubBtn.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
        End If
    Next oSubBtn
End Function
« Последнее редактирование: 15.05.2011, 12:53:11 от The_Prist » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #9 : 15.05.2011, 13:58:17 »

Спасибо. Покручу, рассмотрю со всех сторон...
Уж больно циклы в макросе и в рекурсивной функции похожи... Кажется мне, что это можно в один макрос объединить... Да и использовать глобальные переменные я не шибко люблю.
Обязательно ближе к вечеру попробую ваш вариант.
А потом, если заработает, "подпилю" немножко. Вдруг удастся упростить и обойтись без глобальных переменных?
К тому же я не думаю, чт о кому-то где-то взбредёт в голову делать раскрывающиеся меню с большим числом уровней вложений… Может, обойтись, например, 3-мя - 4-мя? Боюсь я рекурсий - от них и до бесконечного цикла недалеко Улыбка
Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #10 : 15.05.2011, 14:03:42 »

Алексей - грамотная рекурсия не страшна, а порой очень даже необходима. Если в данном коде её не применять - то придется делать доп.проверки на наличие вып.меню в коде и вкладывать циклы внутрь каждой из них. Код раздуется и будет трудночитаем. Именно в построенных таким образом процедурах впоследствии очень трудно разбираться. Так что не бойтесь рекурсий - они могут вызвать утечку памяти только при большой вложенности и неверной организации работы циклов.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #11 : 15.05.2011, 17:56:19 »

А всё-таки, я так и не смог найти в справке никаких других типов элементов панелей управления кроме
msoBarTypeNormal == 0
msoBarTypeMenuBar == 1
msoBarTypePopup == 2
а что такое iBtn.Type = 10, так и не нашёл  В замешательстве
Или не так искал Непонимающий
Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #12 : 15.05.2011, 18:03:16 »

Это тип контрола. Popup.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #13 : 15.05.2011, 18:17:19 »

Проверил. С рекурсией вообще только кнопки переписались. А в менюшках даже простые самодельные кнопки работать не хотят...
А в предыдущем варианте работали. Не работали только кнопки в выпадающих меню, вложенных в выпадающие меню.
Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #14 : 15.05.2011, 18:48:43 »

Наверное из-за того, что ошибочка закралась в код при копировании. Функция должна выглядеть так:
Код:
Function Popup_Btns(oSubPopupBtns As Object)
    Dim oSubBtn As Object
    For Each oSubBtn In oSubPopupBtns
        If oSubBtn.Type = 10 Then
            Call Popup_Btns(oSubBtn.Controls)
        Else
            sPath = oSubBtn.OnAction
            If Len(sPath) > 0 Then
                If InStr(1, sPath, "'!", 1) > 0 Then oSubBtn.OnAction = NewPath & Mid(sPath, InStr(1, sPath, "!", 1) + 1)
            End If
        End If
    Next oSubBtn
End Function
Теперь все должно работать.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #15 : 15.05.2011, 18:56:51 »

Спасибо, Дмитрий.
Всё заработало.
Ещё вопрос:
а почему
Код:
Function Popup_Btns(oSubPopupBtns As Object)
, а не
Код:
Sub Popup_Btns(oSubPopupBtns As Object)
Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #16 : 15.05.2011, 19:02:25 »

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #17 : 15.05.2011, 19:09:08 »

Спасибо. Понял.
Сейчас вынесу всё-таки саму замену пути в отдельную процедурку (в ней же и буду задавать константы, а не как публичные) и посмотрю, не удастся ли всё-таки сделать Sub  Popup_Btns и Sub Replace_Personal одной процедурой.
Конечно, я понимаю, что Sub  Popup_Btns должна получать как аргумент oSubPopupBtns, но ведь можно попробовать использовать в коде If ismissing oSubPopupBtns then ...
Записан

С уважением, Алексей
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #18 : 15.05.2011, 21:40:05 »

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

Вот, посмотрите, кому интересно. Может пригодиться.
Записан

С уважением, Алексей
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #19 : 16.05.2011, 14:55:08 »

Ещё подпилил (с помощью Дмитрия, естественно)
Теперь уже, кажется, финальный вариант  Улыбка
Путь в OnAction теперь меняется только у тех кнопок, которые ссылаются на макросы, расположенные в Personal.xls
Да и путь к Personal.xls самостоятельно вбивать в ячейки нет необходимости.

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

Ну, или вот отдельным файлом:
« Последнее редактирование: 16.05.2011, 15:01:46 от Alex_ST » Записан

С уважением, Алексей
DOC
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 28


Просмотр профиля E-mail
« Ответ #20 : 02.12.2013, 19:49:49 »

Для Екселя 97-2003

Отобразить Personal.xls
в режиме настройки Вложить меню и кнопки в новую панель кнопок
вложить панель кнопок в Personal.xls
Скрыть Personal.xls
Закрыть Ексел с сохранением...

И переноси Personal.xls

А если хочешь поделиться кнопками с друзьями, кладешь Personal.xls в папку, папку в папку, папки переименовываешь по стандартному пути расположения, чтобы не задавать папку xls start.
« Последнее редактирование: 02.12.2013, 19:52:58 от DOC » Записан
Страниц: 1 2 [Все]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru