エクセルの該当の行の中でどこかに更新(変更)があればその行の〇〇列にその操作がされた更新日時を残したい。

という内容の質問を先日させていただきました。
http://q.hatena.ne.jp/1541915567
(文中に行100うんぬんのくだりがありますがそれは記載ミスです。)

以下コメントに続きます。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2018/12/04 19:48:41
  • 終了:2018/12/07 20:33:48
id:orekojinn

そしていただいた回答を元に以下のコードをワークシートのコードの所に書きました。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 54 Then
Cells(Target.Row, "BB") = Now
End If
End Sub


1点、理想と違う動きがあるのでそれを何とかしたいと思っています。
入力の終わった行の中の、あるセルの内容を、新しい行に入力する文字列のベースとするためにコピーをする際に、更新日時が更新されないようにしたいです。
例えば目的のセルを選択しコピーするだけだと更新日時は更新されないのですが、コピーしてメモ帳に張り付けると
改行を無視した、そして文頭、文末に"が入った形式になってしまい使いにくいです。
なのでセルをダブルクリックし数式バーに表示された内容をコピーしメモ帳に張り付けると上記問題はないのですが、
今度は更新日時が更新されてしまうという問題が起こってしまいます。
(その際はダブルクリックをしただけでありセル内の文字は一切変更ありません。)

エクセルバージョンは2016です。
良い方法をご存知の方いらっしゃいましたらどうぞよろしくお願いいたします。

ベストアンサー

id:pyopyopyo No.2

pyopyopyo回答回数372ベストアンサー獲得回数972018/12/05 18:56:46

ポイント500pt

マクロを少し変更すれば実現できますよ

1) 値を保存する変数として prev を新たに用意.
2) Worksheet_SelectionChange を使って,セルを選んだ瞬間に,セルの値を prev に保存
3) Worksheet_Change では値が prev と異なっていた場合だけ,時刻を更新

という感じです.

実際のマクロはこうなります

Dim prev

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  prev = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column <> 54 Then
    If prev <> Target.Value Then
     Cells(Target.Row, "BB") = Now
    End If
  End If
End Sub
他3件のコメントを見る
id:orekojinn

再度回答ありがとうございます。
また返答が遅れ申し訳ありませんでした。
ただいま帰宅しました、早速テストをしてみましたところ
かなり重いです。。
PCは先日ツクモで組んでもらった13万ほどのPCを使用しています。
win10 pro 64bit バージョン 1703
cpu Intel Core i5-7400@3.00GHz
実装RAM 16GB
グラボ GeForce GTX 1060 3GB

Cドライブ SSD 120GB中71GB空き
Dドライブ HDD 1TB中899GB空き

スペック的には十分だと思っています。

もしお願いできればありがたいのですが
複数のセルを同時に編集しても更新日時が正しく処理されるマクロを作っていただくことはできませんでしょうか。
"コピペ対象のセル"とありますが、
5行まとめてデリートをする場合もありますが、その場合でも正しく動くようにしたいです。

お礼としましてトータルで1000ptお送りしたいと思います。
ご検討いただければ幸いです。

2018/12/07 20:19:37
id:orekojinn

申し訳ありません。

基本的なことだと思うのですが
シートにコードを書いた場合"元に戻す"の機能が使えなくなるのですね。
知りませんでした。
これは仕事上困るので
そもそもの考え方を見直す必要が出てきました。

単一あるいは複数のセルを同時に編集し、それが編集(変更)された場合にBB列にタイムスタンプを押す。
且つ、"元に戻す"の機能が使える。
且つ、作業中に落ちたり、速度が大幅に低下することがない。
ということを実現したいです。

一旦質問を閉め切らせていただきます。
お付き合いいただきありがとうございました。

2018/12/07 20:33:23

その他の回答(1件)

id:kimuram No.1

きむむ回答回数27ベストアンサー獲得回数112018/12/04 22:44:42

ポイント100pt

何か対処法と言うのとは方向性が異なるかと思いますが、考え方を述べます。
内容を変更しないなら、『編集モード』はESCキーで解除することです。

編集モードにした後の操作なのですが、
基本的に、
エンターキーを押してしまうと、エクセルは、
 "セル内容を更新した"
と認識します。
⇒それで「Worksheet_Change」のイベントが発生します。
 そして更新日時が更新されることになります。

それで、編集モードにしても参照のためだけなら、編集モードをキャンセルすれば良いです。
 エンターキーは押すことはせず、ESCキーを押して編集モードを解除するのです。
⇒すると、更新モードはキャンセルすることで、「Worksheet_Change」のイベントは発生しません。
 そして更新日時が更新されることにはなりません。

(以下はその他考察です)
何でもないときに、例えば誤ってキー入力してしまうと、その時に選択されていたセルに文字が入ったりしますね。
自動的に更新モードに入って、入力された文字を受け付け始める訳ですね。
それをエンターキーを押してしまうとそのまま確定してしまうけど、これでは困る訳で、
そんなときは、ESCキーでキャンセルしますね。
それと同じことを言っています。

またよく見ていてハラハラすることの一例ですが、
エクスプローラでフォルダやファイルを選択するのに名前の上でクリックし、さらにクリックしてしまうと、
あるいはダブルクリックで実行する、なんて時に、ゆっくりクリックのためシングルクリック2回と認識されて、
名称を変更するモードになってしまうことがありますね。
そこで何か文字を入力したりすると名称が変わってしまうのです。
このようなときに過ちを避けるためには、確定のためのエンターキーは押さないこと、
ESCキーで編集モードを解除することです。
セルの更新もまさにそれと同じです。

VBAの中で実際の内容変更があったのかを判定して処理する方法も無いではないですが、完全には難しいと思います。
シート全体の更新前内容をミラーで維持するようなことになるのかなと・・・

そんなことよりは、基本的な操作として、無用な更新をしない、更新したと認識されないためには、
『キッチリとESCキーで解除すること』です。
これが同じような局面での変な更新を避ける安全面からも、基本的な操作と認識しております。
どうぞご確認をお願いいたします。

数式バーの上をクリックしただけでもそのときのセルに対して更新モードになってしまいます。
こときにもESCキーで解除せずにエンターキーを押すとそのときのセルを更新したとして扱われてしまいます。
さらにこのときにエンターキーを押すのではないとしても、例えば他のセルを選択クリックすること等によってもESCキーで解除しない限り、
更新したとして扱われてしまいます。
ですから、それを避けるためと無用な変更を避けるために、必ずESCキーで解除する習慣にすることです。

DELキーを押すことでも更新されたとして扱われますので、通常は影響ないですが、今回のような場合は要注意です。
ヌルのセルを選択中にDELキーを押した場合も同様ですから。

このように、内容を変更するモードになった場合、変更しないならESCキーで抜けることです。
(しつこかったですが、ごめんなさい)

id:orekojinn

ご回答ありがとうございます。すぐ活かせる方法で且つ、エクセルを含む基本的なパソコンの操作方法を終えしていただき感謝します。仕事で20年以上パソコンを使っていますが知りませんでした。
ありがとうございました。

2018/12/05 22:01:52
id:pyopyopyo No.2

pyopyopyo回答回数372ベストアンサー獲得回数972018/12/05 18:56:46ここでベストアンサー

ポイント500pt

マクロを少し変更すれば実現できますよ

1) 値を保存する変数として prev を新たに用意.
2) Worksheet_SelectionChange を使って,セルを選んだ瞬間に,セルの値を prev に保存
3) Worksheet_Change では値が prev と異なっていた場合だけ,時刻を更新

という感じです.

実際のマクロはこうなります

Dim prev

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  prev = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column <> 54 Then
    If prev <> Target.Value Then
     Cells(Target.Row, "BB") = Now
    End If
  End If
End Sub
他3件のコメントを見る
id:orekojinn

再度回答ありがとうございます。
また返答が遅れ申し訳ありませんでした。
ただいま帰宅しました、早速テストをしてみましたところ
かなり重いです。。
PCは先日ツクモで組んでもらった13万ほどのPCを使用しています。
win10 pro 64bit バージョン 1703
cpu Intel Core i5-7400@3.00GHz
実装RAM 16GB
グラボ GeForce GTX 1060 3GB

Cドライブ SSD 120GB中71GB空き
Dドライブ HDD 1TB中899GB空き

スペック的には十分だと思っています。

もしお願いできればありがたいのですが
複数のセルを同時に編集しても更新日時が正しく処理されるマクロを作っていただくことはできませんでしょうか。
"コピペ対象のセル"とありますが、
5行まとめてデリートをする場合もありますが、その場合でも正しく動くようにしたいです。

お礼としましてトータルで1000ptお送りしたいと思います。
ご検討いただければ幸いです。

2018/12/07 20:19:37
id:orekojinn

申し訳ありません。

基本的なことだと思うのですが
シートにコードを書いた場合"元に戻す"の機能が使えなくなるのですね。
知りませんでした。
これは仕事上困るので
そもそもの考え方を見直す必要が出てきました。

単一あるいは複数のセルを同時に編集し、それが編集(変更)された場合にBB列にタイムスタンプを押す。
且つ、"元に戻す"の機能が使える。
且つ、作業中に落ちたり、速度が大幅に低下することがない。
ということを実現したいです。

一旦質問を閉め切らせていただきます。
お付き合いいただきありがとうございました。

2018/12/07 20:33:23
  • id:orekojinn
    追記です。
    セルをダブルクリックすると更新日時が更新されると書きましたが、
    ダブルクリックをしなくとも、シングルクリックでセルを選択し、数式バー内をクリックした場合も更新日時が更新されます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません