[[20200319214706]] 『セルに入力した時の履歴を残したい。』(カートン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルに入力した時の履歴を残したい。』(カートン)

複数のシートは1月〜12月まであります。各シート毎でセル内容を変更したい際に、変更履歴というシート内に履歴を残したいです。
履歴内容としては、ユーザー名と時間、変更したシートおよびセル。
これらを表示する事は、可能でしょうか?
お願い致します。

< 使用 Excel:Excel2019、使用 OS:Windows8 >


「セル 変更 履歴」で過去ログ検索したら
参考になるかも。
(OK) 2020/03/19(木) 21:58

返信ありがとうございます。ユーザー名と時間迄は見つけたんてすが、上記全てに当てはまるのが無くて、質問させていただきました。
(カートン) 2020/03/19(木) 22:38

 私が提示したキーワードで検索しましたか?
 お望みの全てを網羅する過去ログがだいぶ上位で
 ヒットしましたけど。
(OK) 2020/03/19(木) 23:53

できれば、VBAを使用した方法が知りたいのですが…
(カートン) 2020/03/20(金) 00:03

もちろんVBAでの方法が上位でヒットしていることを確認済みです。
(OK) 2020/03/20(金) 00:05

https://kantan-shikaku.com/ks/auto-log/
これのことでしょうか?
これだと、何処のセルが変更したかが情報として足りないんです。
(カートン) 2020/03/20(金) 00:19

私は「過去ログを検索」と書きました。
ネットを検索、とは書いてません。
(OK) 2020/03/20(金) 00:30

そういう事ですか。ありがとうございます。
(カートン) 2020/03/20(金) 01:09

Private Sub Workbook_Open()
flg = False
For i = 1 To ActiveWorkbook.Sheets.Count
If Sheets(i).Name = "更新履歴" Then
flg = True
Exit For
End If
Next
If flg = False Then
Sheets.Add after:=Sheets(Sheets.Count)
ActiveSheet.Name = "更新履歴"
With Sheets("更新履歴")
.Range("A1") = "シート名"
.Range("B1") = "変更セル"
.Range("C1") = "値"
.Range("D1") = "年月日 時 刻 "
.Range("E1") = "ユーザー名"
End With
End If
Sheets("更新履歴").Visible = False
Sheets(1).Select
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "更新履歴" Then Exit Sub
With Sheets("更新履歴")
.Rows(2).Insert Shift:=xlDown
.Range("A2").Value = Sh.Name
.Range("B2").Value = Target.Address
.Range("C2").Value = Target.Value
.Range("D2").Value = Now()
.Range("E2").Value = Application.UserName
.Columns("A:E").EntireColumn.AutoFit
End With
End Sub

自分の求めているものは、これなんですが。
これらをどこのモジュールい挿入そればよろしいでしょうか?

(カートン) 2020/03/20(金) 08:45


>Private Sub Workbook_Open()
 VBEのプロジェクトウィンドで「ThisWorkbook」を選択して(ダブルクリック)
 表示されるコードウィンドに入力(コピー)します。

>Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 シート名上で右クリックして「コードの表示」を選択して表示される
 コードウィンドに入力(コピー)します。

(メジロ) 2020/03/20(金) 08:55


コメントありがとうございます。
早速やってみます。ありがとうございます
(カートン) 2020/03/20(金) 09:07

何度も申し訳ありません。ThisWorkbookに >Private Sub Workbook_Open()

sheet1には Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
を入れました。

その後、Sheet1に入力等行っても 更新履歴(Sheet2)に、履歴が表示されません。

何かおかしい部分はありますか?
おしえてください。
(カートン) 2020/03/20(金) 09:35


Workbook_SheetChangeもWorkbook_Openと同じところに置けばいいですよ。

(γ) 2020/03/20(金) 09:50


 ブック起動時にマクロが有効になってない場合も
 イベントが発生しないのでマクロが作動しません。
(OK) 2020/03/20(金) 10:55

 参考HPです。

 Excel VBA ブックとワークシートのイベントプロシージャ

https://kosapi.com/post-3075/
(OK) 2020/03/20(金) 11:10


 もう一つ参考HPです。

 【エクセル初心者向け】VBAマクロを有効化するための初期設定

https://www.excelspeedup.com/macrosettei/
(OK) 2020/03/20(金) 11:13


作動できましたありがとうございます。
履歴確認後、保存し、ファイルを開くと、更新履歴のシートが消失してしまいます。しかし、コード表示でシート確認するとシートが残っているんですが、どういう事でしょうか?
(カートン) 2020/03/20(金) 18:20

okさん、細かい所までありがとうございます。
(カートン) 2020/03/20(金) 18:27

こんばんは ^^
非表示になってたりしませんでしょうか
(隠居じーさん) 2020/03/20(金) 18:33

 ブックは閉じているけど、アプリケーションは閉じてない、
 ということはありませんか?
 一旦アプリケーションまで閉じても再現しますか?
(OK) 2020/03/20(金) 19:00

非表示になっていたので、表示にしたら出てきました。しかし、一度閉じると非表示に戻っています。
(カートン) 2020/03/20(金) 19:28

 ↓では?

 >Sheets("更新履歴").Visible = False 
(OK) 2020/03/20(金) 19:31

 >.Range("C2").Value = Target.Value 

 フィルドラッグなどで複数セル内容を一括で変更した
 場合にはエラーになる可能性があります、
(OK) 2020/03/20(金) 19:40

ちょっと間が空きましたが、気づいた点を少し。

(1)
>.Range("C2").Value = Target.Value
がエラーになる可能性ですが、私も最初はそのように思いましたが、
この場合は、二次元配列の最初の値だけが、セルに書き込まれるだけで、
エラーにはならないように思います。
(結果として、配列のいわゆるスライス処理になるので)

(2)
change系のイベント処理のなかで、セルを変更すると、
再帰的にイベント処理が動作してしまうので、
これを避ける処理を入れるのが一般的です。
(Application.EnableEventsを調べて下さい。)

今のコードでは、再帰は発生してしまっていますが、
If Sh.Name = "更新履歴" Then Exit Subで抜けるので
実質的に障害が起きる訳ではありません。
ただ、change系のイベント処理のなかでのセル操作には常に注意が必要で、
上記対応を行う習慣にしておいたほうが安全だし、効率も良いはずです。
うっかりすると無限ループが発生して落ちることすらあります。

(3)
手作業の結果による履歴を取るマクロを実行する副作用として、
手作業の取り消しが無効になります(処理を取り消して、元に戻すことができない)。
これはマクロ実行全般が持つ基本的な性質によるものですから、如何ともしがたいです。
ただ、手入力作業に関して取消作業が頻出する感じもしないので、
上記の副作用によるデメリットを上回るメリットがあれば、
更新記録として使える処理かと思います。

なお、ワークシートの非表示処理もそうですが、
コードにキチンとインデントをつけたうえで、
よく読まれることをお薦めします。
(γ) 2020/03/23(月) 06:00


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.