2016-08-18 79 views
0

我有一个小组,我希望在单元更新为包含某个值时运行。如何更新单元格值时触发Excel VBA宏?

现在,我使用如下代码:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    If Target.Cells.Count = 1 Then 
    If Target.Value = XYZ Then 
     my_sub a, b, c 
    End If 
    End If 
End Sub 

问题现在的问题是,当我直接编辑这些细胞中的宏观仅火灾,而不是当在其它细胞的变化迫使这些细胞改变。例如,这些单元格没有很好的定义,所以我不能硬编码“当A5改变时”。每当我的工作簿中的任何单元格更新(手动或通过公式)以满足自己的条件时,我都需要这样做。

+2

究竟是不是在这里工作?这是事实,这不能捕捉公式的变化?在这种情况下,查看“Worksheet.Calculate'事件(https://msdn.microsoft.com/en-us/library/office/ff838823.aspx)。 – Mikegrann

+2

此外,只要确保你的代码不是你实际使用的 - 如果是,你是否想'如果target.value =“XYZ”'?什么不适用于宏? – BruceWayne

+0

它仅在我直接编辑单元格时触发,而不是在其他单元格中的更改强制更改时触发。我不知道如何使它与Worksheet.Calculate一起工作,因为没有Target参数。不,这不是代码,所以XYZ上的引号不是问题 – user1923052

回答

2

提供你的目标是仅与需要监测的公式单个细胞,这将工作:

Option Explicit 

Dim tarVal As Variant 

Private Sub Worksheet_Activate() 

    tarVal = ActiveSheet.Range("A1").Value ' change range parameter to the address of the target formula 

End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim tempVal As Variant 

    tempVal = ActiveSheet.Range("A1").Value 

    If tempVal <> tarVal Then 
     tarVal = tempVal 

     ' your code here 

     MsgBox "The value of A1 has changed" ' for testing purposes only, delete later 
    End If 

End Sub 

编辑

下面的代码适用于细胞的整个范围,但只有在自动计算打开的情况下。如果监视的单元格不连续,则只需在定义目标范围时使用union语句。 (在本例中,目标范围是A1:A10)。这是假设目标范围内只有一个公式可以一次更改其值。如果多个目标公式可以做到这一点,则删除Worksheet_Change子程序中的Exit for

Option Explicit 

Dim tarCellCount As Long 
Dim tarRng As Range 
Dim tarVals As Variant 

Private Sub Worksheet_Activate() 

    Dim i As Long 
    Dim cll As Range 

    Set tarRng = ActiveSheet.Range("A1:A10") ' change range parameter to the addresses of the target formulas 

    tarCellCount = tarRng.Cells.count 
    ReDim tarVals(1 To tarCellCount) As Variant 

    For Each cll In tarRng 
     i = i + 1 
     tarVals(i) = cll.Value 
    Next cll 

End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim changeBool As Boolean 
    Dim i As Long 
    Dim cll As Range 
    Dim tempVal As Variant 

    For Each cll In tarRng 
     tempVal = cll.Value 
     i = i + 1 

     If tempVal <> tarVals(i) Then 
      tarVals(i) = tempVal 
      changeBool = True 
      Exit For 
     End If 
    Next cll 

    If changeBool Then 

     ' your code here 

     MsgBox "The value of one of the cells in the target range has changed" ' for testing purposes only, delete later 
    End If 

End Sub 
-1

目标是一个可以包含更多单元格的范围。这段代码应该适合你。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    For Each cell In Target.Cells 
    If cell.Value = XYZ Then 
     my_sub a, b, c 
    End If 
    Next cell 
End Sub 

编辑:我知道你想火也当公式更新定义的值。如果您要检查每个单元格,它可能会很慢,但实际上取决于文件的大小。这里有一些代码让你知道如何去做。

Private Sub Workbook_SheetCalculate(ByVal sh As Object) 
    For Each cell In sh.Cells.SpecialCells(xlCellTypeFormulas).Cells 
     If cell.Value = XYZ Then 
      my_sub a, b, c 
     End If 
    Next cell 
End Sub 
1
  1. 加入你的细胞被跟踪到一个名为公式(命名范围)。我用rngValue
  2. 使用一个静态变量来跟踪你要跟踪的价值有多少次在此范围内
  3. 使用Calculate事件发生时检查是否出现次数的数量变化

代码

Private Sub Worksheet_Calculate() 
Dim StrIn As String 
Static lngCnt As Long 
Dim lngCnt2 As Long 

StrIn = "apples" 

lngCnt2 = Application.WorksheetFunction.CountIf(Range("rngValue"), StrIn) 
If lngCnt2 <> lngCnt Then 
    lngCnt = lngCnt2 
    Call mysub 
End If 

End Sub 
+0

我喜欢使用'Static','CountIf'的干净优雅的方法,和“Worksheet_Calculate”事件。然而,一个缺点是,这是假定所有监控公式的价值都是相同的,但情况并非总是如此,尽管我会告诉你OP对此并不十分清楚。然而,一般来说,拥有一整套具有必须包含完全相同值的公式的单元格是不常见的,除非值是某种校验和或类似值。 – Miqi180

相关问题