无法在 C# 中对选定的 Excel 范围对象分配公式数组

本文关键字:对象 范围 Excel 分配 数组 | 更新日期: 2023-09-27 18:32:55

我的 C# 代码使用 Microsoft.Office.Interop.Excel 库操作 Excel 范围。我需要将公式数组分配给选定的范围。我已经尝试了在线推荐的各种方法,包括Microsoft推荐,但到目前为止无法使其正常工作。

我观察到两个问题:

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

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

:注:您可能认为问题 2 导致了问题 1,但事实并非如此:例如,当数组公式很简单时,如"=SIN(1(",问题 1 仍然会出现。

我将不胜感激任何工作建议。提前非常感谢。

无法在 C# 中对选定的 Excel 范围对象分配公式数组

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

显然,仅当公式采用 A1 样式而不是 R1C1 样式时,C# 代码中 Excel 数组公式的分配才有效。就我而言,我从 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; 

这完美无缺,没有问题或副作用。