C# 在C中获取NamedRange控件的句柄

C# 在C中获取NamedRange控件的句柄,c#,.net,excel,user-controls,vsto,C#,.net,Excel,User Controls,Vsto,我正在使用C.NET4.0为Excel2007开发应用程序级加载项。以前曾提出过类似于此的问题>> 但是对他们的回应对我来说并不适用。所以我想详细描述一下我正在尝试做什么,以及当我尝试做的时候会发生什么 简单地说,我的问题是,在代码中的其他地方对NamedRange控件对象进行实例化和初始化之后,我无法获得用于修改它们的NamedRange控件对象 请继续阅读以获得更完整的描述 当加载项启动时,它会创建一个NamedRange控件并将其附加到特定工作表上的某些单元格>> Worksheet wo

我正在使用C.NET4.0为Excel2007开发应用程序级加载项。以前曾提出过类似于此的问题>>

但是对他们的回应对我来说并不适用。所以我想详细描述一下我正在尝试做什么,以及当我尝试做的时候会发生什么

简单地说,我的问题是,在代码中的其他地方对NamedRange控件对象进行实例化和初始化之后,我无法获得用于修改它们的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]

然后我看到并尝试使用答案中描述的方法:

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控件

然后我检查了controlWorksheet的类型。使用以下代码控制[HeaderCells]对象>>

Worksheet controlWorksheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet);
System.Windows.Forms.MessageBox.Show((controlWorksheet.Controls["HeaderCells"]).ToString());
这将生成一个包含Microsoft.Office.Tools.Excel.NamedRangeImpl的消息框。如果我没有弄错的话,Excel对象模型不会暴露这种类型,因此我想知道问题是否是由我将NamedRangeImpl对象强制转换为NamedRange控件对象引起的


非常感谢你的帮助。如果有任何进一步的信息,我可以提供,请让我知道。提前谢谢

返回的对象类型没有问题。Microsoft.Office.Tools.Excel.NamedRangeImp类型旨在通过Microsoft.Office.Tools.Excel.NamedRange界面进行访问

0x800A03EC的COM异常向我建议excel将不允许您执行请求的操作。这也是如果您尝试(例如)向将超过字符限制的单元格发送字符串值时将得到的错误代码

多次设置referesto属性没有问题,我通过运行以下代码验证了这一点:

        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变量中包含的字符串中。referesto必须设置为范围的有效公式。您能再次检查字符串的格式是否正确吗?

如果您只是更新范围内的单元格,这个答案是否有用@RichardMorgan:我必须使用NamedRange控件,而不是为Excel范围创建命名别名。NamedRange控件的事件将与事件处理程序方法连接起来。因此,这里的问题与将预先存在的命名别名附加到另一组单元格的问题不同。现在已经很晚了,但是谢谢你的回复。当我问这个问题时,我并没有在我的岗位上工作。但再次感谢您对此进行调查并回答我的问题:。