使用exceldna单击功能区按钮时获取excel选择内容

问题描述

我正在尝试读取和更新用户的选择(当前选择的excel范围)。用户单击自定义功能区的按钮时,必定会发生这种情况。 功能区运行良好(基本功能,如消息框触发正常),但以下代码失败。

[ComVisible(true)]
public class RibbonHandler : ExcelRibbon
{

    public void OnPressMe(IRibbonControl control1)
    {

        ExcelReference ActiveRange = (ExcelReference)XlCall.Excel(XlCall.xlfSelection);

        object[,] dummyData = (object[,])XlCall.Excel(XlCall.xlfValue,ActiveRange);

        int rows = dummyData.GetLength(0);
        int cols = dummyData.GetLength(1);
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                dummyData[i,j] = "foo";
            }
        }

        ExcelAsyncUtil.QueueAsMacro(() => { ActiveRange.SetValue(dummyData); });

    }
}

无论选择大小(一个单元格,十个单元格,一个或多个行,...),它都会在第一行触发XlCallException

许多网络示例都将范围对象作为函数的输入,这可能是一个提示,但是我不明白单击按钮如何将ActiveSheet.Selection对象作为函数中的参数发送。

要使用功能区的按钮来选择用户,我缺少什么?

解决方法

XlCall.Excel是对Excel C API的调用,无法从功能区操作的处理程序中完成。

您应该使用COM对象模型与活动工作表进行交互。

首先,安装NuGet软件包ExcelDna.Interop,以便在访问COM对象模型时获得智能感知,然后通过ExcelDnaUtil.Application

访问当前的Excel实例。
using Excel = Microsoft.Office.Interop.Excel;
// ...

[ComVisible(true)]
public class RibbonHandler : ExcelRibbon
{
    public void OnPressMe(IRibbonControl control1)
    {
        var excel = (Excel.Application)ExcelDnaUtil.Application;
        var selection = (Excel.Range)excel.Selection;

        // ...
    }
 }