【问题标题】:Cannot easily access excel range by name in excel add-in in C#无法在 C# 的 excel 加载项中按名称轻松访问 excel 范围
【发布时间】:2011-08-19 14:14:52
【问题描述】:

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

它会抛出这个错误

“System.Reflection.TargetInvocationException”类型的第一次机会异常发生在 mscorlib.dll 中 mscorlib.dll 中发生了“System.Runtime.InteropServices.COMException”类型的第一次机会异常

【问题讨论】:

    标签: c# excel-dna


    【解决方案1】:

    如果您注释掉 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 互操作被延迟了。

    【讨论】:

    • 亲爱的州长。我刚试过,就是这样。非常感谢。
    • 顺便说一句,Govert。它正在工作,但现在我无法将参数传递给宏,因为我将它声明为 excelCommand。有人知道该怎么做吗?问候
    • 你打算如何调用宏?从菜单按钮或您无法传递参数的东西。如果你要从 VBA 调用它,比如使用 Application.Run("MySetterMacro") 那么你可以在方法声明中添加参数。
    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多