ExcelDNA引发异常访问Range.Value2

时间:2019-07-05 01:34:49

标签: c# excel excel-dna

我正在将excel插件(使用的shimloader)移植到exceldna,是的,我已经看到了其他SO(以及SO之外)的问题,但是没有任何问题可以解决我的问题,我希望有新的解决方案。

代码很简单。

[ExcelFunction(Name="DoSomething")]
string DoSomething()
{
     var xl = ExcelDna.Application;    
     var callerCell = xl.Caller;
     var row = getRow(excelReference.RowFirst+1, callerCell.WorkSheet) ;
}

在GetRow()中:

var row = (Range)worksheet.Rows[row];
var cell = (Range)bracketRow.Columns[4];

当我检查调试器时,我可以看到检索到的单元格是100%正确的,因为cell.FormulaLocal与excel行和列公式匹配。

FormulaLocal中的值为"OtherSheet!A12"

但是由于某种原因,每当我尝试cell.Value2时,它都会抛出一个COMException而没有其他东西。这不是多线程应用程序,我不明白为什么会这样。

有什么想法吗?

编辑:

当我将公式修改为可以成功引用工作表的值时,它不会抛出该值。

编辑2: 我通过向Excel函数添加IsMacroType=true属性来解决此问题。但是现在xl.Caller返回了null,哎呀

1 个答案:

答案 0 :(得分:0)

需要解决两个问题: 如果单元格的值无效,例如range.Value2抛出COMException。 Excel中的#VALUE。 如果单元格引用了同一工作簿中的另一个工作表,例如range.Value2抛出COMException。 “ OtherSheet!A2”

为解决此问题,我将IsMacroType属性设置为true:

[ExcelFunction(Name="DoSomething",IsMacroType=true)]
string DoSomething()
{
     var xl = ExcelDna.Application;    
     var callerCell = xl.Caller;
     var row = getRow(excelReference.RowFirst+1, callerCell.WorkSheet) ;
}

现在的问题是,IsMacroType原因xl.Caller现在将返回null。

我通过以下方法解决了这个问题:

ExcelReference reference = (ExcelReference)XlCall.Excel(XlCall.xlfCaller);

            string sheetName = (string)XlCall.Excel(XlCall.xlSheetNm,reference);

            int index = sheetName.IndexOf(']', 0) + 1;
            int endIndex = sheetName.Length - index;
            sheetName = sheetName.Substring(index, endIndex);
            var worksheet = (Worksheet)xl.ActiveWorkbook.Sheets[sheetName];

这是我第一次参加Excel竞赛,启用IsMacroType是否有副作用?因为我看到@Govert表达了一些不确定行为的担忧...