• ベストアンサー

エクセルで最終更新日を記録するには

教えてください。A3~K5000にデータがあります。K列は各行で更新した当日の日付が入っています。これを自動的に入力させたいと考えています。条件としてA~J列のいずれかを入力または削除したときのみに対応する列に日付を入れます。マクロなどで更新したときは日付はいれません。このようなことは可能でしょうか?

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

> どのように修正したらいいでしょうか? 行全体を削除...ということは Target の Columns.Count は現行バージョン で言えば、256 になります。これが 256 なら Exit Sub します。 次の一行を If Target.Cells.Columns.Count = Me.Columns.Count Then Exit Sub >If MacroFlag Then Exit Sub ' <-- ココで判定 の後あたりに入れて下さい。 余談ですが、Excel2007 がリリースされるにあたって、行列数が拡張され ますので、今までのように  ・If Target.Cells.Columns.Count = 256 Then Exit Sub  ・Range("A65536").End(xlup).Row のような決め打ちソースでは今後対応できなくなります。

marutin99
質問者

お礼

ありがとうございます。たすかりました。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんばんは。KenKen_SP です。 基本的には Worksheet_Change イベントでセルの値が更新されたら、日付を 書き込むようにします。ここで問題になるのは、 >マクロなどで更新したときは日付はいれません マクロによる更新なのか、人間の手入力・コピペ等の操作による更新なのか で処理を分岐させる必要があるわけですが、簡単にやるならそのマクロに   Application.EnableEvents = False を入れてイベントを発生させなければ良いだけです。しかし、EnableEvents は最後に必ず True に戻さないと、以後一切イベントが発生しなくなるため、 エラートラップをきっちりやらないと危険です。 ただ、この方法では少し乱暴ですね。ニーズとしては全てのイベントを停止 させるのではなく、特定シートの特定のイベントのみキャンセルさせたいの でしょう。 その場合、#1 ご回答のようにフラグを立ててやれば良いのですが、そのため だけに作業セルを使うのは、ユーザーがその作業セルを操作する可能性が あり、非表示にしておくなどの配慮がないと事故の元になりますね... 結論としては、シートに独自プロパティーを用意する方法を提案します。 下記サンプルのマクロ Sample を実行し、セルを更新してもイベントは キャンセルされますが、手入力の場合はイベント処理されます。 '--------------------- 標準モジュール ------------------------------- Sub Sample()   With ThisWorkbook.Worksheets("Sheet1")     ' Sheet1 に用意した独自プロパティーを True に     .MacroFlag = True     .Range("A3").Value = 1     ' 最後に False に戻す     .MacroFlag = False   End With End Sub '--------------------- シートモジュール Sheet1 ---------------------- Option Explicit ' どのセルが更新されたら日付を書き込むマクロを起動させるか? Private Const CEL_ADR = "A3:J5000" ' どの列に日付を書き込むか? Private Const COL_LOG = "K" ' イベントキャンセル判定用の独自プロパティー(ただの Public 変数だけど) Public MacroFlag As Boolean ' セルが更新されたら日付を書き込むイベント処理 Private Sub Worksheet_Change(ByVal Target As Range)      Dim rngA As Range      If MacroFlag Then Exit Sub ' <-- ココで判定   On Error GoTo ERROR_HANDLER   If Not Intersect(Target, Me.Range(CEL_ADR)) Is Nothing Then     Application.EnableEvents = False     For Each rngA In Target.Areas       With Intersect(rngA.EntireRow, Me.Columns(COL_LOG))         .NumberFormat = "yy/mm/dd hh:mm"         .Value = Now()       End With     Next     Application.EnableEvents = True   End If    TERMINATE:   Exit Sub ERROR_HANDLER:   Application.EnableEvents = True   MsgBox Err.Description, vbCritical   Resume TERMINATE End Sub

marutin99
質問者

補足

ご回答ありがとうございます。このサンプルでテストしましたところ行削除した場合変更の日付が削除した行の次に入ります。どのように修正したらいいでしょうか?

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.1

Worksheet に Change というイベントが有ります ここに、マクロ(VBA)を記述してはどうでしょうか >マクロなどで更新したときは日付はいれません どこかにフラグを立てます このマクロの書き込み直前に、空いているセルにでも、適当な文字を入れておき、Change 側のマクロ(VBA)でそのセルをチェックして、判断します フラグは、Change 側のマクロ(VBA)でクリアしておきます

marutin99
質問者

お礼

そういう手がありますね。ありがとうございます。