2013-10-04 71 views
1

我有一個工作表,它記錄了對單元格所做的更改。它去如下顯示單元格的舊值和新值

Public OldVal As String 
Public NewVal As String 


Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub 
OldVal = Target.Value 
End Sub 


Private Sub Worksheet_Change(ByVal Target As Range) 
Dim LDate As String 

If Target.Cells.Count > 1 Then Exit Sub 
NewVal = Target.Value 
Sheets("corrections").Cells(Rows.Count, "A").End(xlUp)(2).Value = Now & "_Sheet " & ActiveSheet.Name & " Cell " & Target.Address(0, 0) & " was changed from '" & OldVal & "' to '" & NewVal & "'" 
OldVal = "" 
NewVal = "" 
End Sub 

遇到的問題IM是,由於某種原因,它永遠不會顯示以前的值。它只會在Sheet FA Cell B5從「'變爲'12'時輸出它,即使例如說10是在單元格中。

我也很想知道是否有一種方法,你可以擁有它,以便這段代碼不會一直運行。編號喜歡有一個你點擊的按鈕,在這一點上它會啓動並開始記錄更改。

感謝

+1

如果使用XL2007 +然後'Target.Cells.Count'可以給你錯誤。改爲使用'Target.Cells.CountLarge'。 –

回答

0

爲什麼我的OldVal沒有出現的問題是它被保存在數組中。所以當我告訴它看OldVal(1,1)時,它就像它應該那樣工作。謝謝您的幫助。最後的工作代碼爲:

公共OLDVAL作爲字符串 公共的newval作爲字符串

私人小組Worksheet_SelectionChange(BYVAL目標作爲範圍) 如果表( 「更正」)範圍( 「G1」)<>「是」然後退出子 OLDVAL = Target.Value2

結束子

私人小組Worksheet_Change(BYVAL目標作爲範圍) 如果表( 「校正」)。範圍( 「G1」)<> 「是」然後 退出Sub 如果Target.Cells.CountLarge> 1 Then Exit Sub NewVal = Target.Value 表(「corrections」)。Cells(Rows.Count,「A」)。End(xlUp)(2).Value = Now &「_Sheet」& ActiveSheet.Name &「Cell」& Target。地址(0,0)& 「被從改變 '」 & OLDVAL(1,1)& 「 '到'」 &的newval & 「'」

OldVal = "" 
NewVal = "" 

結束子

2

我把你貼的代碼有一個非常小的變化工作:

Public OldVal As String 
Public NewVal As String 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub 
    OldVal = Target.Value 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim LDate As String 
    If Target.Cells.Count > 1 Then Exit Sub 
    NewVal = Target.Value 
    Application.EnableEvents = False 
     Sheets("corrections").Cells(Rows.Count, "A").End(xlUp)(2).Value = Now & "_Sheet " & ActiveSheet.Name & " Cell " & Target.Address(0, 0) & " was changed from '" & OldVal & "' to '" & NewVal & "'" 
    Application.EnableEvents = True 
    OldVal = "" 
    NewVal = "" 
End Sub 

關於第二個問題,先從:

Application.EnableEvents = False 

勾住按鈕拖到宏像這樣:

Sub StartLogging() 
    Application.EnableEvents = True 
End Sub 
+0

'End End Sub'前的'Application.EnableEvents = True' :) –

+2

@DavidZemens:如果出現錯誤,這將無濟於事。在使用'Worksheet_Change'或處理事件時,應始終使用錯誤處理。 [看到此](http://stackoverflow.com/questions/13860894/ms-excel-crashes-when-vba-code-runs/13861640#13861640) –

+0

@SiddharthRout +1你的建議*做*重新啓用事件,它也只是增加了錯誤處理。這是一件好事,但基本上他需要重新啓用事件,否則他必須在每次更改事件後運行'StartLogging'宏。 –

0

你的代碼對我來說工作正常。至於啓用/禁用宏,您只需在每個IF(在兩個宏中)之前(/之上)插入此行。

If Sheets("corrections").Range("X1") <> "Yes" Then Exit Sub 
' where you can change X1 for a more appropriate cell 

要創建按鈕,只需添加形狀/對象,並指定以下宏:

Sub Enable_Logs() 
Sheets("corrections").Range("X1").Value = "Yes" 
End Sub 
Sub Disable_Logs() 
Sheets("corrections").Range("X1").Value = "No" 
End Sub 
更適合自己的細胞來存儲是/否選項(而不是「X1」)可選檢查

注意!要添加分配給它們的宏的按鈕:按Alt + N,+ SH並選擇一個形狀。然後,右鍵單擊形狀>分配宏(並選擇相應的宏)。 注意!第一次運行宏時,應該在單元格X1中手動設置「是」值。

+0

感謝這兩個工作像一個魅力。對此,我真的非常感激。 – imageicb

相關問題