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