不能在c#的excel外接程序中按名称轻松访问excel区域

本文关键字:excel 区域 访问 程序 不能 | 更新日期: 2023-09-27 18:05:53

我是用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 '的第一次机会异常。在mscorlib.dll中发生TargetInvocationException'类型为"System.Runtime.InteropServices"的第一次异常。mscorlib.dll

不能在c#的excel外接程序中按名称轻松访问excel区域

如果您注释掉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#/COM互操作在c# 4之前是迟钝的