6

ExcelDNAプラグインに次のコードがあります

AutoOpenメソッドに、次のコードを記述します。

ExcelIntegration.RegisterUnhandledExceptionHandler(ex => ex.ToString());

Excelシートから呼び出される次の関数があります。

[ExcelFunction(Category = "Foo", Description = "Sets value of cell")]
public static Foo(String idx)
{
        Excel.Application app = (Excel.Application)ExcelDnaUtil.Application;
        Excel.Workbook wb = app.Workbooks[1];
        Excel.Worksheet ws = GetSheet("Main");

        // This gives us the row
        Excel.Name idxRange = wb.Names.Item("COL_Main_Index");
        var row = (int)app.WorksheetFunction.Match(idx, idxRange.RefersToRange, 0);

        // Get the Column
        Excel.Name buyOrderRange = wb.Names.Item("COL_Main_BuyOrder");
        var col = (int)buyOrderRange.RefersToRange.Cells.Column;

        // create the range and update it
        Excel.Range r = (Excel.Range)ws.Cells[row, col];
        r.Value ="Foo"; 
}

問題は、実際にセルの値を設定できないことです。メソッドを呼び出すと、最後の行でエラーが発生します。

私のエラーハンドラは私に次のエラーを与えます:

{System.Runtime.InteropServices.COMException (0x800A03EC)

また、セルの値を次のように設定しようとしました。

        r = (Excel.Range)ws.Cells[12, 22];
        const int nCells = 1;
        Object[] args1 = new Object[1];
        args1[0] = nCells;
        r.GetType().InvokeMember("Value2", BindingFlags.SetProperty, null, r, args1);

同じ結果になります。

誰かが私がここで間違っているかもしれないことを指摘できますか?

4

3 に答える 3

5

Excel では、ユーザー定義のワークシート関数内から他のワークシート セルを設定することはできません。これは、Excel が再計算を管理するために使用する依存関係ツリーを保持するためです。これは、VBA、C API、Excel-DNA のいずれを使用していても当てはまります。

リボン ボタン、コンテキスト メニュー、またはショートカット キーを追加して、マクロを介して変更を有効にすることをお勧めします。

いくつかの醜い回避策がありますが、お勧めしません。

于 2013-02-16T11:31:14.243 に答える