Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Vba 自定义功能不会自动更新(设置设置为自动计算!)_Vba_Excel - Fatal编程技术网

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

Vba 自定义功能不会自动更新(设置设置为自动计算!),vba,excel,Vba,Excel,我有一个自定义函数,可以检测单元格是否粗体 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放入单元格 这在第一次使用时效果很好,但如果我将引用单元

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

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。自动计算已启用,函数重新计算的唯一方法是重新键入函数添加应用程序。函数顶部的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
如果这两个条件都具备,则每次选择一个可能对您足够有效的不同单元格时,公式都会更新。然而,我建议谨慎使用这种方法,因为如果你有大量的公式,这可能会减慢速度

-编辑-这将解决复制粘贴问题

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

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

将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
如果这两个条件都具备,则每次选择一个可能对您足够有效的不同单元格时,公式都会更新。然而,我建议谨慎使用这种方法,因为如果你有大量的公式,这可能会减慢速度

-编辑-这将解决复制粘贴问题

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

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

好的,所以我会第一个承认这不是一个理想的解决方案,而且相当老套。但我认为它会解决你的问题

将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
首先将工作簿\u打开更改为:

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
选项显式
作为布尔值的公共fntLastCell
公共rngLastCell作为字符串
专用子工作表\u选择更改(ByVal目标作为范围)
如果图纸(“Sheet1”).Range(rngLastCell).Font.Bold fntLastCell,则
算计
如果结束
表(“表1”).rngLastCell=Target.Address
图纸(“图纸1”).fntLastCell=Target.Font.Bold
端接头
现在要让它工作,您必须先保存,然后关闭,然后重新打开工作表

这是通过每次选择新单元格时设置2个全局变量来实现的

一个布尔变量,用于说明上一个选定单元格以前是否为粗体。以及引用同一单元格的字符串变量。因此,您现在可以对照刚刚存在的单元格的当前粗体状态检查退出单元格(输入时)的粗体状态,如果有更改,它将计算工作簿。否则什么也不会发生

希望这能起作用并有所帮助


干杯

好的,所以我会第一个承认这不是一个理想的解决方案,而且是相当粗糙的。但我认为它会解决你的问题

将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
首先将工作簿\u打开更改为:

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
选项显式
作为布尔值的公共fntLastCell
公共rngLastCell作为字符串
专用子工作表\u选择更改(ByVal目标作为范围)
如果图纸(“Sheet1”).Range(rngLastCell).Font.Bold fntLastCell,则
算计
如果结束
表(“表1”).rngLastCell=Target.Address
图纸(“图纸1”).fntLastCell=Target.Font.Bold
端接头
现在要让它工作,您必须先保存,然后关闭,然后重新打开工作表

这是通过每次选择新单元格时设置2个全局变量来实现的

一个布尔变量,用于说明上一个选定单元格以前是否为粗体。以及引用同一单元格的字符串变量。因此,您现在可以对照刚刚存在的单元格的当前粗体状态检查退出单元格(输入时)的粗体状态,如果有更改,它将计算工作簿。否则什么也不会发生

希望这能起作用并有所帮助


干杯

更改单元格格式将永远不会触发函数重新计算,抱歉!正如@KazJaw所述,格式化单元格不会触发计算或重新计算,即使触发重新计算,如果引用的单元格值未更改,非易失性函数也不会重新计算。因此,尽管Ripster回答了您最好的问题,但还是要让您的函数不稳定,尽管这仍然不会仅仅从重新格式化中触发,但它会在每次计算或重新计算工作表时触发(同样,也不会仅仅从更改单元格格式中触发)。您还可以将Ripster的答案本地化为仅引用的列,以帮助解决性能问题。出于好奇(事实上我认为可能有更充分的方法来解决您的问题),为什么要使用此函数?更改单元格格式将永远不会触发函数重新计算,抱歉!正如@KazJaw所述,格式化单元格不会触发计算或重新计算,即使触发重新计算,如果引用的单元格值未更改,非易失性函数也不会重新计算。因此,尽管Ripster回答了您最好的问题,但还是要让您的函数不稳定,尽管这仍然不会仅仅从重新格式化中触发,但它会在每次计算或重新计算工作表时触发(同样,也不会仅仅从更改单元格格式中触发)。您还可以将Ripster的答案本地化为仅引用的列,以帮助解决性能问题。出于好奇(事实上我认为可能有更充分的方法来解决您的问题),您为什么要使用此功能?此功能工作正常,但似乎禁用了复制和粘贴功能?哦,没什么大不了的,我想我会训练他们使用F9;)这工作得很好,但似乎它禁用了复制和粘贴?哦