プロが教える店舗&オフィスのセキュリティ対策術

D列に"完了"と入力されたらその日付をE列に自動で入力されるようにしたいと考えています。
現在、E2列に
=IF(D2="完了",TODAY(),"")
を入力して出来ると考えていたのですが、
そうすると日付が毎回変わってしまいます。
どのようにすれば可能でしょうか?
よろしくお願いいたします。

A 回答 (5件)

こんばんわ a04sa026 さん


締め切っていないということはまだ何か解決していないのでしょうか?
解決したなら閉めておいてくださいね。
hallo-2007さんが20分も後に全く同じ回答とするとは思いませんでしたがまぁそれはおいて置いて。

実は前回の処理には致命的バグがあります。きっともう少し使えば分かることですが、複数行の処理に対応していません。二行以上のドラッグ(オートフィル)や二行以上選択した状態での"完了"などのペーストもしくは削除のたびにエラーします(使い物になりません)。
暇だったので対応版を作っておきました。どうぞお使いください。



Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
If Cells(Target.Row, 4).Value = "完了" Then Status = Date Else Status = ""
If TypeName(Target.Value) <> "Variant()" Then Cells(Target.Row, 5).Value = Status Else _
For i = 0 To UBound(Target.Value) - 1: Cells(Target.Row + i, 5).Value = Status: Next
End If
End Sub



最初の記述とはもう別物に成ってしまいましたがよりベストな処理になっています。
追加処理・処理違い・補足等あればいってください。
    • good
    • 1
この回答へのお礼

お礼が遅くなってしまい申し訳ありません。

改良版まで教えていただいてありがとうございます。
まだまだ初心者で、argumentさんのソースを読むことが難しいですが、一歩ずつ勉強していきたいと思っておりますので今後ともよろしくお願いいたします。

本当にありがとうございました。

お礼日時:2008/10/02 01:50

完了から・・・ではありませんが


完了なら日付、以外の場合は空白 です
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
If Target.Value = "完了" Then
Cells(Target.Row, 5).Value = Date
Else
Cells(Target.Row, 5).Value = ""
End If
End If
End Sub
    • good
    • 1
この回答へのお礼

お礼が遅くなってしまい申し訳ありません。

hallo-2007のおかげでタスク管理が速くなり、仕事の効率を上げることができました。

お二方ともに20ptとしたかったのですが、できないようでしたのでお許しください。
本当にありがとうございました。
今後ともよろしくお願いいたします。

お礼日時:2008/10/02 01:53

こんばんわ a04sa026 さん


補足へ回答となります。
データを以下に書き換えてください。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
If Target.Value = "完了" Then
Cells(Target.Row, 5).Value = Date
Else
Cells(Target.Row, 5).Value = ""
End If
End If
End Sub


どうでしょうか?貴方のお望みの結果になったはずです。
完了後日付が入り別な言葉にすれば削除されます。
今後のメンテナンスを考えるあなた自身がこの処理をもう少し理解しようとする必要があります。

この最初の宣言はワークブックの変更を監視します
Private Sub Worksheet_Change(ByVal Target As Range)

もしも変更位置(セル)がColumnが左から4(つまりD列)ならば処理する
If Target.Column = 4 Then

もしもその値が「完了」ならばColumn 5(つまりE列)
にdate(つまり今の日付)をいれる
If Target.Value = "完了" Then
Cells(Target.Row, 5).Value = Date

もしもそうでないならば現在の行のColumn 5(つまりE列)
の値を削除する。(Target.Rowには変更されたセルの行が格納されている)
Else
Cells(Target.Row, 5).Value = ""

End If

End If
End Sub

という処理です。これはかなり初歩的な構文です。
きっと検索したほうが早かったかも知れません。
    • good
    • 0

D列に 完了 と言う文字が入力されたら E列に 日付を入れる。


VBAの力を借りるしか方法はないと思います。

シートの名前のタブを右クリックして コードの表示をクリック
VBエディターが起動しますので

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
If Target.Value = "完了" Then
  Cells(Target.Row, 5).Value = Date
End If
End If
End Sub

をコピィして閉じる。試してみてください。

この回答への補足

ありがとうございます。
無事実行できました!!
VBAすごいですね。
これから、勉強していきたいと思います。

あと一点お願いがあるのですが、完了から、違う言葉に変更されると日付が消去されることは可能でしょうか?

お手数をおかけし申し訳ありませんがよろしくお願いいたします。

補足日時:2008/09/23 19:39
    • good
    • 0

関数では、常時またはいずれ再計算のようなことをするので、そのブックを開いた日がいつも出てくるという理屈で、質問者の二ーズにあわない。


もうひとつTODAY()関数が常時当日日付をシステムから採るということがある。
ーー
だから質問者にはなじみが無いかもしれないが、エクセルVBAのD2セルの変更時を捉えて、(E列のセルに日付をセットする)処理を実行する
イベントという仕組みを勉強してください。その中のイワークシートのChangeのベントです。
WEBで「Change イベント VBA」照会すれば、記事が沢山出る。
http://oshiete.nikkeibp.co.jp/qa2932094.html
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
imogasiのご指摘で勉強不足を痛感しました。
これから勉強をしていきたいと思います。

ありがとうございました。
今後ともよろしくお願いいたします。

お礼日時:2008/09/23 19:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A