自定义function不会自动更新(设置被设置为自动计算!)

我有一个自定义函数,检测单元格是否粗体

Function isBold(cellBold) If cellBold.Font.Bold = True Then isBold = 1 ElseIf cellBold.Font.Bold = False Then isBold = 0 Else isBold = 0 End If End Function 

如果参考单元格为粗体,则将其放置在单元格中,如果参考单元格为粗体,则放置1;如果不是粗体,则放置0如果使参考单元格的粗体显示为粗体,则第一次操作的效果非常好。自动计算已打开,唯一方法重新计算的函数是重新input函数

将Application.Volatile添加到函数的顶部将使其在工作簿更改事件触发时自动更新。

 Function isBold(cellBold) Application.Volatile If cellBold.Font.Bold = True Then isBold = 1 ElseIf cellBold.Font.Bold = False Then isBold = 0 Else isBold = 0 End If End Function 

如果您只是粗体显示一个结果,但是您可以将事件添加到正在处理的工作表中,这不会对您有所帮助

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Calculate End Sub 

如果这两件事都已经到位,那么每次select一个可能适合您的不同单元时,您的公式将会更新。 不过,我build议谨慎使用这种方法,因为如果你有大量的公式,这可能会减慢速度。

– 编辑 – 这应该解决复制粘贴问题。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim col As Range For Each col In ActiveSheet.UsedRange.Columns col.Calculate Next End Sub 

好的,所以我会第一个承认这不是一个理想的解决scheme,而且非常黑客。 但我认为这将解决您的解决scheme。

将volatile行添加到代码中之后:

 Function isBold(cellBold) Application.Volatile True If cellBold.Font.Bold = True Then isBold = 1 ElseIf cellBold.Font.Bold = False Then isBold = 0 Else isBold = 0 End If End Function 

首先将您的Workbook_Open更改为:

 Private Sub Workbook_Open() Sheets("Sheet1").rngLastCell = Range("A1").Address Sheets("Sheet1").fntLastCell = Range("A1").Font.Bold End Sub 

然后在你正在使用的工作表上(在我的示例Sheet1 )将其添加到工作表函数中:

 Option Explicit Public fntLastCell As Boolean Public rngLastCell As String Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Sheets("Sheet1").Range(rngLastCell).Font.Bold <> fntLastCell Then Calculate End If Sheets("Sheet1").rngLastCell = Target.Address Sheets("Sheet1").fntLastCell = Target.Font.Bold End Sub 

现在有它的工作,你必须保存然后closures,然后重新打开你的工作表。

这可以通过每次select新的单元格时设置2个全局variables来工作。

一个布尔variables,说明天气最后单元格select以前是粗体还是不粗体。 和一个引用同一个Cell的stringvariables。 因此,您现在可以检查您退出的单元格的粗体状态(input时)是否与刚刚存在的单元格的当前粗体状态相对应,如果发生更改,则会计算工作簿。 否则什么都不会发生。

希望这个作品和帮助,

干杯