1

我想将焦点强制到一个特定的单元格上,我通过 XlCall.Excel(XlCall.xlfCaller) 有一个参考。我知道如何在 VSTO 中做到这一点,但是有没有办法用 ExcelDNA 做到这一点?

4

2 回答 2

2

可以使用 ExcelDNA:

var activeCell = new ExcelReference(5, 5);
ExcelAsyncUtil.QueueAsMacro(() => XlCall.Excel(XlCall.xlcSelect, activeCell));

可以跳过“ExcelAsyncUtil.QueueAsMacro”,这取决于您调用 Excel 命令的上下文。如果你从另一个 Excel 函数调用它 - 你应该用 QueueAsMacro 包装它

于 2013-04-26T13:06:43.500 回答
2

一种方法是使用 COM 自动化接口,就像使用 VBA 或 VSTO 一样。只要确保使用Application您从中获得的对象ExcelDnaUtil.Application作为您的根。要将ExcelReference您收到的转换xlfCaller为 COMRange对象,您可以尝试(这是 VB.NET 版本):

Private Function ReferenceToRange(ByVal xlRef As ExcelReference) As Object 
     Dim strAddress As String = XlCall.Excel(XlCall.xlfReftext, xlRef, True) 
     ReferenceToRange = ExcelDnaUtil.Application.Range(strAddress) 
End Function 

如果您想坚持使用 C API,您首先必须选择正确的工作表,然后选择实际的单元格。所以你可能有:

string myCellSheet = (string)XlCall.Excel(XlCall.xlSheetNm, myCell);
XlCall.Excel(XlCall.xlcWorkbookSelect, new object[] { myCellSheet });
XlCall.Excel(XlCall.xlcFormulaGoto, myCell);

您将无法更改工作表函数中的选择,因此我假设您是从宏或功能区处理程序中调用它。

于 2013-02-04T20:11:47.763 回答