エクセルでデータを変更・入力した時だけ日付が更新される方法

このQ&Aのポイント
  • エクセルでデータを変更・入力した時だけ日付が更新される方法について教えてください
  • QNO.2915892を参考にしてマクロを設定しましたが、ロックがかかっている状態だと日付が更新されないようです。ロックのかかっていないセルのデータを更新した時だけ、任意のセルに今日の日付(更新日)が自動で入るようにする方法を教えてください。
  • エクセルでデータを修正しなかった場合には日付が変わらないようにしたいです。現在使用しているコードはPrivate Sub Worksheet_Change(ByVal Target As Range)で、Range("B1")に今日の日付を代入しています。このコードに何か追加や変更をするか、全く別の方法があるのか教えていただけますか?
回答を見る
  • ベストアンサー

エクセルでデータを変更・入力した時だけ日付が更新される方法

QNO.2915892を参考にさせていただき、マクロを設定しました。 正常に作動したのですが、その後シートの一部が変更できないように、ロックをかけることになりました。 するとロックのかかっている状態だと、このコードでは日付が更新されませんでした。 そこで、ロックのかかっていないセルのデータを更新した時だけ、 任意のセルに今日の日付(更新日)が自動で入るようにしたいです。 つまりエクセルを開いただけで、データを修正しなかったら日付は変わらないようにしたいです。 この場合はこのコードに何を足したり、どこを変更したらよいのでしょうか? もしくは全く別のものになるのでしょうか? 別のものであれば、それを教えていただけると助かります。 コードの意味はほとんどわかっていません。。。 *****以下今使っているコードです******** Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Range("B1") = Format(Date, "yyyy/m/d") Application.EnableEvents = True End Sub *********************以上**** どなたかよろしくお願いします。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#01です >パスワードなしで保護する方法が私にはわかりません。。。 シートの保護の際、パスワードに何も入力しなければパスワード無しになります #01で「ただしパスワードがないことが前提」と書いたのは「パスワード指定してあると動かない」という意味ではありません。Unprotectメソッドが実行されるときにパスワード要求が出てきて、ちゃんと保護が解除されるはずです。でも再度保護するときに ActiveSheet.Protect password:="a" ,DrawingObjects:=True, Contents:=True, Scenarios:=True のようにマクロ中にパスワードを書いてしまうと、パスワードの意味がなくなるので、そのように書いただけです。 従ってパスワードのあるなしは動作に関係しません。 >シートの保護を一旦解除し、いくつかのセルを修正しましたが、日付が更新されませんでした。 とのことですが、マクロは動いていますか? 別のマクロでEnableEventが発生しないようにされているようなことはないでしょうか。 VBE画面でCtrl+Gでイミディエイトペインを開いて、以下のコマンドを入力しEnterしてみてください。もしEnableEventが原因ならこれで直るかもしれません。 Application.EnableEvents=True

nknnnk
質問者

お礼

お礼が遅くなり、申し訳ありません。 教えていただいた通り入力しても、できるシートとできないシートがあり、 ややこしくなってしまってそれぞれどの条件の時にどうなったかというのが把握できませんでした。 そこでもう一度元のエクセルファイルをコピーし直し、最初に教えていただいたコードを1シートずつ入力し、 パスワードなしでシートを保護しました。 そして、以下二つのパターンで試してみました。 (1)全てのセルにロックをかけて、修正する度に保護を解除する (2)一部のセルのみにロックをかけて、ロックされていないセルを修正する おかげさまで、どちらもうまくいきました。 ありがとうございました!

その他の回答 (1)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

日付をセルに書き込む前にシートの保護を解除し、書き込み後に保護をかける方法で良ければ以下になります(ただしパスワードがないことが前提) Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = False  ActiveSheet.Unprotect  Range("B1") = Format(Date, "yyyy/m/d")  ActiveSheet.Protect DrawingObjects:=True, _    Contents:=True, Scenarios:=True  Application.EnableEvents = True End Sub

nknnnk
質問者

お礼

ありがとうございます。 現在、シートの保護のためにパスワードを設定しています。 他人が間違って書き換えてしまうと困る部分もあるからです。 知識が足りなくて申し訳ありませんが、むしろパスワードなしで保護する方法が私にはわかりません。。。 シートの保護を一旦解除し、いくつかのセルを修正しましたが、日付が更新されませんでした。 一度でもパスワードを設定してしまうとダメなんでしょうか? もう少し回答を待ちたいと思います。

関連するQ&A

  • エクセルでデータ入力された日付と時間を自動入力する

    前回ご質問にて 1行目に何か入力したら2行目に日付と時間を自動入力する というVBAを教えて頂きました。 ------------------------ Private Sub Worksheet_Change(ByVal Target As Excel.Range) Application.EnableEvents = False If Target.Row = 1 Then Target.Offset(1, 0).Value = Format(Now, "yyyy/mm/dd"" ""hh:mm:ss") End If Application.EnableEvents = True End Sub ------------------------ これを1行目に何か入力したら2行目に日付と時間ではなく セル指定を行いたいのです。 例)F13~P13に何か入力したら、その下のセルの F14~P14に日付と時間が自動入力される という作りです。 よろしくお願いします。

  • VBA/エクセルの日付入力でYYYYMMDD

    エクセル2013です。 特定のセルに日付を入力してもらうのですが、人によりさまざまな入力をされてしまいます。 どんな入力でも日付であれば、シリアル値なのであとからなんとかなるのですが、困るのはYYYYMMDDの連続数字、例えば今日なら20140712と入力されてしまうことです。 入力規則で排除したいのですが、それは許されず、20140712も日付として扱わなければならなくなりそうです。 そこでマクロで対処しようと以下のコードを書きました。 Private Sub Worksheet_Change(ByVal Target As Range)   Select Case Target.Address(0, 0)     Case "D2", "F2", "C4"       If Target.Value = "" Then Exit Sub       If IsDate(Target.Value) Then         Target.NumberFormatLocal = "yyyy/m/d"       Else         Application.EnableEvents = False         Target.Value = CDate(Format(Target.Value, "@@@@/@@/@@"))         Application.EnableEvents = True       End If     Case Else       Exit Sub   End Select End Sub これで最初はうまくいき、20140712と入力されても、ちゃんと2014/7/12になります。 ところが、同じセルに再度YYYYMMDD数字形式で入力すると、実行時エラー「オーバーフローしました」になってしまいます。多分セルが、YYYYMMDDの数字をシリアル値として見てありえない日付と判断したのだと思います。 どのようにコードを修正したらよろしいでしょうか? もう1点、日付をYYYYMMDDの連続数字で入力することは普通、エクセルではあまり見たことないですが、これって一般的な方法なのでしょうか?

  • Excel で日付入力したらマクロが動く方法

    Excel 2003 です。(OSはXP) データ用のエクセルファイルからマクロでコピー貼り付けをする日報ファイルを作っています。構成シートが7枚、マクロは12モジュール、ファイルサイズが140MBという巨大なものです。 セルB2に日付を入力したとき、Macro1が動くようにしたいのですが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$B$2" Then Exit Sub Else... 以外に何かうまい方法はないでしょうか? セルに値を入力、じゃなくて、何かのコントロールでもかまいません。 マクロで日付を読み込めることが必須条件です。 上述のマクロの活用方法はいろいろ読みましたが、処理に時間がかかって困っております。「全てのセルに変更が加えられたのを検知」するしか方法はありませんか? 一応、この Macro1 を呼び出す部分以外には Application.EnableEvents = False を入れて、Worksheet_Changeが反応しないように止めていますが、遅いような気がします。(計ったわけではないのですが。) この日報ファイル自体が、計算の塊で、1つのセルに数値を入力しただけで、再計算に1秒前後かかることがあります。 そこで、貼り付けのマクロ(Macro2)を動かすときには Application.Calculation = xlManual を入れたりもしているのですが(それでも貼り付けに1分30秒)、常に再計算をOFFにするわけにもいかず・・・。 だから「全てのセルに変更が加えられたのを検知」という命令は、時間短縮のため避けたいのです。 また、マクロの全てにEnableEventsを入れておくのも、見苦しくて。(新たにマクロを追加したらまた忘れずにEnableEventsを書かないといけない構造にしたくありません。) 「全てのセルに変更が加えられたのを検知」ではなく、特定のオブジェクトに日付が入力された・選択されたのをマクロの開始合図とすることはできませんでしょうか? 質問がわかりにくかったらすみません。よろしくお願いします。

  • エクセルで日付と時間を自動入力する

    エクセルでF13~P13に何か入力したら、その下のセルの F14~P14に日付と時間が自動入力される という質問、回答を見つけました。 これで日付を削除するかどうかのメッセージボックスを出さずに 入力するセルのデータを削除した時に日付も削除するには どの部分を削除すれば良いですか? Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim mRng As Range Application.EnableEvents = False For Each mRng In Target If Not Intersect(mRng, Range("F13:P13")) Is Nothing Then If mRng.Value = "" Then If MsgBox("日付も削除しますか?", vbYesNo + vbDefaultButton2) = vbYes Then mRng.Offset(1, 0).Value = "" End If Else mRng.Offset(1, 0).Value = Format(Now, "yyyy/mm/dd"" ""hh:mm:ss") End If End If Next mRng Application.EnableEvents = True End Sub

  • エクセルでデータ入力された日付と時間を自動入力する

    A1をA2に、B1をB2に、C1をC2に・・・ A1に入力したらA2に更新日付が入るという様に行いたいのですが、 ---------------- Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim r As Range For Each r In Target If r.Column = 1 Then r.Offset(0, 1).Value = Format(Now, “yyyy/mm/dd”“ ”“hh:mm:ss”) End If Next r End Sub ---------------- これをどのように改編したらいいのでしょうか?

  • 指定範囲のセルが変更されたら

     下記のコードで1つのセル(A1)が変更されたら入力前の元データを別シート(A1)に保存できるようにしたのですが、指定範囲(I10:CW42,2行3列を一升)のセルが変更されたら別シートの指定範囲(I10:CW42)に保存できるようにしたいのですが方法がありましたらお教え下さい。お願いします。 Windows7・SP1 Office2010 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Application.EnableEvents = False Application.Undo Sheets("Sheet2").Range("A1").Value = Range("A1").Value Application.Undo Application.EnableEvents = True End Sub

  • データ更新時の処理について(エクセルVBA)

    セルA2に数字の66が入っているとして、セルA2を67に更新した瞬間に67-66という処理をさせたいのですが、下記の???の部分が分かりません。どなたか、教えてください。お願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$2" Then  ??? End If End Sub

  • マクロに詳しい方!エクセルの日付入力について

    エクセルの日付入力について、例えばB列に何か入力したら自動的にA列に入力した日がB列に表示されるようにする方法(TODAY関数のように常に現在の日付ではなく、入力した日のまま固定にする方法)について検索したところ、下記の通り、マクロをつかった回答がありました。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1413916824 B列に入力し、A列に日付を書き込む場合 B1→A1 B2→A2 B3→A3 … -------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 2 Then Exit Sub Application.EnableEvents = False Target.Offset(, -1).Value = Now Application.EnableEvents = True End Sub -------------------- 小生はマクロが分かりませんが、上記のコードをコピペ入力すると、その通りになりました。 そこで、みなさんにご相談ですが、これをA列に入力→B列に日付、C列に入力→D列に日付、E列に入力→F列に日付・・・・・というようにしたいのですが、そのコードを教えて頂けないでしょうか。 何卒お知恵をお借りしたくお願い致します。

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • 再度入力値に戻したい

     特定のセル(A1)の入力操作を取り消しA1の元データを別セル(B1)にコピペした後、再度セル(A1)の値を入力値に戻すにはどうしたら良いでしょうか?お教え下さい。 Windows7・SP1 Office2010 Private Sub Worksheet_Change(ByVal Target As Range) If Target.address <> "$A$1" Then Exit Sub Application.EnableEvents = False Application.Undo Range("A1").Select Selection.Copy Range("B1").Select ActiveSheet.Paste Range("A1").Select Application.CutCopyMode = False Application.EnableEvents = True End Sub

専門家に質問してみよう