2013-02-04 37 views

回答

1

一种方法是使用COM自动化接口,就像从VBA或VSTO那样。请确保使用ExcelDnaUtil.Application作为根的Application对象。从您从xlfCaller收到一个COM Range对象ExcelReference转换,你可以尝试(这是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); 

您将无法更改工作表函数的选择,所以我想你是从宏观或带状处理程序调用此。

+0

感谢您的回应!在C#中,我无法访问ExcelDnaUtil.Application上的范围方法,因为它是对象类型的。我应该输入什么类型? – Franchesca

+0

哦,我明白了,我只是用动态:D – Franchesca

+0

这行'XlCall.Excel(XlCall.xlfReftext,xlRef,True)'正在轰炸。我不打算从工作表函数中更改选定内容,但我从工作表函数中获取了xlfCaller。这可能是一个问题吗? – Franchesca

1

有可能与ExcelDNA做到:

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

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

相关问题