2014-03-06 34 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'發生變化,您的事件甚至不會被觸發(因爲在另一個工作表中更改了單元格) –

相關問題