Vba 如何检测一个单元格是否被=如果();公式,而不是用户

Vba 如何检测一个单元格是否被=如果();公式,而不是用户,vba,excel,if-statement,cell,Vba,Excel,If Statement,Cell,我读了很多页都这么说,但是没有一页是通过“if函数”而不是手工来解决值变化的 我得到的代码是: Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Me.Range("A18:A30")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop On Error GoTo

我读了很多页都这么说,但是没有一页是通过“if函数”而不是手工来解决值变化的

我得到的代码是:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("A18:A30")) Is Nothing Then Exit Sub
    Application.EnableEvents = False 'to prevent endless loop
    On Error GoTo Finalize 'to re-enable the events
    MsgBox "You changed THE CELL!"
Finalize:
    Application.EnableEvents = True
End Sub
仅当我手动更改值时,它才起作用


提前谢谢。

Sheet1
中写下这篇文章,然后运行
TestMe
子部分:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("A1:A30")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    On Error GoTo Finalize
    MsgBox "You changed THE CELL!"
Finalize:
    Application.EnableEvents = True
End Sub

Sub TestMe()
    Range("A1") = 34
End Sub
它在我的电脑上运行得很好


如果内置Excel函数更改了单元格,则@Vincent G的注释说明正确答案:

工作表\u更改事件当用户或外部链接更改工作表上的单元格时发生。当单元格在重新计算过程中发生更改时,不会发生此事件。使用“计算”事件捕获图纸重新计算


如果您想根据
范围(A18:A30)
的某些更改来跟踪calclulation事件,这是一个可行的解决方案:

  • 将新工作表添加到工作簿(
    Sheet2
  • 在当前工作表中写入计算事件:

    Private Sub Worksheet_Calculate()        
        Dim cell As Range
        For Each cell In Sheet2.Range("A18:A30")
            If cell <> Sheet1.Range(cell.Address) Then
                cell = Sheet1.Range(cell.Address)
            End If
        Next cell
    End Sub
    
    Private子工作表_Calculate()
    暗淡单元格作为范围
    表2.范围(“A18:A30”)中的每个单元格
    如果单元格Sheet1.范围(单元格地址),则
    单元格=表1.范围(单元格地址)
    如果结束
    下一个细胞
    端接头
    
  • 表2中
    编写一个事件,捕捉更改


将其写入
表1
并运行
TestMe
子部分:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("A1:A30")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    On Error GoTo Finalize
    MsgBox "You changed THE CELL!"
Finalize:
    Application.EnableEvents = True
End Sub

Sub TestMe()
    Range("A1") = 34
End Sub
它在我的电脑上运行得很好


如果内置Excel函数更改了单元格,则@Vincent G的注释说明正确答案:

工作表\u更改事件当用户或外部链接更改工作表上的单元格时发生。当单元格在重新计算过程中发生更改时,不会发生此事件。使用“计算”事件捕获图纸重新计算


如果您想根据
范围(A18:A30)
的某些更改来跟踪calclulation事件,这是一个可行的解决方案:

  • 将新工作表添加到工作簿(
    Sheet2
  • 在当前工作表中写入计算事件:

    Private Sub Worksheet_Calculate()        
        Dim cell As Range
        For Each cell In Sheet2.Range("A18:A30")
            If cell <> Sheet1.Range(cell.Address) Then
                cell = Sheet1.Range(cell.Address)
            End If
        Next cell
    End Sub
    
    Private子工作表_Calculate()
    暗淡单元格作为范围
    表2.范围(“A18:A30”)中的每个单元格
    如果单元格Sheet1.范围(单元格地址),则
    单元格=表1.范围(单元格地址)
    如果结束
    下一个细胞
    端接头
    
  • 表2中
    编写一个事件,捕捉更改


就像@Vincent G所说的那样简单

Private Sub Worksheet_Calculate()

     Call YourFunction

End Sub

就像@Vincent G所说的那样简单

Private Sub Worksheet_Calculate()

     Call YourFunction

End Sub

另一种解决办法;不要在工作表每次重新计算时触发函数,而是在模块中添加函数:

Function DetectChange() As Integer
    MsgBox "You changed THE CELL!"
    DetectChange = 0
End Function
假设公式的结果是数值的:(否则函数的结果必须是空字符串,“+”必须是“&”) 在末尾添加到IF公式…+Detectchange() 现在,重新计算公式时,只会出现一个msgbox

编辑达伦·巴特鲁普·库克:

当公式重新计算时,我发现这个代码有效。如果我更改了一个不影响其输入的单元格的单元格,并且它没有使用
Calculate Now
Calculate Sheet
触发,则它不会触发 它确实偶尔会触发我在其中使用函数的所有公式,但那似乎是在我调试时发生的-可能需要进一步调查

Public Function DetectChange()
    MsgBox "You changed cell " & Application.Caller.Address
End Function  
e、 g.:

=IF(A1=1,A2,A3)&DetectChange()
在单元格A4中输入,如果单元格A1,A2或A3发生更改,则显示消息“youchanged cell$A$4”。

另一种解决方案;不要在工作表每次重新计算时触发函数,而是在模块中添加函数:

Function DetectChange() As Integer
    MsgBox "You changed THE CELL!"
    DetectChange = 0
End Function
假设公式的结果是数值的:(否则函数的结果必须是空字符串,“+”必须是“&”) 在末尾添加到IF公式…+Detectchange() 现在,重新计算公式时,只会出现一个msgbox

编辑达伦·巴特鲁普·库克:

当公式重新计算时,我发现这个代码有效。如果我更改了一个不影响其输入的单元格的单元格,并且它没有使用
Calculate Now
Calculate Sheet
触发,则它不会触发 它确实偶尔会触发我在其中使用函数的所有公式,但那似乎是在我调试时发生的-可能需要进一步调查

Public Function DetectChange()
    MsgBox "You changed cell " & Application.Caller.Address
End Function  
e、 g.:

=IF(A1=1,A2,A3)&DetectChange()
在单元格A4中输入,如果单元格A1、A2或A3发生更改,则显示消息“您已更改单元格$A$4”。

在用户或外部链接更改工作表上的单元格时发生。当单元格在重新计算过程中发生更改时,不会发生此事件。使用Calculate事件捕获工作表的重新计算。但是我没有要比较的目标。@David_helo-那么您需要考虑某种类型的体系结构。例如,将
A18:A30
的值保存到另一张工作表中,并在计算事件时每次将这些值与当前工作表中的
A18:A30
进行比较,并给出一些
MsgBox()
。当用户或外部链接更改工作表上的单元格时发生。当单元格在重新计算过程中发生更改时,不会发生此事件。使用Calculate事件捕获工作表的重新计算。但是我没有要比较的目标。@David_helo-那么您需要考虑某种类型的体系结构。例如,将
A18:A30
的值保存到另一张表中,在计算事件时,每次将这些值与当前表中的
A18:A30
进行比较,并给出一些
MsgBox()
。通过“If函数”更改单元格不是通过宏。@David_helo-我从VBA代码中理解了If函数的
,我得到了解决方案。正如@Vincent G所说,只有使用Calculate Event,单元格才会被“If函数”而不是宏所改变。@David_helo-我理解了
If函数