2017-05-09 8 views
0

列C-Kが更新された日時を自動的に入力するために、列Bが必要なスプレッドシートがあります。 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.EnableEventsFalseにする必要があります。現在の時刻を列 "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

関連する問題