无法在C#中的excel加载项中按名称轻松访问excel范围

时间:2011-08-18 12:05:03

标签: c# excel-dna

我是在C#中编写加载项的新手(也是C#)。我已经看到ExcelDNA对于简单的函数非常有效,但是我遇到了一个简单的任务:操作范围(特别是通过它们的名称来解决)。您看到我尝试使用Interop执行此任务,这对我来说很简单。在这段非常简单的代码中,我做错了什么?我已经去了ExcelDNA谷歌小组,我只找到了非常尴尬的答案

非常感谢

使用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
        }
    }
}

它会抛出此错误

mscorlib.dll中出现'System.Reflection.TargetInvocationException'类型的第一次机会异常 mscorlib.dll中出现'System.Runtime.InteropServices.COMException'类型的第一次机会异常

1 个答案:

答案 0 :(得分: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互操作被延迟了。