ExcelDNA 抛出异常访问 Range.Value2

ExcelDNA throwing exception accessing Range.Value2

我正在将一个 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 而没有别的。这不是多线程应用程序,我不明白为什么会这样。

有什么想法吗?

编辑:

当我将公式修改为如果 sheet 引用成功它应该得到的值时,它不会抛出。

编辑 2: 我通过向 excel 函数添加 IsMacroType=true 属性来解决这个问题。但是现在xl.Callerreturnsnull,哎呀

需要解决两个问题: 如果单元格具有无效值,则 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 现在 return 为空。

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

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 表达了对未定义行为的一些担忧...