Я создал новый проект книги 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 для этой задачи, и я просто собираюсь создать свою рабочую книгу методом грубой силы, я думаю. Немного расстроен, но потратил на это слишком много времени. Я вернусь к нему позже и опубликую, если найду ответ.
this.Application.ActiveWorkbook
. Я считаю, чтоApplication.ThisWorkbook
предназначен для макросов. - person Stephen Ross   schedule 17.03.2016WorkbookOpen
наApplication
. Я видел в прошлом, когда VSTO выдавал исключение при попытке получить Workbook до того, как Excel был готов. - person Stephen Ross   schedule 18.03.2016