プロが教える店舗&オフィスのセキュリティ対策術

サーバーにあるエクセルファイルで私しか作業していないはずなのに古いデータと置き換わってたり、触っていないデータを私が触ったことにされたりして、困っています。最後にいつ、誰が保存したかわかるような方法はないでしょうか?
出来ればエクセルの設定だけでなんとかしたいのですが、そんな方法はないでしょうか?

質問者からの補足コメント

  • hallo-2007さんに教えていただいたところを確認しましたら、残念ながら前回保存者は社名でした。作成者は名前で表示されてたのですが…

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/03/17 12:27

A 回答 (4件)

こんにちは。



私は、もう、あまりマクロは書いていませんが、一応、どんな感じかという紹介程度にさせていただきます。VBAを知っている人なら、このレベルのマクロは誰でも分かると思います。

誰が使ったかはシステムにお任せになってしまいますが、何時にどのぐらいの時間で、どのファイルを触ったかの記録は残りますので、自分のアリバイと、そこにいた人物の特定には可能ではないかと思います。これは、サーバー内では試していませんので、もしかしたら、問題があるかもしれませんが、必ず、Excelアプリの本体のあるHDからのアドインのとり付けになります。

このマクロは、アドインを外しても、外した時の記録が残ります。このパターンを利用して、ファイル自体のバックアップも可能です。ファイル自体は、マクロある・なしを問いません。ただ、現状では、同じ種類のマクロですとコンフリクトを起こして、エラーが発生します。発生場所は、標準モジュールですから、On Error Resume Next ~ On Error Goto 0 で囲えば、エラーだけは防げます。

現在、保存等の記録は、デフォルトパスのフォルダに record.iniという名前に排出されます。1M に達すると、そのファイルは.bak ファイルとなり、新しいファイルになります。ただし、記録は、1世代前までです。1日でも、使い方によっては、相当に大きくなる可能性があります。

クラスの中の、FilesizeCheckの以下の部分の[>=1 ]は、1Mbyte ですから、常識の範囲で、大きくしてもよいかもしれません。

If objFile.Size / (1024 * 1024#) >= 1 Then

ハングした場合も、途中までは記録されるはずです。もし、もっと隠すのでしたら、別のフォルダ(C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Excel\ は、以下のように組み込みます。)

  myPath = Application.StartupPath
  i = InStrRev(myPath, "\")
  myPath = Mid$(myPath, 1, i)

で決めることもできます。

なお、最終的には、パスワードを付けて、マクロの中身を見れないようにしてください。秘匿化していませんので、技術力の高い人なら、パスワード越しでも、見破られてしまいますが、逆に、見破るような人は、数多くはいないはずです。

アドイン化の方法は、マクロを貼り付けたら、保存の際に、.xlamを選べばよいのですが、書き換え等が発生したおりは、VBEモジュール内のみで行ってください。Excelファイル自体には、一切、マクロはありませんから、csvでも、記録に残ります。

不要になったら、アドインは外してください。
---------------------
ファイル名は、RecordAddin.xlam
'//--------

'ThisWorkbook モジュール

Private Sub Workbook_AddinInstall()
  Call Module1.Auto_Open
End Sub

'標準モジュール Module1

Public myClass As Class1
Sub Auto_Open()
  Set myClass = New Class1
  Set myClass.myApp = Excel.Application
End Sub

'クラスモジュール Class1

Public WithEvents myApp As Excel.Application
Private Reco As String
Private objFS As Object
Private myFold As String
Private myPath As String
Private Const INIF As String = "record.ini"  '記録ファイル名

Private Sub Class_Initialize()
myFold = Application.DefaultFilePath
myPath = myFold & INIF
If objFS Is Nothing Then
    Set objFS = CreateObject("Scripting.FilesystemObject")
End If
Call FilesizeCheck
Reco = "App_Ini" & ", " & Format$(Now, "yymmdd hhMMss")
Editline Reco
End Sub

Private Sub myApp_NewWorkbook(ByVal Wb As Workbook)
'新しいブック
Reco = Wb.Name & ",new_book," & Format$(Now, "yymmdd hhMMss")
Editline Reco
End Sub

Private Sub myApp_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
'保存前
Reco = Wb.Name & ",close," & Format$(Now, "yymmdd hhMMss")
Editline Reco & vbCrLf
End Sub


Private Sub myApp_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean)
'印刷
Reco = Wb.Name & ",print," & Format$(Now, "yymmdd hhMMss")
Editline Reco
End Sub

Private Sub myApp_WorkbookOpen(ByVal Wb As Workbook)
'既存のブックを開ける
Reco = Wb.Name & ",open,  " & Format$(Now, "yymmdd hhMMss")
Editline Reco
End Sub

Sub Editline(strTxt As String)
Dim UName As String
Dim objFile As Object
Dim objTxt As Object
Dim objFold As Object
UName = Application.UserName
If objFS Is Nothing Then
    Set objFS = CreateObject("Scripting.FilesystemObject")
End If
If Dir(myFold & INIF) <> "" Then
   Set objFile = objFS.GetFile(myPath)
   Set objTxt = objFile.OpenAsTextStream(8, 0)
   objTxt.WriteLine UName & "," & Reco
   objTxt.Close
Else
   Set objFold = objFS.GetFolder(myFold)
   Set objFile = objFold.CreateTextFile(INIF)
   objFile.WriteLine Reco
   objFile.Close
End If
Set objFile = Nothing
Set objFold = Nothing
End Sub
Sub FilesizeCheck()
Dim objFile As Object
   If objFS.FileExists(myPath) Then
   Set objFile = objFS.GetFile(myPath)
   If objFile.Size / (1024 * 1024#) >= 1 Then
      On Error Resume Next
      objFS.DeleteFile myFold & "record.bak", True
      objFile.Name = "record.bak"
      On Error GoTo 0
   End If
   Set objFile = Nothing
   End If
End Sub
    • good
    • 0
この回答へのお礼

助かりました

ここまで丁寧に説明してくださってありがとうございます。VBAはあまり詳しくないので大変助かりました。早速明日試してみます。

お礼日時:2016/03/22 23:12

かなり遅くなってしまいましたが、気になっていたので、返事をさせていただきます。


興味が薄れてしまっていたら、無視して構いません。

まず、一般的な方法です。
一般的には、「校閲」の変更履歴の記録を設定します。
会社の許可があれば、IRMを取り付け、アクセス制限をします。

また、アドインで、特定のファイルをOpen時に、バックアップ取る方法が考えられます。
Excel内部のコマンドを使うと、非常に時間が掛かりますが、外部オブジェクトなら、時間はかかりません。1日1回のバックアップにします。

それ以外に、アドインで起動時にExcel使用のタイム・スタンプが取れます。こちらで試しに作って、本日、一日、エクセルのログを取ってみました。

仕組みは、エクセルを起動すると、"RecodeAddin" という、アドインも立ち上がりますから、その時に、アプリケーション・オブジェクトに、クラスから、インスタンスを取り付けて、後は、アプリケーション・オブジェクトのイベントにしたがって、Open やClose, New Book など、記録を取ります。これだけ、説明して、知っている方なら、分かると思います。

ファイル名は、recode.ini に入ります。

例:
ExcelFile2015 というファイルを開いた場合。

名前、ファイル名, 動作, 日にち, 時間

App_Ini, 160321 150627  *本体起動
(MyName),RecodeAddin.xlam,open, 160321 150627 *アドインが組み込まれた
(MyName),App_Ini, 160321 150627  *ローカルのアドインが組み込まれた
(MyName),PERSONAL.XLSB,open, 160321 150627 *個人用マクロブック
(MyName),Book1,new_book,160321 150627 *新規のブックが開いた
(MyName),ExcelFile2015.xlsm,open, 160321 151017 *ExcelFile2015を開いた
(MyName),RecodeAddin.xlam,close,160321 170507 *アドインを終了=>終了
(MyName),ExcelFile2015.xlsm,close,160321 170507 *ExcelFile2015を閉じて、終了

名前がない場合は、会社名などになってしまいますが、いつ、どのファイルを開いたかは全部記録に残ります。
    • good
    • 0
この回答へのお礼

ありがとう

いえ、気にして下さってありがとうございます。校閲は使用してみましたが、古いファイルを上書きされると意味がなかったのと、自分も混乱してきたのでやめました。
サーバーにおいてるファイルは最低限のアクセス制限はかけています。
最後の方法は私には難しい気がしますが、明日調べながら挑戦してみようと思います。途方に暮れていたので方法があることだけでも提示していただいただけでも助かりました。ありがとうございます。

お礼日時:2016/03/22 00:02

>残念ながら前回保存者は社名でした。


保存された方のパソコンが 社名 で ログインされたパソコンと云う事です。
各自のパソコンにわかりやすい名前を付けてログインしてもらうしかありません。
社名でログインする位ですから、それなりに偉い方のパソコンかもしれませんね。
或いは、会社がパソコンを配布する時に社名で登録していて
使用者が変更して使うように指示が出ているのにそのまま使っているケースも
あるかもしれません。
犯人を捕まえて説教するしかないでしょうね。
    • good
    • 0
この回答へのお礼

返答が遅くなって申し訳ありませんでした。
恐らく会社のパソコンはほんどのひとが社名で登録され、使用者に変更の指示がなかったのでそのまま使用してますので、犯人は見つかりそうにないですね。
何度もご返答いただてありがとうございます。

お礼日時:2016/03/18 12:28

エクセルのファイルを右クリック


プロパティをクリック
詳細 のタブでみると
作成者、前回保存者、前回保存日時などの情報がありますが?
この回答への補足あり
    • good
    • 1
この回答へのお礼

ありがとう

それは気付いてませんでした。
今日は外にいるので明日、早速見てみます。有難うございます。

お礼日時:2016/03/16 17:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!