• ベストアンサー

EXCEL:特定の文字が入力された日付を表示する方法

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

質問者が選んだベストアンサー

  • ベストアンサー
  • argument
  • ベストアンサー率63% (21/33)
回答No.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 最初の記述とはもう別物に成ってしまいましたがよりベストな処理になっています。 追加処理・処理違い・補足等あればいってください。

a04sa026
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

完了から・・・ではありませんが 完了なら日付、以外の場合は空白 です 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

a04sa026
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 hallo-2007のおかげでタスク管理が速くなり、仕事の効率を上げることができました。 お二方ともに20ptとしたかったのですが、できないようでしたのでお許しください。 本当にありがとうございました。 今後ともよろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • argument
  • ベストアンサー率63% (21/33)
回答No.3

こんばんわ 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 という処理です。これはかなり初歩的な構文です。 きっと検索したほうが早かったかも知れません。

すると、全ての回答が全文表示されます。
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.2

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 をコピィして閉じる。試してみてください。

a04sa026
質問者

補足

ありがとうございます。 無事実行できました!! VBAすごいですね。 これから、勉強していきたいと思います。 あと一点お願いがあるのですが、完了から、違う言葉に変更されると日付が消去されることは可能でしょうか? お手数をおかけし申し訳ありませんがよろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.1

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

a04sa026
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A