Редактировать: Я наконец обнаружил проект 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();
}