2012-09-04 62 views
4

我正在开发使用C#(.NET 4.0)的Excel 2007的应用程序级AddIn。与此类似的问题已经被以前问>>获取C#中NamedRange控件的句柄

https://stackoverflow.com/questions/11374023/resizing-namedrange-throws-a-controlnotfoundexception

C# excel addin - Accessing Controls

,但他们的反应(其中有任何)并没有为我工作。所以我想详细说明我想要做什么,以及当我尝试去做时会发生什么。

简而言之,我的问题是,我无法获得NamedRange控件对象的修改,因为它们已经在代码中的其他地方被实例化和初始化。

请仔细阅读以获得更完整的描述。

当外接程序启动时,它会创建一个NamedRange控件并将它附加到某些细胞在特定的工作表>>

Worksheet worksheet = Globals.Factory.GetVstoObject(
       Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet); 
Excel.Range cell = worksheet.Range["A1"]; 
_configParams.HeaderNamedRange = worksheet.Controls.AddNamedRange(cell, "HeaderCells"); 
_configParams.HeaderNamedRange.RefersTo = "=" + worksheet.Name + "!$A$1:$A$5"; 

外接程序启动后,我想允许用户重新指定这个NamedRange控件可以指向的单元格。为了做到这一点,我让用户选择一系列单元格,然后在合适的事件处理程序方法中获取所选单元格的位置(作为字符串)。

然后,我打算以编程方式重新指定上述NamedRange控件指向的单元格。我尝试了以下方法,但都没有工作。

[方法1]

Worksheet controlWorksheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet); 
((NamedRange)(controlWorksheet.Controls["HeaderCells"])).RefersTo = newHeaderCellsLocation; 

在运行上面的代码,它将引发ControlNotFoundException,我得到以下信息:

Microsoft.VisualStudio.Tools.Applications.Runtime.ControlNotFoundException was unhandled by user code 
    Message=This document might not function as expected because the following control is missing: PortfolioHeaderCells. Data that relies on this control will not be automatically displayed or updated, and other custom functionality will not be available. Contact your administrator or the author of this document for further assistance. 
    Source=Microsoft.Office.Tools.Excel.Implementation 
    StackTrace: 
     at Microsoft.Office.Tools.Excel.NamedRangeImpl.GetObjects() 
     at Microsoft.Office.Tools.Excel.NamedRangeImpl.EnsureProxy() 
     at Microsoft.Office.Tools.Excel.NamedRangeImpl.get_Proxy() 
     at Microsoft.Office.Tools.Excel.NamedRangeImpl.AttachSupport() 
     at Microsoft.Office.Tools.Excel.NamedRangeImpl.ResetControl() 
     at Microsoft.Office.Tools.Excel.NamedRangeImpl.set_RefersTo(String value) 
     at ExcelListenerAddIn.Configuration.ListenerConfigManager.ActivateListenerConfiguration(ListenerConfigParams newConfiguration, Boolean cameFromConfigFile) in C:\Users\jag201\Documents\Visual Studio 2010\Projects\PoC\ExcelListenerAddIn\Configuration\ListenerConfigManager.cs:line 97 
     at ExcelListenerAddIn.TaskPanes.ListenerConfigurator._activateNewConfigButton_Click(Object sender, EventArgs e) in C:\Users\jag201\Documents\Visual Studio 2010\Projects\PoC\ExcelListenerAddIn\TaskPanes\ListenerConfigurator.cs:line 131 
     at System.EventHandler.Invoke(Object sender, EventArgs e) 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    InnerException: System.Runtime.InteropServices.COMException 
     Message=Exception from HRESULT: 0x800A03EC 
     Source=Microsoft.VisualStudio.Tools.Office.Runtime 
     ErrorCode=-2146827284 
     StackTrace: 
      at Microsoft.VisualStudio.Tools.Office.Runtime.Interop.IHostItemProvider.GetHostObject(String primaryType, String primaryCookie, IntPtr& hostObject) 
      at Microsoft.VisualStudio.Tools.Office.Runtime.DomainCreator.ExecuteCustomization.Microsoft.Office.Tools.IHostItemProvider.GetHostObject(Type primaryType, String primaryCookie) 
      at Microsoft.Office.Tools.Excel.NamedRangeImpl.GetObjects() 
     InnerException: 

[方法2]

我然后看到Set Excel Named Ranges via C#?等试图用回答中描述的方法有:

Worksheet controlWorksheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet); 
controlWorksheet.Names.Item("HeaderCells", Type.Missing, Type.Missing).RefersTo = newHeaderCellsLocation; 

在运行上面的代码,我得到以下异常和消息:

System.Runtime.InteropServices.COMException was unhandled by user code 
    Message=Exception from HRESULT: 0x800A03EC 
    Source="" 
    ErrorCode=-2146827284 
    StackTrace: 
     at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) 
     at Microsoft.Office.Interop.Excel.Names.Item(Object Index, Object IndexLocal, Object RefersTo) 
     at ExcelListenerAddIn.Configuration.ListenerConfigManager.ActivateListenerConfiguration(ListenerConfigParams newConfiguration, Boolean cameFromConfigFile) in C:\Users\jag201\Documents\Visual Studio 2010\Projects\PoC\ExcelListenerAddIn\Configuration\ListenerConfigManager.cs:line 97 
     at ExcelListenerAddIn.TaskPanes.ListenerConfigurator._activateNewConfigButton_Click(Object sender, EventArgs e) in C:\Users\jag201\Documents\Visual Studio 2010\Projects\PoC\ExcelListenerAddIn\TaskPanes\ListenerConfigurator.cs:line 131 
     at System.EventHandler.Invoke(Object sender, EventArgs e) 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    InnerException: 

因此,在这两种方法,从HRESULT异常是一样的:0x800A03EC。另外,在我试图获得NamedRange控件并重新指定它指向的单元格的行中抛出异常。

我已经遍历了我的代码,并且NamedRange控件确实存在于/当我尝试修改NamedRange对象时。

我然后使用以下代码>>

Worksheet controlWorksheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet); 
System.Windows.Forms.MessageBox.Show((controlWorksheet.Controls["HeaderCells"]).ToString()); 

这导致含有“Microsoft.Office.Tools.Excel.NamedRangeImpl”一个MessageBox检查controlWorksheet.Controls["HeaderCells"]对象的类型。如果我没有弄错,这个类型不会被Excel对象模型暴露出来,所以我不知道这个问题是否是由于我将一个NamedRangeImpl对象转换为一个NamedRange控件对象而引起的。

非常感谢您的帮助。如果有任何我可以提供的进一步信息,请告诉我。提前致谢!

+1

如果你只是更新范围内的单元格,这个答案有帮助吗? http://stackoverflow.com/a/9792388/2258 –

+0

@RichardMorgan:我必须使用NamedRange控件,而不是为Excel范围创建一个命名别名。 NamedRange控件的事件将通过事件处理程序方法进行连接。因此,这里的问题与将预先存在的命名别名附加到另一组单元格的问题不同。 –

回答

0

返回的对象类型没有问题。 “Microsoft.Office.Tools.Excel.NamedRangeImp”类型旨在通过“Microsoft.Office.Tools.Excel.NamedRange”接口访问。

0x800A03EC的COM异常向我建议,excel不允许你执行请求的操作(这也是你会得到的错误代码,例如,如果你尝试发送一个字符串值给一个会超过字符限制)。

是没有问题的设置引用关联属性几次,当我通过运行下面的代码进行验证:

 Microsoft.Office.Tools.Excel.Worksheet worksheet = Globals.Factory.GetVstoObject(
      Globals.MercuryAddIn.Application.ActiveWorkbook.ActiveSheet); 
     Excel.Range cell = worksheet.Range["A1"]; 
     Microsoft.Office.Tools.Excel.NamedRange r = worksheet.Controls.AddNamedRange(cell, "HeaderCells"); 
     r.RefersTo = "=" + worksheet.Name + "!$A$1:$A$5"; 

     r.RefersTo = "=" + worksheet.Name + "!$C$1:$C$5"; 

所以,问题在于必须包含在你的“newHeaderCellsLocation”变量中的字符串中。 RefersTo必须设置为范围的有效公式。你可以仔细检查一下字符串的格式是否正确?

+0

嗨Franchesca。这已经很晚了,但是谢谢你的回复。当我提出这个问题时,我并没有在我所处的角色/职位上工作。但再次感谢您对此进行调查并回答我的问题:)。 –