0

我的 C# 代码使用 Microsoft.Office.Interop.Excel 库操作 Excel 范围。我需要将公式数组分配给选定的范围。我尝试了网上推荐的各种方法,包括微软的推荐,但至今无法使其正常工作。

我观察到两个问题:

问题 1. 分配在表面上看起来很好:它没有失败,范围内的单元格对象显示分配的 .ArrayFormula 属性,每个单元格中的电子表格公式出现在大括号中。但是,公式数组实际上是不连贯的:范围内的每个单元格都可以单独更改,这是普通公式数组所不允许的。它的行为就好像每个单元格都有自己的单单元格公式数组,独立于其他单元格。不管我尽了最大的努力,情况总是如此。这个问题实际上有一个正常工作的解决方案吗?

问题 2。我的数组公式包含对另一个范围(范围 A)的引用,我需要在 R1C1 样式中引用它。我需要目标范围中的每个单元格中的数组公式都指向同一个范围 A。不知何故,我总是最终目标范围中的每个单元格都有自己的公式版本,指的是移动的“范围 A”区域。无论单元格如何,如何使参考保持在原位?

NB 您可能认为问题 2 导致了问题 1,但事实并非如此:例如,当数组公式很简单时,如“=SIN(1)”,问题 1 仍然会发生。

我真的很感激任何可行的建议。提前非常感谢。

4

1 回答 1

0

似乎没有人感兴趣,但是我找到了解决方案,并将回答我自己的问题。

显然,在 C# 代码中分配 Excel 数组公式仅在公式为 A1 样式而不是 R1C1 样式时才有效。就我而言,我从 R1C1 样式的公式开始,因此需要转换为 A1 样式。这是通过将原始 R1C1 样式的公式分配给目标范围的左上角单元格来实现的:

topLeftCell.Formula = myR1C1Formula;  
// topLeftCell.FormulaR1C1 = myR1C1Formula also works

分配给该特定单元格将确保 A1 样式的公式包含正确的引用。将转换后的公式作为字符串取回:

string formulaA1 = topLeftCell.Formula;

通过调整左上角的单元格来获取对整个目标范围的引用:

Excel.Range newArrayRange = topLeftCell.Resize[height, width];

调整大小操作必须在以下赋值之前。最后,将 A1 样式的公式分配给整个目标范围的 FormulaArray 属性:

newArrayRange.FormulaArray = formulaA1; 

这完美地工作,没有问题或副作用。

于 2013-10-03T00:44:44.500 回答