使用 exceldna 单击功能区按钮时获取 excel 选择内容
Get excel selection content when clicking a ribbon button using exceldna
我正在尝试读取和更新用户的选择(当前选择的 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 对象模型与活动交互 sheet。
首先安装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;
// ...
}
}
我正在尝试读取和更新用户的选择(当前选择的 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 对象模型与活动交互 sheet。
首先安装NuGet包ExcelDna.Interop
这样访问COM对象模型时就可以得到intellisense,然后通过ExcelDnaUtil.Application
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;
// ...
}
}