2014-03-06 35 views
0

我想运行宏当在小区F1的值由计算= DAYS360(B2,B1)宏当单元值改变

Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.Address = "$F$1" Then 
    MsgBox "You changed THE CELL!" 
End If 
End Sub 

有更新不会自动运行有关这方面的几个主题,并没有解决方案为他们工作..我感到困惑。如果我手动更改单元格F1中的值,宏将运行。但是,当我在日期列中添加一个新值导致单元格F1中的计算更新时,什么都不会发生。

其他一些主题提供的解决方案使用交叉函数,但是,这些给我的结果相同。

+4

将'Worksheet_Change'更改为'Worksheet_Calculate' –

+0

+1,不错,正在寻找像这样的东西我自己 – Pedrumj

+0

当我使用Calculate代替Change时,出现编译错误。 “过程声明与具有相同名称的事件或过程的描述不匹配” - 任何建议? – DLittlejohn412

回答

1

您可以更改您的更改事件以查找F1正在查看的单元格。

Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.Address = "$B$1" Or Target.Address = "$B$2" Then 
    MsgBox "You changed THE CELL!" 
End If 
End Sub 

这是非常合情合理的,因为这实际上是要更改的细胞,我抓住了这个从线when I add a new value in the date column that causes the calculation in cell F1 to update

Alternativly如果您的公式引用将改变你可以使用下面的代码:

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim r As Range 
For Each r In Range("F1").Precedents 
    If Target.Address = r.Address Then 
     MsgBox "You changed THE CELL!" 
     Exit For 
    End If 
Next r 
End Sub 

上面的代码会做什么:只要工作表中的任何单元格发生更改,它就会转到单元格F1,然后查看被更改的单元格是否是F1用于计算的单元格之一,如果它不是我如果是的话,它不会做任何事情,它会触发msgbox。

UPDATE:另一种选择,将在所有的纸张的工作,以查看是否任何改变单元被依赖于由公式的单元格F1的内侧Sheet 1上,当细胞是在另一页上可以在下面找到。

Public Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range) 
On Error GoTo NextStep 
Dim r As Range 
For Each r In Sheets("SheetF1IsOn").Range("F1").Precedents 
    If Target.Address = r.Address Then 
     MsgBox "You changed THE CELL!" 
     Exit For 
     Exit Sub 
    End If 
Next r 

NextStep: 
If InStr(Replace(Sheets("SheetF1IsOn").Range("F1").Formula, "'", ""), sh.Name + "!" + Target.Address) _ 
    Or InStr(Replace(Sheets("SheetF1IsOn").Range("F1").Formula, "'", ""), sh.Name + "!" + Target.Address(False)) _ 
    Or InStr(Replace(Sheets("SheetF1IsOn").Range("F1").Formula, "'", ""), sh.Name + "!" + Target.Address(, False)) _ 
    Or InStr(Replace(Sheets("SheetF1IsOn").Range("F1").Formula, "'", ""), sh.Name + "!" + Target.Address(False, False)) > 0 Then 
     MsgBox "You changed THE CELL!" 
End If 
End Sub 

如果需要工作两者上的其他片材和当前片,那么你将不得不增加另一个如果测试式中的目标,然后查看是否它是通过在工作簿中的片材的名称之前和!

UPDATE2:上述两个都略有瑕疵(如Simoco指出)的最后一件事我可以想出是使用公共变量,设置你的细胞,每个的价值计算工作表的时间以测试值是否更改。 (如果做一整列,你可能需要暗淡的集合或阵列测试反对)

所以你内心的工作模块,用以下内容替换原来的代码:

Option Explicit 
Public F1ValueOld As Variant 

Private Sub Worksheet_Calculate() 
    If Range("F1").Value <> F1ValueOld Then 
     MsgBox "You changed THE CELL!" 
     F1ValueOld = Range("F1").Value 
    End If 
End Sub 

这将同时工作簿工作是开放的,但你会得到一个错误,当您关闭并重新打开工作簿,所以里面的工作簿模块添加以下代码也:

Private Sub Workbook_Open() 
    F1ValueOld = Sheets("SheetF1IsOn").Range("A1").Value 
End Sub 

这应该没有完成你正在尝试什么。

+0

'.Precedents'仅从_active sheet_提供先例。如果'F1'中的公式将是'= Sheet2!B2',那么您的方法将不起作用 –

+0

@simoco Approuch会工作(测试所有单元格公式所依赖的),只需使用regex从单元格公式中提取范围,虽然可能会有更多的工作,但可能不是每次更换单元格时都想要解雇的东西,但可以工作。无论哪种方式,我的理论是基于他在他的问题'= DAYS360(B2,B1)' – user2140261

+0

的公式,它可能是一个特殊情况'= DAYS360(B2,B1)'。对于'= Sheet2!B2',如果单元格'B2'发生变化,您的事件甚至不会被触发(因为在另一个工作表中更改了单元格) –

相关问题