- ベストアンサー
EXCEL VBA 入力した時の時間を保存する
こんにちわ。 現在 B列:日にち C列:時間 F列:結果内容 とあるとします。 F列のセルに結果内容を入力すると同じ行のBには日にち、C列には時間をいれたたいのですが、VBA初心者な為、どうやっても更新するたびに時間も更新されてしまったりしています。 この場合なんと書けばよいのかどなたかご教授願います! 過去のものをみて、内容に近いものもあるのですが、VBAのコードの意味が理解できておらず。応用してみようにも失敗ばかりで。。。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No1-2です。 > 例えばF列のどこかのセルをダブルクリックしてセルに入力できる状態にします。 あ、なるほど。 No3様のご指摘の通り、セルを一度入力モードにしてから何も入力しないで、他のセルを選択したりすると、チェンジイベントが発生してしまうんですね。失礼しました。 それに対処するにはNo3様のアドバイスどおり If Target.Value = "" Thenで空白を判定して、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 6 Then Exit Sub If Target.Value = "" Then Exit Sub Target.Offset(0, -4) = Date Target.Offset(0, -3) = Time End Sub でOKです。しかし意図的に空白にした(削除した)という記録は残らなくなります。 なお。複数セル同時対応も必要ならNo3様のコードをお使いくださいませ。
その他の回答 (3)
- KenKen_SP
- ベストアンサー率62% (785/1258)
セルを一度入力モードにしてから何も入力しないで、他のセルを選択したり すると、イベントが発生してしまうみたいですね。 If Target.Value = "" Then みたいにして、値が空かどうかの判定を含めると良いと思います。 下記のコードでは F 列の複数のセルが一度に更新、、つまりコピペなどの 場合にも対応させたものです。また、F 列が消去されると、日付等も消去 します。 なお複数のセルに対応させる場合、つまり、Target が複数の場合 If Target.Value = "" Then とはできませんので、 IF Application.CountA(Target) < 1 Then とします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim rngT As Range On Error GoTo ERROR_HANDLER ' F 列 = 6 Set rngT = Intersect(Target, Me.Columns(6)) If Not rngT Is Nothing Then With rngT Application.EnableEvents = False If Application.CountA(.Value) > 0 Then .Offset(0, -4).Value = Date .Offset(0, -3).Value = Time Else .Offset(0, -4).ClearContents .Offset(0, -3).ClearContents End If Application.EnableEvents = True End With Set rngT = Nothing End If Exit Sub ERROR_HANDLER: Application.EnableEvents = True MsgBox "Error Number:= " & CStr(Err.Number) & vbLf _ & Err.Description, vbCritical End Sub
- merlionXX
- ベストアンサー率48% (1930/4007)
そ、そんな馬鹿な・・・。( ̄□ ̄; ? ひょっとして Private Sub Worksheet_Change(ByVal Target As Range) とすべきところを Private Sub Worksheet_SelectionChange(ByVal Target As Range) としてません?
- merlionXX
- ベストアンサー率48% (1930/4007)
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 6 Then Exit Sub Target.Offset(0, -4) = Date Target.Offset(0, -3) = Time End Sub
お礼
ありがとうございます! 早速試してみて日時がでるようになったのですが、例えばF列になにもいれない場合もそのセルを選択した時点で日時がでてしまいます。これは対処できないと考えた方がよろしいのでしょうか? (例、F4を選択、何も入力せず空白のまま作業を中止→日時が書き込まれる)
補足
度々すみません Private Sub Worksheet_Change(ByVal Target As Range) のまま使用させていただいています。 例えばF列のどこかのセルをダブルクリックしてセルに入力できる状態にします。その後なにも入力せず空白のまま残した場合であっても日付がつくといった具合です。 説明下手で申し訳ございません!