C# 以编程方式刷新工作表中的特定公式

C# 以编程方式刷新工作表中的特定公式,c#,excel,C#,Excel,我开发了一个Excel插件。它向Excel应用程序公开了三个用户定义的公式。一切都很好。现在我需要添加一个刷新按钮,当单击该按钮时,将仅刷新工作表中的公式。那么在按钮的点击处理程序中,我需要编写什么代码 使用Application.CalculateFull()我可以刷新工作表中的所有公式。是否有办法只刷新工作表中的特定公式而不刷新整个工作表 Range("A3:C5").Calculate 'calculate all the cells from A3 to C5 或 我的意思是我开发了一

我开发了一个Excel插件。它向Excel应用程序公开了三个用户定义的公式。一切都很好。现在我需要添加一个刷新按钮,当单击该按钮时,将仅刷新工作表中的公式。那么在按钮的点击处理程序中,我需要编写什么代码

使用
Application.CalculateFull()
我可以刷新工作表中的所有公式。是否有办法只刷新工作表中的特定公式而不刷新整个工作表

Range("A3:C5").Calculate 'calculate all the cells from A3 to C5

我的意思是我开发了一个excel插件。。它暴露了 3个用户定义的公式(x、y、z)到 excel应用程序。所有这些都有效 好的现在我需要添加一个刷新 单击将刷新的按钮 仅适用于中的(x、y和z)公式 工作表。所以在按钮的 单击我需要的代码 写书写 Application.CalculateFull()刷新 所有的公式。那不是我想要的 需要

我的首要建议是在整个工作簿中查找/替换用户定义函数(UDF)的名称。例如,如果您的UDF名为“MyFunction”,您可能希望将“MyFunction”()替换为“MyFunction”()

假设您的Excel.Application引用名为“excelApp”,使用C#在所有工作簿中查找/替换的代码如下所示:

foreach (Excel.Workbook workbook in excelApp.Workbooks)
{
    foreach (Excel.Worksheet worksheet in workbook.Worksheets)
    {
        worksheet.Cells.Replace(
            "MyFunction(",
            "MyFunction(",
            Excel.XlLookAt.xlPart,
            Excel.XlSearchOrder.xlByRows,
            false,
            Type.Missing,
            Type.Missing,
            Type.Missing);
    }
}
其他较小的想法:

(a) 利用实时数据(RTD)服务器。这通常用于频繁或持续更新股票价格等数据。但是,这也可用于执行“按需刷新”方法。我个人认为,在这种情况下,这将是矫枉过正的,因为查找/替换工作100%完美,而且更容易实现,但RTD肯定可以在这里使用。有关如何做到这一点的文章,请参阅它面向VB.NET,而不是C#,但原则是相同的

(b) 向函数MyFunction(x、y、z、Refresh)添加另一个参数。通过让每个函数引用“Refresh”单元格(可放置在隐藏的工作表或隐藏的工作簿上),可以更改“Refresh”单元格以强制所有函数重新计算。缺点是它需要此额外的伪参数

(c) 坚持使用Application.CalculateFull(),因为这是迄今为止最容易编写的代码。我理解性能问题,但它非常容易编写(只需一行代码),而且100%可靠

总的来说,我认为我应该使用Find/Replace方法,它是一种干净、简单、非常有效的选择性重新计算技术


--Mike

这可能有助于指定您正在使用的API。具体是什么意思?您可以选择一个单元格并刷新它。有趣的是,我以前从未见过。我可以想象Excel会计算任何输入到所需单元格计算中的单元格。因此,如果A3指A2,则A2也需要计算。也可能适用于下游计算,但我不确定。@Gutthrower:公式计算仅适用于直接相关的单元格。即,如果假设A3有公式,其中A1和A2的和,则选择性计算仅适用于A1和A2有文字值的情况。如果A1包含公式,则在这种情况下不会计算。因为,其中一个是asking Excel仅用于评估A3的公式。
foreach (Excel.Workbook workbook in excelApp.Workbooks)
{
    foreach (Excel.Worksheet worksheet in workbook.Worksheets)
    {
        worksheet.Cells.Replace(
            "MyFunction(",
            "MyFunction(",
            Excel.XlLookAt.xlPart,
            Excel.XlSearchOrder.xlByRows,
            false,
            Type.Missing,
            Type.Missing,
            Type.Missing);
    }
}