excel - 让 Excel 函数影响 'other' 单元格

标签 excel formula vba

假设我创建了一个 Sub(不是函数),其生命任务是获取事件单元格(即选择)并将相邻单元格设置为某个值。这工作得很好。

当您尝试将该 Sub 转换为函数并尝试从电子表格中对其求值时(即,将其公式设置为“=MyFunction()”),Excel 会因为您试图影响该函数的值而咆哮。非事件单元格,只需强制函数返回#VALUE,而不触及相邻单元格。

是否可以关闭这种保护行为?如果没有,有什么好方法来解决它?如果可能的话,我正在寻找有能力的开发人员可以在 1-2 周内完成的工作。

问候, 艾伦。

注意:我使用的是 2002,所以我更喜欢适用于该版本的解决方案。话虽如此,如果 future 的版本使这变得更加容易,我也想知道。

最佳答案

这是不可能完成的,这是有道理的,因为:

  • 调用工作表函数时,包含该函数的单元格不一定是事件单元格。所以你无法可靠地找到相邻的单元格。

  • 当 Excel 重新计算工作表时,它需要维护单元格之间的依赖关系。所以它不能允许工作表函数任意修改其他单元格。

您能做的最好的事情是:

  • 处理 SheetChange 事件。如果包含您的函数的单元格正在更改,请修改相邻的单元格。

  • 在相邻单元格中放置一个工作表函数以返回所需的值。

更新

关于评论:“我希望此函数适用于‘空白’电子表格,因此我不能真正依赖可能尚不存在但需要调用此函数的电子表格的 SelectionChange 事件” :

  • 您可以将您的函数放入 XLA 插件中吗?那么您的 XLA 加载项可以处理在该 Excel 实例中打开的所有工作簿的 Application SheetChange (*) 事件吗?

关于评论:“不过,如果您将 Excel 保持在 CalculationMode = xlManual 并仅填写值,则应该没问题”

  • 即使 CalculationMode 为 xlManual,Excel 也需要维护单元格之间的引用依赖关系树,以便能够按正确的顺序进行计算。如果其中一个函数可以更新任意单元格,这就会打乱顺序。这可能就是 Excel 施加此限制的原因。

(*) 我最初在上面编写了 SelectionChange,现在已更正 - 当然,正确的事件是 Workbook 或 Application 对象的 SheetChange,或者 Worksheet 对象的 Change。

更新2 关于AlanR's post的一些评论描述如何使用计时器“有点”使其工作:

  • 目前尚不清楚计时器函数(“Woohoo”)如何知道要更新哪些单元格。您没有任何信息表明哪个单元格包含触发计时器的公式。

  • 如果公式存在于多个单元格中(在相同或不同的工作簿中),则在重新计算期间将多次调用 UDF,从而覆盖 timerId。因此,您将无法可靠地销毁计时器,并且会泄漏 Windows 资源。

关于excel - 让 Excel 函数影响 'other' 单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/201261/

相关文章:

vba - 循环宏以创建新工作表、重命名、从网络添加数据,然后循环返回直到完成

vba - 将文件保存到 OneDrive/Sharepoint

Excel VBA 等待 Shell 完成后再继续脚本

java - 如何从 HSSFWorkbook POI API 获取 Excel 工作表“命名索引”区域的高度和宽度

excel - 无法获取工作表函数类的 Sumif 属性

r - 有没有简单的方法可以在 R 中创建公式列表

vba - 删除格式为货币的包含 0 的行

excel - 在 Excel 中查找范围的第一个非空白单元格的标题索引的公式?

excel - 使用 Excel 数据透视表进行趋势分析和条件格式化

vba将条件传递给变量中的countif