Excel VBAでの作業日時の残し方について

このQ&Aのポイント
  • Excel VBAを使って、特定のセルに数値を入力するとそのセルの右側に作業日時を残す方法について教えてください。
  • 現在、毎日入力している数値に対して作業日付(更新日時)を残したいです。入力したセルの右側に日付と時間を表示させたいのですが、どのように記述すれば良いのでしょうか?
  • 初心者ですが、Excel VBAを使って特定のセルに数値を入力した際に、そのセルの右側に作業日時を自動的に残す方法についてご教示いただけますか?
回答を見る
  • ベストアンサー

エクセルVBA記述方法についての質問です。

初心者です。色々調べるとVBAを使わないと下記の処理はできないみたいで・・・ わかる方がいれば是非教えて頂きたいです。 今回、毎日入力している数値に対して作業日付(更新日時)を残したいのですが、 例えば、A列のセルに数値を入力すると、入力したセルの右側のセル(この場合B列)に 日付と時間が残るようにしたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("a1") Then Target.Cells(1, 2).Value = Now() End If End Sub 自分でも色々調べてやってみましたが、上記の記述だと、A1に入力すればB1に作業日時が残ります。 やりたいことはこれに限りなく近いのですが、対象入力範囲をA列にしたいです。 A列のどのセルに数値を入力しても、入力したセルの右側(B列)に作業日時を残していきたいです。 どのように記述すれば良いのかわからないので是非アドバイスを下さい。 よろしくお願い致します。

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 もしかしますと、コピー&ペースト等の方法によって複数のセルに対して同時に入力が行われる事もあるかも知れませんし、A列のセルに入力済みであった値を消去した場合には、その右隣に入力されている日時も消える様にした方が良いのではないでしょうか?  その事を考えますと、A列のセルの値が変更された際に、変更後の値が空欄の場合と、空欄ではない場合に分けて、それぞれ異なる処理をVBAで行う様にするよりも、値が変更されたA列のセルの右隣のセルに対してのみ「A列が空欄の場合は何も表示せず、空欄ではない場合には現在の日時を表示する」というワークシート関数を一旦入力してから、そのワークシート関数によって得られた値を、同じセルに値のみを入力し直すというVBAとした方が簡単かも知れません。  又、例えば2行目は各列のデータの名称(項目名)を入力するために使用されていて、実際のデータは3行目以下に入力される様になっている場合において、A2セルの項目名を変更した際にB2セルに入力されていた項目名が、日時のデータに上書きされて消えてしまう様な事があれば不味いのではないかと思いますので、A列の値が変更された際に、その右隣のセルに日時が入力される様になるのは、何行目以下の行からにするのかという制限を設けておいた方が良いと思います。  そういった事を考えますと、次の様なVBAは如何でしょうか?  尚、下記のVBAは、A3以下のセルの値が変更(入力されていた値の消去も含む)された場合にのみ、その右隣のセルにその時の日時を入力する様になっております。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myChange As Range, myColumn As String, _ FirstRow As Long, LastRow As Long, myNow As Date myColumn = "A" 'データが入力される列 FirstRow = 3 '実際のデータが入力されている最初の行 LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row If FirstRow > LastRow Then Exit Sub Set myChange = Application.Intersect(Target, _ Range(myColumn & FirstRow & ":" & myColumn & LastRow)) If Not myChange Is Nothing Then myNow = Now() With myChange.Offset(0, 1) .FormulaR1C1 = "=IF(RC[-1]="""","""",""" & myNow & """)" .Value = .Value End With End If End Sub

KENKEN2403
質問者

お礼

kagakusukiさん、ありがとうございます。 ご丁寧に使用する時のことまでも考えてくださり、 説明文もとてもわかりやすいです。 kagakusukiさんのおっしゃるとおり、A列の数値を削除した時に B列の日時も一緒に削除できると助かりますね。 それに1行目と2行目には項目名等をいれる予定なのでkagakusukiさんの お心遣いに感謝します。 ベストアンサーとさせて下さい! またご迷惑でなければ困った時にご相談させて下さい。 本当にありがとうございました。

その他の回答 (1)

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.2

列番号が1以外はsubを抜け、A列のセルが変化した場合は、同じ行のB列にNOW関数で日時を入力します。 但し、セルの状態変化なので値をA列の値を削除した場合でもB列の時刻入力されます。 Private Sub Worksheet_Change(ByVal Target As Range) If Not Target.Column = 1 Then Exit Sub Target.Offset(0, 1).Value = Now() End Sub

KENKEN2403
質問者

お礼

dogs_catsさん、ありがとうございます。 助かりました!まだまだ初心者なので、これからもっと勉強して いきたいと思います。 また、悩んだらご相談させて下さい。 本当にありがとうございました。

関連するQ&A

  • エクセル VBA の質問です。

    A2~A20までのセルに文字を入力した段階で、それぞれB2~B20に入力日時を入れるVBAを以下のように組んでいます。 しかし、同様の条件を同一シートのE2~E20・F2~F20にも入力・自動表示できるようにしなければならなくなり、困っています。 どのように記述を変えればよいのか、教えていただけたらと思います。 宜しく御願いいたします。 Sub Worksheet_change(ByVal Target As Range) Dim Rng As Range Dim c As Range Set Rng = Range("A2:A20") If Intersect(Target,Rng) Is Nothing Then Exit Sub For Each c In Intersect(Target,Rng) If Not IsEmpty(c) Then c.Offset(, 1).Value = Now Else c.Offset(, 1).ClearContents End If Next Rng.Offset(, 1).EntireColumn.AutoFit End Sub 申し訳ありませんが、何卒、宜しく御願いいたします。

  • VBA Changeの記述方法

    あるセルの計算結果次第で音を鳴らすという事をやりたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(False, False) = "B1" Then If Range("B1") > Range("A1") Then Shell "C:\Program Files\Windows Media Player\wmplayer.exe C:\音楽ファイル.wav", 0 End If End If End Sub この内容で、B1とA1に直接、数値を入れて条件を満たすと音が鳴るのですが、B1とA1がそれぞれ別のセルの値を参照している式にすると音が鳴らないのですが、そのような場合はどうすればいいでしょうか。 現在、B1セルは=B10を参照して、A1は=A10を参照する式になっています。 また、あるセルに =IF(H34<G34,"",IF(H34=G34,"同","★")) という式を入れて、このセルが★になった場合に上記と同様に音を鳴らしたいのですが、その場合はどのような記述にすればよいのでしょうか。

  • エクセルVBAの書き方で教えてください。

    エクセルで、 「A列にデータを入力した日付をB列に自動で入れる」 (A列のデータを消したときは、B列のデータも消える)ということをするのに、 他の質問を参考にして、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then   '対象の列が1列目(A列)なら If Target.Value <> "" Then   '入力された値がブランクでなければ Target.Offset(0, 1).Value = Date   '0行ずれた(同じ行)の1列右隣に日付を入れる Else       'そうでなければ(Deleteキーで消されたら) Target.Offset(0, 1).Value = ""   '同行右隣をブランクすなわち""として消す End If      '入力された値の処理終り End If      '1列目(A列)の処理終り、従ってB列以降はチェックしない End Sub と、入力して、うまく動きました。 ところが、「A列に入力」→「B列に自動で日付」だけでなく、 「D列に入力」→「E列に自動で日付」 「H列に入力」→「I列に自動で日付」と、1つのエクセルシートの中で いくつかの同じ条件のことを繰り返そうと思うとうまくいきません。 この場合、どのようにVBAを記入したら良いのか、教えてください。 よろしくお願いします。

  • エクセルVBAについて

    エクセルVBAについて 下にある、1行目に入力された数値の、選択したセルの数値を、B5セルに表示させるマクロなのですが、1行目が結合していると、うまくB5セルに表示できません。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)  If Target.Count > 1 Then Exit Sub    '●複数セル選択は無視  If Target.Row <> 1 Then Exit Sub    '●1行目以外の選択は無視  If Target.Column > 6 Then Exit Sub   '●F列目以降の選択は無視  If Target.Value = "" Then Exit Sub   '●選択セルが未入力なら無視    Range("B5").Value = Target.Value End Sub このマクロで、結合しているセルをB5に表示させることはできますでしょうか? 1行目で選択するセルは、すべて2つのセルが結合しています。 よろしくお願いいたします。

  • Excel 2000です。VBAを改造していただきたいのですが

    入荷品のチェックシートです。B列に受領数を入力するとA列に年月日が記録されるVBAを作っていただき必要なブックのシートごとにコピーして使っていました。全品入荷完了後 別のロットにシートタブの名目を書き換えて再利用します。  ('複数セルが選択された場合、動作をキャンセル  がなぜ必要かも理解できないVBAの勉強を挫折の高齢者です) B列のセル一個づつ選択削除でないとB列が空白になるだけでA列には日付が残ります。複数のセル選択で一気に日付を削除したいのです。 お助けください。 Private Sub Worksheet_Change(ByVal Target As Range) '複数セルが選択された場合、動作をキャンセル If Target.Count <> 1 Then Exit Sub If Intersect(Target, Range("B5:B1000")) Is Nothing Then Exit Sub 'B5:B1000"の範囲外は除外 Application.EnableEvents = False If Target.Value <> "" Then If IsDate(Target.Offset(, -1).Value) Then GoTo EXIT_LABEL '日付が記入済の場合は実行しない Target.Offset(, -1).Value = Format$(Now, "mm/dd hh:mm") Else 'セルを空白にした場合、日付を削除 Target.Offset(, -1).Value = "" End If EXIT_LABEL: Application.EnableEvents = True End Sub

  • エクセルVBAのChangeイベントの書き方について

    またまた質問させてもらいます。 先ほど「エクセルで作業した日の日付を残す」で質問させて 頂いた件での引き続きなのですが、 セルA1~セルL1までのそれぞれのセルに「1」を入力する 作業が有るとします。(1が入力されるか、されないかは任意で また、入力する時刻も異なる) そして、「1」が入力された、その時の時刻をセルA2~セルL2 に表示させるにはどうのようにVBAを書けばいいのでしょうか? セルA1に「1」が入力された場合はA2に表示されるという風に それぞれのセルの下に表示されるという形なのですが。 ちなみに先ほど回答いただいたVBAを少しいじってみて 以下のようなものを作ってみたのでが、これだと常にA1のセルに 「1」が入っているので、毎回時刻が更新されてしまうみたいで、、 この繰り返しを書いてもダメなのですね。 ご回答のほど宜しくおねがいしますーーーー Private Sub Worksheet_Change(ByVal Target As Range) If Range("a1") = "1" Then Range("a1").Value = Now() End If End Sub

  • Excel VBA 他のシートに演算結果を入れたい

    例えば、A~Dというシートのいずれかのo1セルに数値を入力すると、演算結果がp1に入る場合。 A~Dのどのシートでもo1に入力したら、Z!p1にp1の値を放り込みたいのです。 で、以下のようなコードを書いたのですが、上手くいきません。 因みに、セルの移動方向はオプションで「右方向」に設定してあります。 ※結果としてセルの移動を認識していないのか、まったく無反応です。 ※Range("Z!$P$1") =… の行にブレークポイントを設定しても、引っかかりません。 何が悪いのかお教え頂ければ幸甚です。 >違うシートには代入できない… ってことでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$P$1" Then Range("Z!$P$1") = Range("$P$1") End If End Sub ※なお、出典元のSubは以下の様なもので、正常に動作していました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then Range("B1") = Range("B1")+1 End If End Sub

  • Excel VBA の作り方について【初心者】

    Excel VBA の作り方について質問させてください。 A1セルに「営業部【山本】」と入力されています。 B1セルに「01:35:24」(タイム)と入力されています。 (1)D1セルに「山本」を抜き出して表示 (2)E1セルに「95」(分数)で表示 (3)A2以降で同じ作業の繰り返し(最終入力列まで) というVBAを作成しております。 Sub macro1() '行数確認 nr = Range("A1048576").End(xlUp).Row For i = 1 To nr '名前抜き出し x = Range("A1").Offset(i - 1) j1 = InStr(x, "【") j2 = InStr(x, "】") Range("D1").Offset(i - 1) = Mid(x, j1 + 1, j2 - j1 - 1) '分表示 x = Range("B1").Offset(i - 1) Range("E1").Offset(i - 1) = Int(x * 24 * 60) Next i End Sub ここまではプログラムが完成しています。 この後、 (4)C列セルに入力されている数値をF列セルにそのまま入力 したい場合には、どの部分にどのようなプログラムを追加すればよいでしょうか? よろしくお願いします。

  • エクセルVBAについて

    http://okwave.jp/qa/q7236213.html 上記質問の発展形なのですが 同様のことを E列に日付 F列に売上 G列に結果 でやりたいのですが この時A列~C列のマクロも残したままでしたいのですが 下記のように同様のプロシージャーを下段に書けばできると思ったのですが うまくいきません。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$A$1" Then Exit Sub If Target = "" Then Exit Sub Range("C10:C65536").ClearContents With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With End Sub Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$E$1" Then Exit Sub If Target = "" Then Exit Sub Range("G10:G65536").ClearContents With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G")) .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)" .Value = .Value End With End Sub どなたかお知恵を拝借できませんでしょうか?

  • VBA Intersectで範囲の記述

    エクセル2000です。 Intersectで範囲の記述で、名前が定義された範囲、myRng と その2列右どなりを指定したいのですが、 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Union(Range("myRng"), Range("myRng").Offset(, 2))) Is Nothing Then Exit Sub MsgBox Target.Address End Sub のようにUnionを使わなければできないでしょうか? myRngがA1:A10であれば、 If Intersect(Target, Range("A1:A10,C1:C10")) Is Nothing Then Exit Sub と簡単に記述できるのですが。