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

时间:2013-06-13 13:34:28

标签: excel vba excel-vba

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

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 这种方法效果很好并且第一次出现但是如果我使参考单元格变为粗体,则数字保持为0.自动计算开启,函数再次计算的唯一方法是重新键入函数

2 个答案:

答案 0 :(得分:2)

将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

如果这两件事都已到位,那么每次选择可能适合您的不同单元格时,您的公式都会更新。但是,我建议谨慎使用这种方法,因为如果你有非常多的公式,这可能会减慢速度。

-Edit-这应该可以解决复制粘贴问题。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim col As Range

        For Each col In ActiveSheet.UsedRange.Columns
                col.Calculate
        Next
End Sub

答案 1 :(得分:0)

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

将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

首先将您的工作簿_打开更改为:

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

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

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

现在要让它工作,你必须保存然后关闭,然后重新打开你的工作表。

每次选择新单元格时,都可以设置2个全局变量。

一个布尔变量,表示所选择的最后一个单元格的天气是否以前是否大胆。以及引用相同Cell的String变量。因此,您现在可以检查您退出的单元格的粗体状态(输入时)与刚刚存在的单元格的当前粗体状态,如果有更改,它将计算工作簿。否则什么都不会发生。

希望这有效并有所帮助,

干杯