2017-05-09 57 views
0

我有一個電子表格,我需要列B自動填充日期和時間列C-K更新。有比K更遠的列,我不想觸發更新代碼。VBA代碼日期條目列更新範圍

首先,我用下面的代碼:

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim i As Integer 
i = Target.Row 
Dim t As String 
t = VBA.Now 
Cells(i, 2) = t 
End Sub 

這並沒有對我的情況下工作,因爲這會更新該行中的任何改變。這樣做的好處是用戶不能輸入這些單元格,以防止VBA輸入更新的日期。

能觸發只是所選行,我去下面的代碼:

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim KeyCells As Range 
Set KeyCells = Range("C6:K43")  
If Not Application.Intersect(KeyCells, Range(Target.Address)) _ 
    Is Nothing Then 
Dim i As Integer 
    i = Target.Row 

    Dim t As String 
    t = VBA.Now 

    Cells(i, 2) = t 
End If 
End Sub 

這一點,但是,現在能夠通過用戶鍵入結束,不再工作。

我試過鎖定單元格,但然後VBA無法工作。我也嘗試使用偏移公式,但由於單元格的範圍超過1列,所以這不起作用。

任何建議之前,我把我的頭髮掉?

+0

當從更改事件處理程序中更新工作,你應該在執行更新禁用的事件,或將重新觸發你的代碼。 –

+0

http://stackoverflow.com/questions/3037400/how-to-lock-the-data-in-a-cell-in-excel-using-vba我認爲這可能會幫助你。 –

回答

0

由於Target已經是Range,所以沒有必要使用Range(Target.Address),只需Target即可。

此外,在@Tim Williams反饋之後,您需要將Application.EnableEvents轉換爲False,而不是在將當前時間添加到列「B」中的單元格後重新輸入代碼。

嘗試下面的代碼:

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim KeyCells As Range 
Set KeyCells = Range("C6:K43") 

Application.EnableEvents = False 
If Not Application.Intersect(KeyCells, Target) Is Nothing Then 
    Range("B" & Target.Row) = Now 
End If 
Application.EnableEvents = True 

End Sub 
+1

好的答案 - 只是檢查你是否真的指'DisplayAlerts'?不應該是'EnableEvents'? – Ambie

+0

@Ambie很好,謝謝:) –

+0

感謝上面的代碼。這對我所需的公式有效,但是,通過此代碼,我仍然可以鍵入B列,並刪除此列中的VBA日期條目。有沒有辦法解決? – Choppet