4

C#(.NET 4.0)を使用してExcel2007用のアプリケーションレベルのアドインを開発しています。これに似た質問は以前に尋ねられました>>

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

C#Excelアドイン-コントロールへのアクセス

しかし、それらへの応答(ある場合)は私にはうまくいきませんでした。それで、私がやろうとしていることと、それをやろうとするとどうなるかについて、詳細に説明したいと思います。

非常に簡単に言えば、私の問題は、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】

次に、 C#でExcelの名前付き範囲を設定するのを見ましたか?そこで、そこの答えに記載されているアプローチを使用しようとしました。

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.Controls["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コントロールオブジェクトにキャストしたことが問題の原因であるのではないかと思います。

あなたの助けは大歓迎です。私が提供できるさらなる情報があれば、私に知らせてください。前もって感謝します!

4

1 に答える 1

0

返されるオブジェクト タイプに問題はありません。タイプ "Microsoft.Office.Tools.Excel.NamedRangeImp" は、"Microsoft.Office.Tools.Excel.NamedRange" インターフェイス経由でアクセスすることを目的としています。

0x800A03EC の COM 例外は、Excel では要求された操作を実行できないことを示唆しています (これは、たとえば、文字制限を超えるセルに文字列値を送信しようとした場合に表示されるエラー コードでもあります)。 .

次のコードを実行して確認したように、RefersTo プロパティを数回設定しても問題はありません。

        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 は、範囲の有効な式に設定する必要があります。文字列が正しい形式であることを再確認できますか?

于 2012-11-07T15:13:16.297 に答える