Метод контроля рабочего листа недоступен

Я столкнулся со странной проблемой в программировании надстройки для Excel; Я хочу добавить элементы управления в Excel, я использовал этот код, вдохновляющий https://msdn.microsoft.com/en-us/library/cc442817.aspx

private void button_Click(object sender, RibbonControlEventArgs e)
{
    var worksheet = (Worksheet)Globals.ThisAddIn.Application.ActiveSheet;
    {
        const string buttonName = "MyButton";

        if (((RibbonCheckBox)sender).Checked)
        {
            var selection = Globals.ThisAddIn.Application.Selection as Range;
            if (selection != null)
            {
                var button =
                    new Microsoft.Office.Tools.Excel.Controls.Button();
                worksheet.Controls.AddControl(button, selection, buttonName);
            }
        }
        else
        {
            worksheet.Controls.Remove(buttonName);
        }
    }
}

но метод управления рабочим листом недоступен, и я не могу получить к нему доступ, я добавил сборку Microsoft.Office.Tools.Excel.v4.0.Utilities.dll и следующие инструкции

using Microsoft.Office.Interop.Excel; 
using Microsoft.Office.Tools.Ribbon;
using Office = Microsoft.Office.Core;

кстати я использую офис 2007 и vs 2013, поэтому я изменил версию офиса на 12 в DebugInfoExeName.

2 ответа

Решение

Вам необходимо использовать метод GetVstoObject, чтобы получить элемент хоста, представляющий рабочую таблицу в книге, а затем добавить элемент управления Button в текущую выбранную ячейку.

private void Button_Click(object sender, RibbonControlEventArgs e)
{
    Worksheet worksheet = Globals.Factory.GetVstoObject(
       Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    string buttonName = "MyButton";

    if (((RibbonCheckBox)sender).Checked)
    {
        Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
        if (selection != null)
        {
            Microsoft.Office.Tools.Excel.Controls.Button button =
               new Microsoft.Office.Tools.Excel.Controls.Button();
            worksheet.Controls.AddControl(button, selection, buttonName);
        }
    }
    else
    {
        worksheet.Controls.Remove(buttonName);
    }
}

Использование правильных пространств имен решило мою проблему, которая похожа:

      using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Tools.Excel;
Другие вопросы по тегам