Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Настройка ленты (Ribbon) 2007 - Мир MS Excel

Старая форма входа
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Готовые решения » Настройка ленты (Ribbon) 2007
Настройка ленты (Ribbon) 2007
Саня Дата: Суббота, 09.10.2010, 16:23 | Сообщение № 1
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
предыдущая версия - одинаково функционирует и в 2007 и в 2010 Excel
К сообщению приложен файл: Ribbon_old.xlam (84.4 Kb)
 
Ответить
Сообщениепредыдущая версия - одинаково функционирует и в 2007 и в 2010 Excel

Автор - Саня
Дата добавления - 09.10.2010 в 16:23
Alex_ST Дата: Суббота, 05.05.2012, 12:01 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Саня, спасибо, очень здорово!
А можно чуть поподробнее?
Что делает?
Куда лучше положить? В xlstart или в addons?
Как можно подстроить "под себя"? Только корректируя код? А по-человечески, через интерфейс этих мелко-мягких извращенцев никак?
Я, к стыду своему sad , вообще не смог в коде найти как ты создаёшь вкладку "Основная", а на ней - "***ОСНОВНЫЕ ИНСТРУМЕНТЫ***" и "Макросы". Ну нет таких стрингов в проекте!
А можно в группу "Макросы" как-то добавить кнопочки для своих любимых макросов? Уж чтобы картинки на кнопочках свои сделать я и не спрашиваю - это, похоже нам умные дяди запретили angry



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеСаня, спасибо, очень здорово!
А можно чуть поподробнее?
Что делает?
Куда лучше положить? В xlstart или в addons?
Как можно подстроить "под себя"? Только корректируя код? А по-человечески, через интерфейс этих мелко-мягких извращенцев никак?
Я, к стыду своему sad , вообще не смог в коде найти как ты создаёшь вкладку "Основная", а на ней - "***ОСНОВНЫЕ ИНСТРУМЕНТЫ***" и "Макросы". Ну нет таких стрингов в проекте!
А можно в группу "Макросы" как-то добавить кнопочки для своих любимых макросов? Уж чтобы картинки на кнопочках свои сделать я и не спрашиваю - это, похоже нам умные дяди запретили angry

Автор - Alex_ST
Дата добавления - 05.05.2012 в 12:01
Саня Дата: Четверг, 10.05.2012, 13:02 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
 
Ответить
Сообщениездесь дополнение к вопросу

Автор - Саня
Дата добавления - 10.05.2012 в 13:02
Alex_ST Дата: Среда, 13.06.2012, 11:37 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
01.06.2012 вышло обновление Ribbon XML Editor
Добавлен поиск с заменой (Ctrl+H) , исправлены баги группировки на вкладке customUI14, и ещё что-то.
Обновитесь, кто использует программу - стало ещё удобнее.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение01.06.2012 вышло обновление Ribbon XML Editor
Добавлен поиск с заменой (Ctrl+H) , исправлены баги группировки на вкладке customUI14, и ещё что-то.
Обновитесь, кто использует программу - стало ещё удобнее.

Автор - Alex_ST
Дата добавления - 13.06.2012 в 11:37
Alex_ST Дата: Среда, 13.06.2012, 12:48 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Осваиваю XML-настройку Ribbon'а "под себя"
Нужны картинки для своих кнопок.
Чтобы вставлять существующие в Офисе картинки кнопок в XML-текст сделал файл, который при его открытии создаёт дополнительную вкладку, а в ней - галереи картинок.
При нажатии на интересующую картинку на экран выводится форма с 3-мя видами картинки (16х16, 24х24, 32х32) и двумя кнопками: "Закрыть" и "Копировать".
Кнопка "Копировать" помещает имя картинки в готовом для вставки к код виде(типа imageMso="HappyFace" )в буфер обмена.
Версии сделал отдельные для 2007-го (там картинок чуть больше 1800 штук) и для 2010-го (картинок больше 7000).
Это сделал специально чтобы, работая на 2010-ом, нельзя было случайно вставить ссылку на картинку, отсутствующую в 2007-ом.

____________________________________________________________________________
На всякий случай, для тех, кто будет строить свои интерфейсы, поделюсь немного опытом о паре найденных "граблей":
1. В галерее, оказывается, не может содержаться более 1000 объектов (иначе XML-схема становится не валидной и не отрабатывается).
Ну, и фиг с ним. Слишком большие галереи смотреть всё равно не удобно. Сделал галереи по примерно 600 картинок.
2. В группе тоже, оказывается, может быть не более порядка 4000 элементов. Поэтому 7000 картинок 2010-го пришлось разбить на 3 группы (именно 3, а не 2 - для красоты выравнивания кнопок галерей).
К сообщению приложен файл: MSO-2010_IconsG.xlsm (108.6 Kb) · MSO-2007_IconsG.xlsm (40.2 Kb)



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Среда, 13.06.2012, 12:51
 
Ответить
СообщениеОсваиваю XML-настройку Ribbon'а "под себя"
Нужны картинки для своих кнопок.
Чтобы вставлять существующие в Офисе картинки кнопок в XML-текст сделал файл, который при его открытии создаёт дополнительную вкладку, а в ней - галереи картинок.
При нажатии на интересующую картинку на экран выводится форма с 3-мя видами картинки (16х16, 24х24, 32х32) и двумя кнопками: "Закрыть" и "Копировать".
Кнопка "Копировать" помещает имя картинки в готовом для вставки к код виде(типа imageMso="HappyFace" )в буфер обмена.
Версии сделал отдельные для 2007-го (там картинок чуть больше 1800 штук) и для 2010-го (картинок больше 7000).
Это сделал специально чтобы, работая на 2010-ом, нельзя было случайно вставить ссылку на картинку, отсутствующую в 2007-ом.

____________________________________________________________________________
На всякий случай, для тех, кто будет строить свои интерфейсы, поделюсь немного опытом о паре найденных "граблей":
1. В галерее, оказывается, не может содержаться более 1000 объектов (иначе XML-схема становится не валидной и не отрабатывается).
Ну, и фиг с ним. Слишком большие галереи смотреть всё равно не удобно. Сделал галереи по примерно 600 картинок.
2. В группе тоже, оказывается, может быть не более порядка 4000 элементов. Поэтому 7000 картинок 2010-го пришлось разбить на 3 группы (именно 3, а не 2 - для красоты выравнивания кнопок галерей).

Автор - Alex_ST
Дата добавления - 13.06.2012 в 12:48
egonomist Дата: Понедельник, 27.08.2012, 12:19 | Сообщение № 6
Группа: Проверенные
Ранг: Прохожий
Сообщений: 9
Репутация: 3 ±
Замечаний: 0% ±

Здравствуйте, первый раз на этом форуме. решил разместить свой пример надстройки google_translate + gismeteo.
В надстройке приведены примеры чтения данных с ленты и вывода результатов на ленту. приведены подробные комментарии xml и vba.
в группе google_translate - показана работа с editbox. на ленте два editboxa. в первый вводится текст для перевода, текст переводится функцией http://excelvba.ru/code/GoogleTranslate, полученный результат отображается во втором editbox.
в gismeteo - работа с labelcontrol. Скачивается xml информера, данные выводятся на лейблы.
К сообщению приложен файл: AddIns.zip (39.1 Kb)


Мы все поломаем нашей силой ума
 
Ответить
СообщениеЗдравствуйте, первый раз на этом форуме. решил разместить свой пример надстройки google_translate + gismeteo.
В надстройке приведены примеры чтения данных с ленты и вывода результатов на ленту. приведены подробные комментарии xml и vba.
в группе google_translate - показана работа с editbox. на ленте два editboxa. в первый вводится текст для перевода, текст переводится функцией http://excelvba.ru/code/GoogleTranslate, полученный результат отображается во втором editbox.
в gismeteo - работа с labelcontrol. Скачивается xml информера, данные выводятся на лейблы.

Автор - egonomist
Дата добавления - 27.08.2012 в 12:19
Serge_007 Дата: Понедельник, 27.08.2012, 12:27 | Сообщение № 7
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
egonomist, надо ссылку давать http://www.sql.ru/forum/actualthread.aspx?tid=965161


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение egonomist, надо ссылку давать http://www.sql.ru/forum/actualthread.aspx?tid=965161

Автор - Serge_007
Дата добавления - 27.08.2012 в 12:27
Саня Дата: Понедельник, 27.08.2012, 15:28 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
хочу добавить один нюанс (не помню, обсуждалось это или нет)
если произойдет какая-либо ошибка, напр., я вбиваю несуществующий город (я про твою надстройку, egonomist), происходит останов и ресет проекта.
соответ-но, все глобальные переменные (и MyRibbon тоже) "падают", получение ссылки на интерфейс IRibbonUI происходит при загрузке ленты, т.е. выход - это перезагрузка ленты...

но есть еще способ - использование API-шной функции CopyMemory (ее почему-то даже нет у Д.Эпплмана "Win32 API и Visual Basic"):
[vba]
Code
Option Explicit
Dim mrbnRibbon As IRibbonUI  'пользовательский интерфейс

#If VBA7 Then
     Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
            pDst As Any, _
            pSrc As Any, _
            ByVal ByteLen As Long)
#Else
     Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
                    pDst As Any, _
                    pSrc As Any, _
                    ByVal ByteLen As Long)
#End If

'---------------------- ЗАГРУЗКА ЛЕНТЫ ---
Sub RibbonLoading(ribbon As IRibbonUI)
     Set mrbnRibbon = ribbon                  ' интерфейс в переменную
     SetRegVal ObjPtr(ribbon), gsRIBBON_POINTER, gsPARAM_TYPE1     ' указатель на IRibbonUI _
                    у меня он записывается в реестр, _
                    можно куда угодно, откуда его легко получит при падении, в ячейку, напр.
End Sub

#If VBA7 Then
Function GetRibbon(ByVal lRibbonPointer As LongPtr) As Object
#Else
Function GetRibbon(ByVal lRibbonPointer As Long) As Object
#End If
CopyMemory GetRibbon, lRibbonPointer, LenB(lRibbonPointer)
End Function

Sub RefreshRibbon()              ' эта процедура поднимает риббон, если это возможно.
     If mrbnRibbon Is Nothing Then
         Dim sPnt As String: sPnt = vGetRegVal(gsRIBBON_POINTER)       ' СЧИТЫВАЕТСЯ ИЗ РЕЕСТРА.
         If Len(sPnt) = 0 Then
             MsgBox "Указатель на ленту не найден." & vbCr & _
                    "Нужно перезагрузить надстройку.", vbCritical
             End    '<<<=====[XXX] - УКАЗАТЕЛЬ НА ЛЕНТУ ОТСУТСТВУЕТ!!!

         Else
             Dim objTemp As Object: Set objTemp = GetRibbon(sPnt)
             If TypeName(objTemp) <> "IRibbonUI" Then
                 MsgBox "Некорректный указатель на ленту." & vbCr & _
                        "Нужно перезагрузить надстройку.", vbCritical
                 DelRegVal gsRIBBON_POINTER
                 End    '<<<=====[XXX] - УКАЗАТЕЛЬ НЕ НА ЛЕНТУ!!!
             End If
         End If

         Set mrbnRibbon = objTemp
         Debug.Print Now & " - cсылка на ленту восстановлена!"

     End If

     mrbnRibbon.Invalidate

End Sub
'=========================================================================
[/vba]

без этого очень напрягало перезагружать надстройку.
 
Ответить
Сообщениехочу добавить один нюанс (не помню, обсуждалось это или нет)
если произойдет какая-либо ошибка, напр., я вбиваю несуществующий город (я про твою надстройку, egonomist), происходит останов и ресет проекта.
соответ-но, все глобальные переменные (и MyRibbon тоже) "падают", получение ссылки на интерфейс IRibbonUI происходит при загрузке ленты, т.е. выход - это перезагрузка ленты...

но есть еще способ - использование API-шной функции CopyMemory (ее почему-то даже нет у Д.Эпплмана "Win32 API и Visual Basic"):
[vba]
Code
Option Explicit
Dim mrbnRibbon As IRibbonUI  'пользовательский интерфейс

#If VBA7 Then
     Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
            pDst As Any, _
            pSrc As Any, _
            ByVal ByteLen As Long)
#Else
     Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
                    pDst As Any, _
                    pSrc As Any, _
                    ByVal ByteLen As Long)
#End If

'---------------------- ЗАГРУЗКА ЛЕНТЫ ---
Sub RibbonLoading(ribbon As IRibbonUI)
     Set mrbnRibbon = ribbon                  ' интерфейс в переменную
     SetRegVal ObjPtr(ribbon), gsRIBBON_POINTER, gsPARAM_TYPE1     ' указатель на IRibbonUI _
                    у меня он записывается в реестр, _
                    можно куда угодно, откуда его легко получит при падении, в ячейку, напр.
End Sub

#If VBA7 Then
Function GetRibbon(ByVal lRibbonPointer As LongPtr) As Object
#Else
Function GetRibbon(ByVal lRibbonPointer As Long) As Object
#End If
CopyMemory GetRibbon, lRibbonPointer, LenB(lRibbonPointer)
End Function

Sub RefreshRibbon()              ' эта процедура поднимает риббон, если это возможно.
     If mrbnRibbon Is Nothing Then
         Dim sPnt As String: sPnt = vGetRegVal(gsRIBBON_POINTER)       ' СЧИТЫВАЕТСЯ ИЗ РЕЕСТРА.
         If Len(sPnt) = 0 Then
             MsgBox "Указатель на ленту не найден." & vbCr & _
                    "Нужно перезагрузить надстройку.", vbCritical
             End    '<<<=====[XXX] - УКАЗАТЕЛЬ НА ЛЕНТУ ОТСУТСТВУЕТ!!!

         Else
             Dim objTemp As Object: Set objTemp = GetRibbon(sPnt)
             If TypeName(objTemp) <> "IRibbonUI" Then
                 MsgBox "Некорректный указатель на ленту." & vbCr & _
                        "Нужно перезагрузить надстройку.", vbCritical
                 DelRegVal gsRIBBON_POINTER
                 End    '<<<=====[XXX] - УКАЗАТЕЛЬ НЕ НА ЛЕНТУ!!!
             End If
         End If

         Set mrbnRibbon = objTemp
         Debug.Print Now & " - cсылка на ленту восстановлена!"

     End If

     mrbnRibbon.Invalidate

End Sub
'=========================================================================
[/vba]

без этого очень напрягало перезагружать надстройку.

Автор - Саня
Дата добавления - 27.08.2012 в 15:28
egonomist Дата: Понедельник, 27.08.2012, 15:48 | Сообщение № 9
Группа: Проверенные
Ранг: Прохожий
Сообщений: 9
Репутация: 3 ±
Замечаний: 0% ±

огромное спасибо! буду прикручивать.


Мы все поломаем нашей силой ума
 
Ответить
Сообщениеогромное спасибо! буду прикручивать.

Автор - egonomist
Дата добавления - 27.08.2012 в 15:48
nerv Дата: Понедельник, 27.08.2012, 19:17 | Сообщение № 10
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Quote (Саня)
если произойдет какая-либо ошибка, напр., я вбиваю несуществующий город (я про твою надстройку, egonomist), происходит останов и ресет проекта.

можно поподробней?

egonomist, это
Quote (egonomist)
p.p.s:код возможно сыроват (главное показать принцип), буду рад любым предложениям по оптимизации и доработке.

в силе?


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение
Quote (Саня)
если произойдет какая-либо ошибка, напр., я вбиваю несуществующий город (я про твою надстройку, egonomist), происходит останов и ресет проекта.

можно поподробней?

egonomist, это
Quote (egonomist)
p.p.s:код возможно сыроват (главное показать принцип), буду рад любым предложениям по оптимизации и доработке.

в силе?

Автор - nerv
Дата добавления - 27.08.2012 в 19:17
Alex_ST Дата: Понедельник, 27.08.2012, 20:01 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

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



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеOFF: на работе завал, а разобраться как поднимать упавший риббон хочется... Попробую на днях выкроить время поразбираться. Хотя в API я ни в зуб ногой, к сожалению. sad

Автор - Alex_ST
Дата добавления - 27.08.2012 в 20:01
egonomist Дата: Понедельник, 27.08.2012, 22:26 | Сообщение № 12
Группа: Проверенные
Ранг: Прохожий
Сообщений: 9
Репутация: 3 ±
Замечаний: 0% ±

код сыроват - нет обработчиков ошибок.
всю надстройку можно дорабатывать,оптимизировать - open source project, я просто хотел выложить пример работы, мне пришлось много разных сайтов посетить чтоб узнать как это все делается, про такие грабли что Саня написал - я и не знал. Думаю там проверку введеного имени города по уже имеющемуся списку сделать надо, или не комбобокс там ставить.
to nerv, посмотрел класс http: нет обработчика ошибки если страница не загрузилась. и вопрос офтоп - в чем преимущества заведения класса перед простым объявлением объекта (именно для загрузки xml)?
p.s: буду рад помочь любому другому сценарию развития - может быть кому - то надо курсы валют али еще чего.


Мы все поломаем нашей силой ума

Сообщение отредактировал egonomist - Вторник, 28.08.2012, 07:28
 
Ответить
Сообщениекод сыроват - нет обработчиков ошибок.
всю надстройку можно дорабатывать,оптимизировать - open source project, я просто хотел выложить пример работы, мне пришлось много разных сайтов посетить чтоб узнать как это все делается, про такие грабли что Саня написал - я и не знал. Думаю там проверку введеного имени города по уже имеющемуся списку сделать надо, или не комбобокс там ставить.
to nerv, посмотрел класс http: нет обработчика ошибки если страница не загрузилась. и вопрос офтоп - в чем преимущества заведения класса перед простым объявлением объекта (именно для загрузки xml)?
p.s: буду рад помочь любому другому сценарию развития - может быть кому - то надо курсы валют али еще чего.

Автор - egonomist
Дата добавления - 27.08.2012 в 22:26
egonomist Дата: Понедельник, 27.08.2012, 22:27 | Сообщение № 13
Группа: Проверенные
Ранг: Прохожий
Сообщений: 9
Репутация: 3 ±
Замечаний: 0% ±

to Саня - SetRegVal ObjPtr(ribbon), gsRIBBON_POINTER, gsPARAM_TYPE1 - на эту строку ругается, что и где надо подключить?


Мы все поломаем нашей силой ума
 
Ответить
Сообщениеto Саня - SetRegVal ObjPtr(ribbon), gsRIBBON_POINTER, gsPARAM_TYPE1 - на эту строку ругается, что и где надо подключить?

Автор - egonomist
Дата добавления - 27.08.2012 в 22:27
Саня Дата: Понедельник, 27.08.2012, 22:42 | Сообщение № 14
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
я же писал - я записываю указатель в реестр, т.к. убежден, что надстройка (или любая другая утилита) не должна саму себя менять (код отдельно, данные отдельно).
модуль MRegistry:
[vba]
Code
Option Explicit
Public Sub SetRegVal(vVal, Optional sParamPath As String = gsREG_PATH0, _
                       Optional sParamType As String = gsPARAM_TYPE0)
' [sParamPath] - записываем параметр (По умолчанию)
'                ключа "HKEY_CURRENT_USER\Software\Sanya\Add-ins\Ribbon\"
      On Error GoTo errHandler
      If sParamType = gsPARAM_TYPE1 Then
          If Not IsNumeric(vVal) Then
              Err.Raise 666, , _
                        "Для типа параметра " & gsPARAM_TYPE1 & " необходимо число, " & _
                        "а не это: " & Chr(34) & vVal & Chr(34) & vbCr
          End If
      End If
      '===================================================================
      Dim WshShell As Object: Set WshShell = CreateObject("WScript.Shell")
      WshShell.RegWrite sGetFullPath(sParamPath), vVal, sParamType  '<<<<<<<<<<<<<<<<<<<<<<
      Exit Sub
errHandler:
      MarkError "записи", Err.Description
End Sub

Public Function vGetRegVal(Optional sParamPath As String = gsREG_PATH0) As Variant
' [sParamPath] - получаем параметр (По умолчанию)
'                ключа "HKEY_CURRENT_USER\Software\Sanya\Add-ins\Ribbon\"
      On Error GoTo errHandler
      Dim WshShell As Object: Set WshShell = CreateObject("WScript.Shell")
      vGetRegVal = WshShell.RegRead(sGetFullPath(sParamPath))     '<<<<<<<<<<<<<<<<<<<<<<
      Exit Function
errHandler:
      MarkError "чтения", Err.Description
End Function

Public Sub DelRegVal(Optional sParamPath As String = gsREG_PATH0)
' [sParamPath] - удаляем ключ "HKEY_CURRENT_USER\Software\Sanya\Add-ins\Ribbon\"
      On Error GoTo errHandler
      Dim WshShell As Object: Set WshShell = CreateObject("WScript.Shell")
      WshShell.RegDelete sGetFullPath(sParamPath)    '<<<<<<<<<<<<<<<<<<<<<<
      Exit Sub
errHandler:
      MarkError "удаления", Err.Description
End Sub

'--------------------------------------------------------------------------
Private Function sGetFullPath(ByVal sIn As String) As String
      Dim sPref As String: sPref = ""
      If Left$(sIn, 4) <> "HKEY" Then sPref = gsREG_PATH0
      sGetFullPath = sPref & sIn
End Function

Private Sub MarkError(sType As String, sErrDescr As String)
      Debug.Print Now & " - ошибка " & sType & ":" & vbCr & sErrDescr & vbCr
End Sub
[/vba]

и модуль MGlobals:
[vba]
Code
Option Explicit
Public Const gsPARAM_TYPE0 As String = "REG_SZ"
Public Const gsPARAM_TYPE1 As String = "REG_DWORD"

Public Const gsRIBBON_POINTER As String = "RibbonPointer"
Public Const gsCOUNTER As String = "Counter"

Public Const gsREG_PATH0 As String = "HKEY_CURRENT_USER\Software\Sanya\Add-ins\Ribbon\"
[/vba]

надстройка большая, можа что лишнее прицепил, можа что не хватает.

Quote (nerv)
можно поподробней?

речь о необработанной исключительной ситуации - Debug Or End - "обнуление" всех глобальных переменных.
 
Ответить
Сообщениея же писал - я записываю указатель в реестр, т.к. убежден, что надстройка (или любая другая утилита) не должна саму себя менять (код отдельно, данные отдельно).
модуль MRegistry:
[vba]
Code
Option Explicit
Public Sub SetRegVal(vVal, Optional sParamPath As String = gsREG_PATH0, _
                       Optional sParamType As String = gsPARAM_TYPE0)
' [sParamPath] - записываем параметр (По умолчанию)
'                ключа "HKEY_CURRENT_USER\Software\Sanya\Add-ins\Ribbon\"
      On Error GoTo errHandler
      If sParamType = gsPARAM_TYPE1 Then
          If Not IsNumeric(vVal) Then
              Err.Raise 666, , _
                        "Для типа параметра " & gsPARAM_TYPE1 & " необходимо число, " & _
                        "а не это: " & Chr(34) & vVal & Chr(34) & vbCr
          End If
      End If
      '===================================================================
      Dim WshShell As Object: Set WshShell = CreateObject("WScript.Shell")
      WshShell.RegWrite sGetFullPath(sParamPath), vVal, sParamType  '<<<<<<<<<<<<<<<<<<<<<<
      Exit Sub
errHandler:
      MarkError "записи", Err.Description
End Sub

Public Function vGetRegVal(Optional sParamPath As String = gsREG_PATH0) As Variant
' [sParamPath] - получаем параметр (По умолчанию)
'                ключа "HKEY_CURRENT_USER\Software\Sanya\Add-ins\Ribbon\"
      On Error GoTo errHandler
      Dim WshShell As Object: Set WshShell = CreateObject("WScript.Shell")
      vGetRegVal = WshShell.RegRead(sGetFullPath(sParamPath))     '<<<<<<<<<<<<<<<<<<<<<<
      Exit Function
errHandler:
      MarkError "чтения", Err.Description
End Function

Public Sub DelRegVal(Optional sParamPath As String = gsREG_PATH0)
' [sParamPath] - удаляем ключ "HKEY_CURRENT_USER\Software\Sanya\Add-ins\Ribbon\"
      On Error GoTo errHandler
      Dim WshShell As Object: Set WshShell = CreateObject("WScript.Shell")
      WshShell.RegDelete sGetFullPath(sParamPath)    '<<<<<<<<<<<<<<<<<<<<<<
      Exit Sub
errHandler:
      MarkError "удаления", Err.Description
End Sub

'--------------------------------------------------------------------------
Private Function sGetFullPath(ByVal sIn As String) As String
      Dim sPref As String: sPref = ""
      If Left$(sIn, 4) <> "HKEY" Then sPref = gsREG_PATH0
      sGetFullPath = sPref & sIn
End Function

Private Sub MarkError(sType As String, sErrDescr As String)
      Debug.Print Now & " - ошибка " & sType & ":" & vbCr & sErrDescr & vbCr
End Sub
[/vba]

и модуль MGlobals:
[vba]
Code
Option Explicit
Public Const gsPARAM_TYPE0 As String = "REG_SZ"
Public Const gsPARAM_TYPE1 As String = "REG_DWORD"

Public Const gsRIBBON_POINTER As String = "RibbonPointer"
Public Const gsCOUNTER As String = "Counter"

Public Const gsREG_PATH0 As String = "HKEY_CURRENT_USER\Software\Sanya\Add-ins\Ribbon\"
[/vba]

надстройка большая, можа что лишнее прицепил, можа что не хватает.

Quote (nerv)
можно поподробней?

речь о необработанной исключительной ситуации - Debug Or End - "обнуление" всех глобальных переменных.

Автор - Саня
Дата добавления - 27.08.2012 в 22:42
egonomist Дата: Вторник, 28.08.2012, 17:46 | Сообщение № 15
Группа: Гости
Саня, спасибо за советы, все прикрутил, выложил тут - http://www.sql.ru/forum/actualthread.aspx?tid=965161
здесь не могу залогиниться, а как гость загрузить файл не могу.
 
Ответить
СообщениеСаня, спасибо за советы, все прикрутил, выложил тут - http://www.sql.ru/forum/actualthread.aspx?tid=965161
здесь не могу залогиниться, а как гость загрузить файл не могу.

Автор - egonomist
Дата добавления - 28.08.2012 в 17:46
ElenHim Дата: Среда, 29.08.2012, 09:09 | Сообщение № 16
Группа: Проверенные
Ранг: Новичок
Сообщений: 26
Репутация: 10 ±
Замечаний: 0% ±

Quote (Саня)
я же писал - я записываю указатель в реестр, т.к. убежден, что надстройка

Не вдавался, но как-то очень длинно и грустно. Я предпочитаю вариант покороче:
[vba]
Code
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private IRibbon As IRibbonUI

Property Let Current_Ribbon(ribbon As IRibbonUI)
Set IRibbon = ribbon
Me.Names.Add Name:="Current_Ribbon", RefersTo:=ObjPtr(ribbon)
End Property
Property Get Current_Ribbon() As IRibbonUI
Dim IPoint As Long
If IRibbon Is Nothing Then
     IPoint = Evaluate("Current_Ribbon")
     CopyMemory IRibbon, IPoint, LenB(IPoint)
End If
Set Current_Ribbon = IRibbon
End Property
[/vba]

Соответственно, код в модуле книги. Впрочем, можно и под стандартный запилить. Таким образом, текущий Ribbon доступен в любой момент
За 1,5 года эксплуатации такого подхода - никаких нареканий.


Pluribus Impar
 
Ответить
Сообщение
Quote (Саня)
я же писал - я записываю указатель в реестр, т.к. убежден, что надстройка

Не вдавался, но как-то очень длинно и грустно. Я предпочитаю вариант покороче:
[vba]
Code
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private IRibbon As IRibbonUI

Property Let Current_Ribbon(ribbon As IRibbonUI)
Set IRibbon = ribbon
Me.Names.Add Name:="Current_Ribbon", RefersTo:=ObjPtr(ribbon)
End Property
Property Get Current_Ribbon() As IRibbonUI
Dim IPoint As Long
If IRibbon Is Nothing Then
     IPoint = Evaluate("Current_Ribbon")
     CopyMemory IRibbon, IPoint, LenB(IPoint)
End If
Set Current_Ribbon = IRibbon
End Property
[/vba]

Соответственно, код в модуле книги. Впрочем, можно и под стандартный запилить. Таким образом, текущий Ribbon доступен в любой момент
За 1,5 года эксплуатации такого подхода - никаких нареканий.

Автор - ElenHim
Дата добавления - 29.08.2012 в 09:09
Константин Дата: Среда, 26.06.2013, 18:41 | Сообщение № 17
Группа: Гости
ElenHim,

поясни пожалуйста, для чего этот код?
 
Ответить
СообщениеElenHim,

поясни пожалуйста, для чего этот код?

Автор - Константин
Дата добавления - 26.06.2013 в 18:41
Константин Дата: Четверг, 04.07.2013, 17:54 | Сообщение № 18
Группа: Гости
Serge_007,

а я никуда не тороплюсь wink
 
Ответить
СообщениеSerge_007,

а я никуда не тороплюсь wink

Автор - Константин
Дата добавления - 04.07.2013 в 17:54
ElenHim Дата: Пятница, 05.07.2013, 11:27 | Сообщение № 19
Группа: Проверенные
Ранг: Новичок
Сообщений: 26
Репутация: 10 ±
Замечаний: 0% ±

Константин,

Поясняю,

Для восстановления объекта Ribbon. Собственно, подход тот же что и в предыдущем примере, но адрес объекта Ribbon сохраняется не в реестре, а в имени "Current_Ribbon", в текущей книге.
Обращение/присваивание объекта Ribbon реализовано через свойсто (property) Current Ribbon в модуле книги (но можно и в обычном; заметьте, при этом собственно переменная IRibbon является Private), и если IRibbon навернётся, процедура Property Get Current_Ribbon() As IRibbonUI восстановит его по адресу, сохранённому в имени "Current_Ribbon".

Таким образом, после объявлений из моего предыдущего поста, с лентой работаем так:

[vba]
Код
Option Explicit

Sub IRibbon_onLoad(ribbon As IRibbonUI)
'При первой загрузке, сохраняем объект Ribbon и его адрес
Current_Ribbon = ribbon

'Далее, работаем с объектом Ribbon, возращаемым свойством Current_Ribbon
'При этом мы гарантированно получаем Ribbon - либо "родной", либо восстановленный после возможных сбоев
With Current_Ribbon
      .ActivateTab ("Home")
      .Invalidate
End With
End Sub
[/vba]
На мой взгляд такой подход проще, чем работа с реестром, к которому доступа, между прочим, может и не быть.


Pluribus Impar

Сообщение отредактировал ElenHim - Пятница, 05.07.2013, 11:29
 
Ответить
СообщениеКонстантин,

Поясняю,

Для восстановления объекта Ribbon. Собственно, подход тот же что и в предыдущем примере, но адрес объекта Ribbon сохраняется не в реестре, а в имени "Current_Ribbon", в текущей книге.
Обращение/присваивание объекта Ribbon реализовано через свойсто (property) Current Ribbon в модуле книги (но можно и в обычном; заметьте, при этом собственно переменная IRibbon является Private), и если IRibbon навернётся, процедура Property Get Current_Ribbon() As IRibbonUI восстановит его по адресу, сохранённому в имени "Current_Ribbon".

Таким образом, после объявлений из моего предыдущего поста, с лентой работаем так:

[vba]
Код
Option Explicit

Sub IRibbon_onLoad(ribbon As IRibbonUI)
'При первой загрузке, сохраняем объект Ribbon и его адрес
Current_Ribbon = ribbon

'Далее, работаем с объектом Ribbon, возращаемым свойством Current_Ribbon
'При этом мы гарантированно получаем Ribbon - либо "родной", либо восстановленный после возможных сбоев
With Current_Ribbon
      .ActivateTab ("Home")
      .Invalidate
End With
End Sub
[/vba]
На мой взгляд такой подход проще, чем работа с реестром, к которому доступа, между прочим, может и не быть.

Автор - ElenHim
Дата добавления - 05.07.2013 в 11:27
Сергей М Дата: Вторник, 16.07.2013, 16:50 | Сообщение № 20
Группа: Гости
ElenHim, воспользовался выложенным кодом для работы с Ribbon, лента действительно стала работать стабильнее.
Но, обнаружил одно НО: всё слетает после сохранения файла под другим именем.

Как быть в данном случае?
Спасибо.
 
Ответить
СообщениеElenHim, воспользовался выложенным кодом для работы с Ribbon, лента действительно стала работать стабильнее.
Но, обнаружил одно НО: всё слетает после сохранения файла под другим именем.

Как быть в данном случае?
Спасибо.

Автор - Сергей М
Дата добавления - 16.07.2013 в 16:50
Мир MS Excel » Вопросы и решения » Готовые решения » Настройка ленты (Ribbon) 2007
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!