Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建格式更改时运行的易失性Excel函数_Excel_Function - Fatal编程技术网

创建格式更改时运行的易失性Excel函数

创建格式更改时运行的易失性Excel函数,excel,function,Excel,Function,我不熟悉创建Excel函数,我需要创建一个函数,该函数接受一系列单元格,并计算未删除单元格的值之和 Function SUMNOTSTRIKE(rng As Range) Dim cell As Range For Each cell In rng If Not (cell.Font.StrikeThrough) Then SUMNOTSTRIKE = SUMNOTSTRIKE + cell.Value End If

我不熟悉创建Excel函数,我需要创建一个函数,该函数接受一系列单元格,并计算未删除单元格的值之和

Function SUMNOTSTRIKE(rng As Range)
    Dim cell As Range
    For Each cell In rng
        If Not (cell.Font.StrikeThrough) Then
            SUMNOTSTRIKE = SUMNOTSTRIKE + cell.Value
        End If
    Next cell
End Function
此功能工作正常,但我不理解为什么在穿透或删除穿透时结果不会自动刷新。我必须再次执行该函数


我读了一些关于
Application.Volatile
,但这只适用于值更改。我需要在格式更改时触发该功能。

在我的评论上展开。如果你加上

Application.Volatile
到您的函数定义(按惯例,作为第一行),然后在工作表的代码模块中:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.Calculate
End Sub
然后,只要更改选择,所有易失性函数都将重新计算。如果只更改选定单元格的删除线并保持该单元格处于选定状态,则不会进行任何重新计算,但一旦移动到其他单元格,函数可能会更新


作为警告,始终触发
应用程序.Calculate
可能会减慢Excel的运行速度。根据您的情况,这可能不是一个适当的解决方案。

这是John优秀建议的一个变体。假设我们在A1A100中有数据

我们可以使用双击事件来同时执行以下操作:

  • 划过单元格的文本
  • 强迫重新计算
在工作表代码区域中输入以下事件宏:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Intersect(Target, Range("A1:A100")) Is Nothing Then Exit Sub
    Cancel = True
    Target.Font.Strikethrough = True
    Application.CalculateFull
End Sub
双击一个感兴趣的单元格将同时点击该单元格并强制重新计算

由于它是工作表代码,因此安装和自动使用非常容易:

  • 在Excel窗口底部附近的选项卡名称上单击鼠标右键
  • 选择查看代码-这将打开一个VBE窗口
  • 粘贴内容并关闭VBE窗口
  • 如果您有任何顾虑,请先在试用工作表上试用

    如果保存工作簿,宏将与工作簿一起保存。 如果在2003年以后使用Excel版本,则必须保存 文件的格式为.xlsm而不是.xlsx

    要删除宏,请执行以下操作:

  • 如上所述打开VBE窗口
  • 清除代码
  • 关闭VBE窗口
  • 要了解有关宏的更多信息,请参阅:

    要了解有关事件宏(工作表代码)的详细信息,请参阅:


    必须启用宏才能使其工作

    我认为这是不可能的。您必须找到一个代理(例如,编写一个以选择更改事件为目标的事件处理程序)或者——也许每隔几秒钟自动运行一次您的函数。明白了,谢谢!!它不起作用。该私有函数应在特定位置应用,或自动执行?函数
    SUMNOTSTRIKE
    应位于标准代码模块中(由VBA编辑器中的
    Insert>module
    创建的模块)对于包含公式的工作表,
    工作表\u selection change
    子项应位于编辑器中已自动存在的工作表代码模块中。我测试了它,它应该工作的描述。THX很多工作!!我喜欢这种方法。它一箭双雕,因为通过通常的用户界面添加删除线有点烦人。