• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル 数値結果の値によって日付を入れたい)

エクセルで数値結果に応じて日付を入れる方法

このQ&Aのポイント
  • エクセルで数値の結果に応じて日付を自動で入力したいです。特定の条件を満たした場合に日付が表示されるようにしたいのですが、式を使った方法ではうまく表示されません。
  • シート2の2列目に「OK」と入力すると、シート1のC列にも「OK」と表示され、その日の日付がB列に表示されるようにしたいです。しかし、VLOOK関数を使ってC列に「OK」と表示させると、日付が表示されなくなってしまいます。
  • どのように修正すれば、数値結果に応じた日付が表示されるようになるのでしょうか?エクセルのマクロやVBAに詳しい方、ご教示いただければ幸いです。

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

  • ベストアンサー
  • mt2015
  • ベストアンサー率49% (258/524)
回答No.7

ANo.1です。 手入力するのはシート2のB列なんですね? Worksheet_Change は、そのシートに何か入力された場合に発生するイベントです。演算結果が変わっただけでは動きません。シート2に手入力するなら、シート2のWorksheet_Changeにマクロを組む必要が有ります。 で、シート2のWorksheet_Changeにマクロを組む例の回答は既にたくさん出ているので、変化球を。 シートの再計算が走ると、発生するWorksheet_Calculateと言うイベントが走ります。 シート1に以下のマクロを入れてみてください。 これですと、シート2に手入力してシート1で再計算が走ると、シート1のC列の値が「OK」で、B列が空の行を見つけるとB列に日付を入れます。 Private Sub Worksheet_Calculate()   Dim Rng As Range   For Each Rng In Range("C1:C2000")     If (Rng.Value = "OK") And (Rng.Offset(, -1).Value = "") Then       Rng.Offset(, -1).Value = Date     End If   Next End Sub

ww00771155
質問者

お礼

できました!! こんなに簡単にできてしまうなんて・・・。 びっくりです。 ありがとうございました。

その他の回答 (6)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.6

こんばんは Sheet2のChangeイベントを使って Sheet2のB列にOKが書かれたらSheet1のB列に日付 C列に"OK"と書き込まれるようにしました。 以下のコードをSheet2のシートモジュールに貼り付けてください。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim Rng As Range, myR As Variant   Dim TgRng As Range   Set TgRng = Intersect(Range("B2:B2000"), Target)   If TgRng Is Nothing Then Exit Sub   With Worksheets("Sheet1")     For Each Rng In TgRng       myR = Application.Match(Cells(Rng.Row, "A"), .Columns(1), 0)       If IsError(myR) Then       ElseIf Rng.Value = "OK" Then         .Cells(myR, "B").Value = Date         .Cells(myR, "C").Value = "OK"       ElseIf Rng.Value = "NG" Then         .Cells(myR, "B").Value = ""         .Cells(myR, "C").Value = "NG"       End If     Next   End With End Sub

ww00771155
質問者

お礼

ありがとうございました!!

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.5

>C列をVLOOKで呼ぶようにしたら表示されなくなってしまいました。 Sheet1のセルを参照するSheet2の関数を入れていて、Sheet1の参照セルの値が変わり、連れて、Sheet2の関数の値が変わっても、Sheet2のChangeイベントに、引っかからないのでは? 過去の数少ない昔のrivate Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target.Value = "OK" Then MsgBox "Sheet2のB列の値がOKに変わった" Worksheets("Sheet1").Cells(Target.Row, "B") = Date End If End Sub 小生の過去の数少ないイベントのVBAの経験の記憶から言うが、間違っていたらご免。 改善法や批判を待ちます。 例 Sheet1のC2はVLOOKUP関数で値を出す。 Sheet2のB2に、=Sheet1!C2 Changeイベントの解説は >セルが変更された時に発生します。 ですが、手入力をしないとだめなのでは。 そのほかに、 Sub test21() Worksheets("Sheet2").Cells(3, "B").Value = "OK" End Sub の実行でSheet2のB3の値を代入した場合も、Changeイベントは起こった。 参考 手入力でSheet2のB列の値が変わったことをとらえるなら、下記コードで簡単かと。 Sheet2のイベント・プロシを書く画面に Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target.Value = "OK" Then MsgBox "Sheet2のB列の値がOKに変わった" Worksheets("Sheet1").Cells(Target.Row, "B") = Date End If End Sub

ww00771155
質問者

お礼

おっしゃる通りです・・。 シート2の数値が変わっているんですもんね! お恥ずかしい・・・。 ありがとうございました!!

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.4

こんばんは セルC2の式は=VLOOKUP(A2,$E$2:$F$7,2,FALSE)です。 1.第2パラメータは絶対アドレスで定義して、セルC7までコピペ。  範囲で設定直後でF4キーを押下 2.第3パラメータはFalse 3.VLOOKUPの結果が0の処理を加えて =if(VLOOKUP(A2,$E$2:$F$7,2,FALSE)=0,"",VLOOKUP(A2,$E$2:$F$7,2,FALSE))

ww00771155
質問者

お礼

ありがとうございました。 マクロを修正し、解決いたしました!

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.3

画像をポストし損ねたようなので再度。 ちょっと泥臭い(力技的な)コードですがいかがでしょうか? なお、Sheet2のシートモジュールに配置することを想定しています。 また、OKと埋まっているセルをOKに置き換えても 日付の書き換えが起きます。 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range)  Dim RowCounter As Long  Dim ChgNum As Long    With ThisWorkbook.Sheets("Sheet1")      If Target.Cells.Count <> 1 Then Exit Sub   If Target.Column <> 2 Then Exit Sub   If Target.Value <> "OK" Then Exit Sub   If Me.Cells(Target.Row, 1).Value = "" Then Exit Sub      ChgNum = Me.Cells(Target.Row, 1).Value   RowCounter = 1   Do    If .Cells(RowCounter, 1).Value = "" Then Exit Do    If .Cells(RowCounter, 1).Value = ChgNum Then     .Cells(RowCounter, 2).Value = Date    End If    RowCounter = RowCounter + 1   Loop    End With End Sub

ww00771155
質問者

お礼

私にとっては、力技でもできることがすごいです・・・。 ありがとうございました!!

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.2

ちょっと泥臭い(力技的な)コードですがいかがでしょうか? なお、Sheet2のシートモジュールに配置することを想定しています。 また、OKと埋まっているセルをOKに置き換えても 日付の書き換えが起きます。 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range)  Dim RowCounter As Long  Dim ChgNum As Long    With ThisWorkbook.Sheets("Sheet1")      If Target.Cells.Count <> 1 Then Exit Sub   If Target.Column <> 2 Then Exit Sub   If Target.Value <> "OK" Then Exit Sub   If Me.Cells(Target.Row, 1).Value = "" Then Exit Sub      ChgNum = Me.Cells(Target.Row, 1).Value   RowCounter = 1   Do    If .Cells(RowCounter, 1).Value = "" Then Exit Do    If .Cells(RowCounter, 1).Value = ChgNum Then     .Cells(RowCounter, 2).Value = Date    End If    RowCounter = RowCounter + 1   Loop    End With End Sub

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.1

そりゃあ、C列に入っているのはセル式のままで変更されていませんから。 手入力で変更するのはシート1のA列で良いのでしょうか? で、あれば取りあえずこんな感じに変更しては。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim Rng As Range   Dim TgRng As Range   Set TgRng = Intersect(Range("A1:A2000"), Target)   If Not TgRng Is Nothing Then     Application.EnableEvents = False     For Each Rng In TgRng       If Rng.Offset(, 2).Value = "OK" Then         Rng.Offset(, 1).Value = Date       End If     Next     Application.EnableEvents = True   End If   Set TgRng = Nothing End Sub

ww00771155
質問者

補足

申し訳ありません。 説明がうまくできていなかったようです。 シート1のC列が変更されたらB列に変更日を入力させたいです。 C列はVLOOKの式を使いたいです。 つまりシート2の2列目にOKが入れば自動的にシート1のC列にOKが入って、B列に日付が入るようにしたいのです。 説明が下手で申し訳ありません。