Выберите пользовательскую ленту VSTO в Excel - PullRequest
2 голосов
/ 05 января 2010

Когда код VSTO создает объект списка и применяет стиль таблицы в Excel 2007, вкладка Инструменты таблицы / Дизайн активируется автоматически. Когда пользователь затем выбирает ячейку вне таблицы, по умолчанию активируется вкладка «Главная». Есть ли способ подавить это поведение или сбросить активную вкладку на пользовательскую вкладку, которая запустила действие? Я хотел бы, чтобы пользовательская лента была видна после действия, которое создает таблицу.

Ответы [ 4 ]

2 голосов
/ 07 февраля 2012

Я предоставил этот же ответ в другом посте .

В VSTO2010 возможность программно переключать выбранную вкладку был добавлен. Norm Estabrook написал об этом.

this.RibbonUI.ActivateTabMso("TabAddIns");

Итак, пока нет события, которое можно зафиксировать, по крайней мере, вы Можно переключить выбранную вкладку. Например, я собираюсь использовать лист событие выбора; когда пользователи переключаются между различными листами моего Рабочая тетрадь, я собираюсь изменить выбранную вкладку. Каждый лист будет соответствуют другой вкладке ленты.

Если вы связываете это с листовым событием SelectionChanged, вы можете убедиться, что они возвращаются на соответствующую вкладку (не TabHome) после изменения выбранной ячейки.

0 голосов
/ 19 января 2015

Только для всех вас, кто также должен поддерживать Office 2007 (как и я). Вот ( некрасивое , но работающее) решение для Office 2007:

  1. Откройте офисное приложение
  2. Нажмите ALT, а затем просмотрите комбинацию клавиш для пользовательской вкладки ленты
  3. В вашем коде вы теперь можете отправлять эти ключи через SendKeys.SendWait функция

Надеюсь, это кому-нибудь поможет. С уважением, Йорг


Код:

    public void FocusMyCustomRibbonTab()
    {
        if (IsExcel2007())
        {
            Globals.Ribbons.GetRibbon<MyRibbon>().tabMyRibbonTab.KeyTip = "GGG";

            //Excel 2007: Must send "ALT" key combination to activate tab, here "GGG"
            SendKeys.Send("%");                       
            SendKeys.Send("{G}");                     
            SendKeys.Send("{G}");                     
            SendKeys.Send("{G}");                     
            SendKeys.Send("%");                       
        }
        else
        {
            //Excel 2010 or higher: Build in way to activate tab
            if (this.ribbon.RibbonUI != null)
            {
                this.ribbon.RibbonUI.ActivateTab("MY_RIBBON_TAB_NAME");
            }
        }
    }

    public static bool IsExcel2007()
    {
        return (Globals.ThisAddIn.Application.Version.StartsWith("12"));
    }
0 голосов
/ 27 июля 2011

Редактировать: Я наконец обнаружил проект code.msdn.microsoft.com , который включает в себя собственные манипуляции с лентой C #. Используйте это вместо любого бизнеса VBA.

Исходное сообщение:

Office 2010 позволяет активировать вкладку с помощью модели расширения ленты . Тем не менее, он не предоставляет никакого способа узнать, какая вкладка активна или узнать, была ли вкладка изменена AFAIK. Кроме того, активация с помощью вкладок недоступна в 2007 году. Надеемся, что эти вещи они добавят в следующем выпуске.

Но в любом случае некоторые ребята нашли способ доступа к IAccessible объектам на ленте. Используя эти методы, вы можете делать с лентой все что угодно. Я пытался перенести его на C #, но столкнулся и слышал, что другие также сталкивались с проблемами утечки памяти с помощью функции AccessibleChildren pinvoke, поэтому, если кто-нибудь найдет способ сделать это в C #, пожалуйста, поделитесь.

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

    public static string GetRibbonName()
    {
        Excel.Workbook wbk = Globals.ThisWorkbook.Application.ActiveWorkbook;
        VBIDE.VBComponent module1 = null; //contains the function I want
        VBIDE.VBComponent module2 = null; //contains helper functions
        object obj = null;
        ThisRibbonCollection rbn = new ThisRibbonCollection();

        module1 = wbk.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
        module2 = wbk.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
        module1.CodeModule.AddFromString(Forecast_Toolset.Properties.Settings.Default.Module1);
        module2.CodeModule.AddFromString(Forecast_Toolset.Properties.Settings.Default.Module2);

        obj = wbk.Application.Run("TabName");

        wbk.VBProject.VBComponents.Remove(module1);
        wbk.VBProject.VBComponents.Remove(module2);

        return obj.ToString();

    }        

0 голосов
/ 21 января 2010

Я не думаю, что вы посчитаете это «ответом», но лучшее, что я смог найти, было то, что кто-то на MSDN предложил назначить сочетание клавиш на ленте, а затем с помощью Application.SendKeys выбрать его, когда я предположил пользователю нужно будет увидеть ленту (при запуске после создания исходной таблицы и т. д.)

Удачи вам, и я надеюсь, что вы найдете лучший ответ - я с радостью обновлю свое заявление в этом случае!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...