Приложение проекта книги VSTO в Office Excel.

Я создал новый проект книги VSTO Excel и пытаюсь получить только ту книгу, в которой запущен макрос, с помощью ThisWorkbook.

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using Microsoft.Office.Tools.Excel;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;

namespace TestWorkbook
{
    public partial class Sheet1
    {
        Excel.Workbook mWorkBook;

        private void Sheet1_Startup(object sender, System.EventArgs e)
        {
            mWorkBook = this.Application.ThisWorkbook;
        }

        private void Sheet1_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(Sheet1_Startup);
            this.Shutdown += new System.EventHandler(Sheet1_Shutdown);
        }

        #endregion

    }
}

Код - это просто код по умолчанию, созданный VS. Я добавил только две строки с переменной mWorkbook.

Когда я бегу, я получаю исключение COM:

System.Runtime.InteropServices.COMException HRESULT: 0x800A03EC

В отладчике при просмотре this.Application.ThisWorkbook значение равно:

{System.Reflection.TargetInvocationException: исключение было выброшено целью вызова. ---> System.Runtime.InteropServices.COMException: исключение из HRESULT: 0x800A03EC --- Конец трассировки стека внутреннего исключения --- в System.RuntimeType.InvokeDispMethod (String name, BindingFlags invokeAttr, Object target, Object [] args, Boolean [] byrefModifiers, культура Int32, String [] namedParameters) в System.RuntimeType.InvokeMember (имя строки, BindingFlags bindingFlags, связыватель привязки, цель объекта, Object [] providedArgs, ParameterModifier [] модификаторы, культура CultureInfo, String [] namedParams) в System.Dynamic.IDispatchComObject.GetMembers (имена IEnumerable`1)}

Единственное, что я нашел, близкий к ответу, - это «иногда это исчезает для других пользователей» и «обновлять .Net». Есть идеи, что попробовать дальше? Спасибо!

Обновление. Вчера я только что установил инструменты для разработки Office. Сегодня я заметил, что могу создать и запустить проект. Если я закрою его, я не смогу снова открыть из-за проблемы с несовместимой версией. Связанная с этим справка MS не помогала. У меня есть чистая установка Windows 10 около месяца назад и VS Community Edition со всеми обновлениями для обоих. У меня действительно нет времени искать проблемы с версией MS для этой задачи, и я просто собираюсь создать свою рабочую книгу методом грубой силы, я думаю. Немного расстроен, но потратил на это слишком много времени. Я вернусь к нему позже и опубликую, если найду ответ.


person MrSnrub    schedule 17.03.2016    source источник
comment
Если вы пытаетесь получить активную рабочую книгу, вы можете попробовать this.Application.ActiveWorkbook. Я считаю, что Application.ThisWorkbook предназначен для макросов.   -  person Stephen Ross    schedule 17.03.2016
comment
Я попробовал ваш Application.ActiveWorkbook и получил аналогичную ошибку до того, как опубликовал. Спасибо хоть.   -  person MrSnrub    schedule 17.03.2016
comment
Еще вы можете попробовать присоединиться к событию WorkbookOpen на Application. Я видел в прошлом, когда VSTO выдавал исключение при попытке получить Workbook до того, как Excel был готов.   -  person Stephen Ross    schedule 18.03.2016
comment
Я попробую, как только вернусь к этому. Спасибо.   -  person MrSnrub    schedule 18.03.2016


Ответы (1)


Я ответил на еще один вопрос, возможно, вам поможет насчет несовместимого. Измените значение ApplicationType с «XLS» на «Excel», если вы используете VS 2015 Enterprise.

person menxin    schedule 21.04.2016
comment
Спасибо за помощь! Я планирую вернуться к этому в какой-то момент в этом году и попробую. - person MrSnrub; 02.05.2016