『LOG記録を消せないようにする』(shirosuke)
「LOG」シートに記録できるようにしています。
この「LOG」シートが他の人に消せないよう「LOG」シート保護するとLOGが記載されません。シート保護しても「LOG」シートにLOGが残るようにするにはどのようにすればいいでしょうか。
LOGが残るVBAは下記のようにしてしています。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Set WsnObj = CreateObject("WScript.Network") 'WshNetworkオブジェクトを利用してユーザー名・コンピューター名を取得します。
Application.EnableEvents = False 'イベントの無効化
If ActiveSheet.Name <> "LOG" Then 'シート「LOG」以外で実行します。(ログを記録します。)
XCol = Target.Column '列番号を取得します。 YRow = Target.Row '行番号を取得します。
lRow = Worksheets("LOG").Range("A" & Rows.Count).End(xlUp).Row + 1 'ワークシート「LOG」A列の最終行を取得します。
With Worksheets("LOG") .Range("A" & lRow) = Format(Now(), "YYYY/MM/DD HH:MM:SS") '更新日時をワークシート「LOG」A列に日時を転記します。 .Range("B" & lRow) = Sh.Name '更新したシート名をワークシート「LOG」B列に転記します。 .Range("C" & lRow) = Target.Address(YRow, XCol) '変更位置(セル番号)をワークシート「LOG」B列にセル番号を転記します。 .Range("D" & lRow) = OldRange '変更前の内容をワークシート「LOG」 .Range("E" & lRow) = Cells(YRow, XCol) '更新内容をワークシート「LOG」C列に転記します。 .Range("F" & lRow) = WsnObj.UserName 'コンピューターのユーザー名をワークシート「LOG」D列に転記します。 .Range("G" & lRow) = WsnObj.ComputerName 'コンピューター名をワークシート「LOG」D列に転記します。 End With
End If
Application.EnableEvents = True 'イベントの有効化
End Sub
よろしくお願いします。
< 使用 Excel:Excel2021、使用 OS:Windows10 >
●通常は保護して置いて、書き込みが必要な時に保護解除して、書き込みが終わったら再度保護する方式を推奨します。 ●UserInterfaceOnly:=Trueを使って保護する方法もありますが、下記(2)の理由から個人的には推奨しません。
(1)推奨方式は、以下のような方法です。 Sub test() Dim ws As Worksheet Set ws = Worksheets("Sheet1") ws.Unprotect
' ここに作業を書く ws.Range("A1") = 1 '' 例です
'再度保護する ws.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
(2)UserInterfaceOnly:=Trueを使って保護する方法もあります。 留意点は、この設定はファイルが閉じられると無効になることです。(通常の保護状態となる) したがって、ファイルを開く都度、設定し直す必要があります。 Private Sub Workbook_Open() Worksheets("Sheet1").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ UserInterfaceOnly:=True End Sub などと。
ただし、 ・この設定は、マクロ無効で開かれたり(シフトを押しながら開く) ・Application.EnableEvents =Falseとして、他のブックから開かれたりすると、 UserInterfaceOnly:=True は無効となります。
このことから、(1)の、その都度、保護解除、作業、再保護が推奨されます(あくまで私見)。
(3)なお、誤処理を防ぐ以上の意図(つまり、意図的な改ざんを防止する意図)があれば、 シート保護する際に、パスワード設定する必要があります。 Projectそのものにも、パスワードをつけて一般ユーザーが開けないようにします。 (xyz) 2024/04/02(火) 10:54:26
職場でシフト作成の担当をしています。シフト作成ファイルは1月分のシート、2月分のシートと各月別にシートが12シートとLOGを記載するシートで合計で13シートあります。勤務希望は各職員が直接Excelファイルに入力しています。
LOG履歴を残したくなった経緯は他人の休み希望を削除し自分の休み希望を入力されたことがあったためです。なので勤務希望のシートは操作できるがLOG履歴シートはロックを解除しないと削除できないようにしたいです。今回LOGシートを保護したままLOG履歴が残るようにしたい事です。現状LOGシート保護しなければROGシートに履歴が残りますがLOGシートを保護するとLOGシートには何も履歴が残りません。
何かいい方法があればよろしくお願いします。
(shirosuke) 2024/04/02(火) 19:18:41
私の回答用テンプレートをそのまま書いたので、保護や保護解除するシート名が、 LOGシートと書いていませんが、そこは、内容を理解して欲しかったですね。
・LOGシートに書き込む直前で、LOGシートの保護を解除し、 ・LOGシートに書き込みを実行 ・再度、LOGシートに保護を掛ける としてください、ということを申し上げた積りです。 伝わりませんか? (xyz) 2024/04/02(火) 20:08:46
With Worksheets("LOG") と End Withの間に、 保護解除、書き込み処理、再度保護を書いてください。 LOGシートには、パスワード付きの保護を利用してください。 また、「VBAProjectのプロパティ」から入って、こちらにも保護を掛けて VBAコードが見られないようにしてください。(最初の回答で(3)に書いたとおり)
追加の情報に関してです。 | 他人の休み希望を削除し自分の休み希望を入力されたことがあったためです。
こういう"悪意ある行動"を前提とするなら、コードの工夫では限界があります。 そもそもマクロ無効で開かれれば、そのイベントプロシージャーも動作しません。 (したがって自前のログに残りません。サーバー側のログには残るでしょうけど)
まずは、改竄を行ったものに対して、理由を確認し、 場合によっては断固とした処罰を行う必要があります。 "こうした行動は結果的に割に合わない"という運営への信頼が必要でしょう。
そのうえで、完全を期すなら、、 ・利用者が自由に書き込める運用を廃止する。 ・担当者への報告制にし、適宜、PDF等で開示する。 ・担当者への変更依頼を受けて、担当者がExcelブックを変更する ということにでもなるでしょうか。
もしくは ・対象日の〇日前までは変更可として、ロックをはずした状態で書き込み可とし、 ・それ以降はロックし、変更不可とし、 ・予定シートそのものを保護(PWD付) ・変更は担当者への申請制 とすることも考えられます。
ただし、ExcelのPWDはとても脆弱と聞いたことがあります。 後者も完全とは言えないかもしれません。 Excelを公開することが改竄を許す原因になりうるので、 完全を期すならPDF開示でしょうか。(もちろん負荷はかかりますが)
経験をお持ちの回答者さんからコメントがあるとよいですね。 (xyz) 2024/04/03(水) 11:38:44
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.