其他工作簿select图表时Excel.Worksheet.Copy上的COMException错误

我们有一个应用程序是使用VSTO构build的Excel Addin。 我们使用Excel作为报告工具。 当我打开一个报告(工作簿)并select一个图表,然后打开另一个工作簿,我得到一个COMException错误。

System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x800A03EC at Microsoft.Office.Interop.Excel._Worksheet.Copy(Object Before, Object After) 

这只有在select图表时才会发生。 这是导致问题的代码。 (DocumentView是一个Excel工作簿。)

  private void CopyInitialSheets() { try { int sheetCount; Excel.Worksheet initialSheet = (Excel.Worksheet)StingerGlobal.AppData.ExcelApp.ActiveSheet; initialSheet.Visible = Excel.XlSheetVisibility.xlSheetVisible; List<string> sheetNames = new List<string>(this.DocumentView.Sheets.Count); foreach (Excel.Worksheet sheet in this.DocumentView.Sheets) { sheetNames.Add(sheet.Name); } foreach (Excel.Worksheet sheet in _sheetReports.Keys) { Excel.Worksheet veryHiddenSheet = null; sheetCount = this.DocumentView.Sheets.Count; sheet.Visible = Excel.XlSheetVisibility.xlSheetVisible; sheet.Copy(Type.Missing, this.DocumentView.Sheets[sheetCount]); //Copy all the images, Charts, etc. These don't copy over with the sheet. foreach (Excel.Shape o in sheet.Shapes) { switch (o.Type) { case Microsoft.Office.Core.MsoShapeType.msoPicture: o.CopyPicture(); break; case Microsoft.Office.Core.MsoShapeType.msoChart: case Microsoft.Office.Core.MsoShapeType.msoDiagram: case Microsoft.Office.Core.MsoShapeType.msoCanvas: o.Copy(); break; default: break; } } //Find the sheet I just added because the after param to the Copy function is not respected. foreach (Excel.Worksheet newSheet in this.DocumentView.Sheets) { if (sheetNames.Contains(newSheet.Name)) continue; //Don't want this as it is an original sheet. if (newSheet.Name.Contains("--VH--")) continue; //Don't want this as it is one of my copies. //If code gets here, then I found the one I want veryHiddenSheet = newSheet; } veryHiddenSheet.Name = MakeHiddenSheetName(sheet.Name, "--VH--"); //Do not localize. veryHiddenSheet.Visible = Excel.XlSheetVisibility.xlSheetVeryHidden; } //Make sure the first initial sheet is still active after we are done. ((Excel._Worksheet)initialSheet).Activate(); } finally { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } } 

这只是在第二个工作簿上有问题,并在第一个工作正常。 我最好的猜测是,Excel是以某种方式混合工作簿,并导致一些内存错误。 我已经尝试了以下方法: – 清除剪贴板 – 取消select活动工作表的图表(这是在第一个工作簿中) – 忽略exception(这会停止复制过程,并在需要时找不到表单) – 激活新工作手册的开放表格

这些都没有工作。 到目前为止,唯一的解决scheme是不要select图表。 🙂

提前致谢。

如果我有这个问题,我会在程序开始时select一个单元格。

在VBA中:application.GoTo Activeworkbook.Worksheets(1).Range(“A1”)