1

私は C# で (C# にも) アドインを作成するのは初めてです。ExcelDNA が単純な関数に対して非常にうまく機能することを確認しましたが、範囲の操作 (特にその名前で対処) という単純なタスクに行き詰まりました。このタスクに Interop を使用しようとしたことがわかります。これは私には簡単な方法に見えます。この非常に単純なコードで何が間違っているのでしょうか? 私はすでに ExcelDNA の Google グループに行きましたが、非常にぎこちない回答しか見つかりませんでした。

よろしくお願いします

ExcelDna.Integration の使用;

namespace MyAddIn
{
    public class MyClass    {
        [ExcelFunction(Category = "MyFunctions", IsMacroType = true)]
        public static string MyMacro(int a, int b)
        {
            var app = (Microsoft.Office.Interop.Excel.Application) ExcelDnaUtil.Application;
            var range = app.get_Range("MyTag"); // this line does not fail, but I don't know if it
                                                // selects the right range -- although MyTag exists
            range.set_Value("hello") // it fails here            
            return (string) range.Value2; // or it would fail here as well
        }
    }
}

このエラーがスローされます

タイプ 'System.Reflection.TargetInvocationException' の最初の例外が mscorlib.dll で発生しました タイプ 'System.Runtime.InteropServices.COMException' の最初の例外が mscorlib.dll で発生しました

4

1 に答える 1

2

set_range 行をコメントアウトし、MyTag セルに文字列が含まれていることを確認すると、関数は正常に動作します。

主な問題は set_Range の試みにあります。Excel では、ワークシート関数からシートの他の部分を設定することはできません。代わりに、メニューまたはリボン ボタンによってトリガーされるマクロ ('void' を返す) に変更する必要があります。( IsMacroType=true を設定しても関数はマクロにならず、関数が特別な型として登録されるだけです。)

あなたは試すことができます:

[ExcelCommand(MenuName="My Macros", MenuText="Set MyTag value")]
public static void MySetterMacro()
{
    var app = (Microsoft.Office.Interop.Excel.Application) ExcelDnaUtil.Application;
    var range = app.Range["MyTag"];
    range.Value = "Hello there!";
}                

C# 4 を使用していると仮定しているので、get_Value、set_Value は必要ありません。C# 3.5 を使用している場合は、次のように言う必要があると思います

range.set_Value(Type.Missing, "Old-Style Hello");

Value はパラメーター化されたプロパティであり、C# 4 より前の C# / COM 相互運用は遅れていたためです。

于 2011-08-19T06:14:52.833 に答える