- 締切済み
VBA ファイル制御(日付)
自分で作成したエクセルのファイルを他の事業所へ貸し出すことになりましたが、他の事業所で一般的に使用されたりコピーされて使われないように、ファイルを一度開いてから7日後には、ファイルを開いても強制終了させるとか、コメントを表示させてファイルを閉じさせるとか、ファイルを開けないようにしたいと思っています。 パソコンにより、日付が狂っているものもあるので、 そのパソコンの日付で7日後を指定したいのですが、VBAでどの様にやればいいのかわかりません。 丁寧に教えてください。 最初にファイルを開いた時にだけ、そのパソコンの日付を取得し、 7日後を設定し、7日後以降ファイルを開いた場合、メッセージBOX「使用期限ですなど」を表示させ、ファイルを閉じさせるという感じにできたら。。。と思っています。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- avanzato
- ベストアンサー率54% (52/95)
#5の回答の補足です。 一通り考えられる不正利用を防止 と書きましたが更なる悪意を持ったユーザーが使用し、ファイル自体のパスワードを解析する場合があります。 その場合はVBAのパスワードをランダムで変更し自動保存と言ったことが出来れば問題ないのですがなかなかそういうわけにも行きません。 更なる保護が必要な場合は「VBA 保護」で検索しVBAの保護ツールにてパスワード入力を無効化してください。 一度無効化するとパスワード入力自体が出来なくなるので当然メンテナンスも出来なくなります。 オリジナルファイルのバックアップをお忘れなく・・・。
- avanzato
- ベストアンサー率54% (52/95)
こんにちは。 希望に合うか分かりませんが作ってみました。 まず、動作の概要ですが初回起動時にレジストリにタイムスタンプを刻み使用期間をチェックします。 悪意を持ってシステム日付を変更される可能性も考慮起動毎に日付チェックを行います。 初期設定として「メニュー」「シート1」「シート2」・・・がありますがメニュー以外は非表示になっています。 マクロが有効になっていないとメニュー以外のシートは表示されません。 ブックを閉じるときにメニュー以外のシートを隠します。 ブックにはプロテクトが掛っていてコピーが出来ません。 VBAにはプロテクトが掛っていて意図的に改変されることはありません。 とりあえず一通り考えられる不正利用を防止すると思われます。 パスワードは全て共通で「123456」です。 こちらがコードになります。 ------------------------------------------- Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) 'ON ERROR RESUME NEXT '動作確認用(実際はデバッグ画面表示用に使用 '終了時にメニュー以外のシートを隠す Dim sh ActiveWorkbook.Unprotect Password:="123456" For Each sh In Worksheets If sh.Name <> "メニュー" Then Sheets(sh.Name).Visible = False Next ActiveWorkbook.Protect Password:="123456" End Sub Private Sub Workbook_Open() 'ON ERROR RESUME NEXT '動作確認用(実際はデバッグ画面表示用に使用 '起動時に全シートを表示する。 'マクロを有効にしなければシートが表示できない。 Dim Reg_FinishDate As Date Dim Reg_FinishTime As Date Dim Reg_ThisDate As Date Dim Reg_ThisTime As Date If Len(GetSetting("Security", "Sample", "FinishDate")) <> 0 Then Reg_FinishDate = GetSetting("Security", "Sample", "FinishDate") '登録されているレジストリを検索 Reg_FinishTime = GetSetting("Security", "Sample", "FinishTime") '登録されているレジストリを検索 End If If Reg_FinishDate <> 0 Then '2回目以降起動動作 Reg_ThisDate = GetSetting("Security", "Sample", "ThisDate") Reg_ThisTime = GetSetting("Security", "Sample", "ThisTime") If Reg_FinishDate <= Reg_ThisDate Then If Reg_FinishTime <= Reg_ThisTime Then MsgBox ("使用期限が切れています。") 'ActiveWorkbook.Close Exit Sub '★動作確認用(実際は不要) End If End If '悪意を持ってシステム日付を変更した場合 If Date <= Reg_ThisDate Then If Time <= Reg_ThisTime Then MsgBox ("不正使用です。") 'ActiveWorkbook.Close Exit Sub '★動作確認用(実際は不要) End If End If SaveSetting "Security", "Sample", "ThisDate", Date '現在のタイムスタンプ SaveSetting "Security", "Sample", "ThisTime", Time '現在のタイムスタンプ Else '初回起動時動作 SaveSetting "Security", "Sample", "FinishDate", Date + 7 '最初に起動した時より7日後 SaveSetting "Security", "Sample", "FinishTime", Time '最初に起動した時間 SaveSetting "Security", "Sample", "ThisDate", Date '現在のタイムスタンプ SaveSetting "Security", "Sample", "ThisTime", Time '現在のタイムスタンプ End If Dim sh ActiveWorkbook.Unprotect Password:="123456" For Each sh In Worksheets If sh.Name <> "メニュー" Then Sheets(sh.Name).Visible = True Next ActiveWorkbook.Protect Password:="123456" End Sub ------------------------------------------- 使用するレジストリは HKEY_CURRENT_USER -> Software -> VB and VBA Program Settings -> Security 以降です。 不明な点がありましたらお願いします。
- hige_082
- ベストアンサー率50% (379/747)
過去に同じような質問に回答したものです 参考にしてみてください http://okwave.jp/qa4825730.html http://okwave.jp/qa5122809.html
- winarrow07
- ベストアンサー率41% (143/346)
k_jinenさんの回答の方法が現実的かと思いますが、少し私の意見を追加して要点だけ。 ・初回起動時にPCのタイムスタンプを取得し+7日して使用期限とする ⇒使用期限を管理するシートを作成し常に非表示にする。 ・但し、これだとPCの時計をいじられると使用可能になるため別の対策も施す。 ⇒一度でも使用不可と判定されたらずっと使用不可にする →期日(日付)を見るのではなく使用不可フラグを作成してそこを見るようにする。 ⇒別で起動回数もカウントしていき、例えば50回以上起動した場合は 使用不可とする仕組みも入れる。7日間で50回も起動しないかなという感じで設定すればいいかと。 (PCの時計がバラバラならこの方法だけでもいいかも?) ・起動時にマクロを有効にしなかった場合の対処。 ⇒デフォルトで全シート非表示にしておき使用期限内の場合のみシートを表示するようにする。 ⇒ファイルを閉じる際に全シート非表示のマクロを自動実行する。 ・ファイルを渡す場合はメールやCD-R等での渡しは避ける。 ⇒原本が残っているとそこからコピーしてくればまた使えるので。
- 来生 自然(@k_jinen)
- ベストアンサー率30% (80/261)
No.1です 追加です。 無論、マクロ(VB)のコマンドにもパスワードをかける必要があります。 重要なのは、 1.起動時に相手がマクロの稼働を停止したばあい、あるいは、パスワードを入力しなかった場合、ファイル(シート)へのアクセスができないようにしなければならない。(通常、セキュリティを重視するため、マクロ起動は行われないようになっている) 2.ファイルを保存する段階で、非表示シートの処理が行われなかったならば、次の起動時にマクロの稼働が行われなかったなら、ファイル内容へのアクセスを遮断する方法がない。 ということです。 無論、どのようにアクセス制御するにしても、解除するための高度なテクニックがあると思われますので、どの程度アクセス制御をかけるのかは、エクセルファイルの内容によると思います。
- 来生 自然(@k_jinen)
- ベストアンサー率30% (80/261)
起動時から一定時間経過後に自動的にパスワード入力しないと、特定のシートを非表示にすると同時に、アクセス不可能にする機能を埋め込んで使っています。 私の場合、起動後からの時間で計測していますが、最初に起動後からの日時ということですので、下記のような手順になろうかと思われます。 詳しい記述は容量を超えますので、この場では、お教えしかねます。 === 制御用の専用シートを1ページ用意します。 そのシート内のセルを利用して、過去にファイルを開いたかどうかのフラグ、および最初にファイルを開いた日時をマクロ(VB)にて記入するようにします。 マクロ(VB)は、ファイルオープン時に稼働するようにしておきます。 すなわち、ThisWorkbookのイベント「Workbook_Open()」などで起動するようにします。 マクロが起動した段階で、制御用シートに「マクロ稼働した」旨のフラグを立て、制御用シート以外のアクセスさせていいシートの非表示を解除します。 最終的にシートを非表示にし、ブックの保護で表示解除できないようにします。 注意すべきは、マクロ(VB)実行中、マクロを編集すると、動作がおかしくなる(特に時間が来ると制御するように設定している割り込み関係が正常に動作しなくなる)ことがあるので、割り込みを一時停止するようなコマンドを、イミディエィトウィンドウで実行する必要があります。 以上ですが、思ったような動作を得るためには、試行錯誤しながら、テストしなければならないと思います。私の場合、思ったような動作をさせるまでに、仕事の合間を縫って1か月程度かかりました。
補足
内容は理解できました。 やはり大変なのですね。 実際に今やっているのは、7日後の期日をVBA内に記載し、 その期日が来たらシートを隠し、強制終了させてしまうという やり方をしています。 しかし、日付が狂っているパソコンがあることに気が付き、 7日後の期日をVBAに記載しても実際の日付とパソコンの日付が異なるので、その後も最大1年間使用できてしまうという問題が起きました。 パソコンの日付が狂っていても、ファイルが開いてから7日間経過したら、動作するVBAを組めればと思ったのです。 なんとかなりますか?