【问题标题】:Get excel selection content when clicking a ribbon button using exceldna使用 exceldna 单击功能区按钮时获取 excel 选择内容
【发布时间】:2020-10-27 21:37:55
【问题描述】:

我正在尝试读取和更新用户的选择(当前选择的 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 对象作为函数中的参数发送。

使用功能区按钮获取用户选择我缺少什么?

【问题讨论】:

    标签: c# excel excel-dna


    【解决方案1】:

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

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

    首先安装NuGet包ExcelDna.Interop,这样就可以在访问COM对象模型的时候得到intellisense,然后通过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;
    
            // ...
        }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多