• 締切済み

VBA ファイル制御(日付)

自分で作成したエクセルのファイルを他の事業所へ貸し出すことになりましたが、他の事業所で一般的に使用されたりコピーされて使われないように、ファイルを一度開いてから7日後には、ファイルを開いても強制終了させるとか、コメントを表示させてファイルを閉じさせるとか、ファイルを開けないようにしたいと思っています。 パソコンにより、日付が狂っているものもあるので、 そのパソコンの日付で7日後を指定したいのですが、VBAでどの様にやればいいのかわかりません。 丁寧に教えてください。 最初にファイルを開いた時にだけ、そのパソコンの日付を取得し、 7日後を設定し、7日後以降ファイルを開いた場合、メッセージBOX「使用期限ですなど」を表示させ、ファイルを閉じさせるという感じにできたら。。。と思っています。

みんなの回答

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.6

#5の回答の補足です。 一通り考えられる不正利用を防止 と書きましたが更なる悪意を持ったユーザーが使用し、ファイル自体のパスワードを解析する場合があります。 その場合はVBAのパスワードをランダムで変更し自動保存と言ったことが出来れば問題ないのですがなかなかそういうわけにも行きません。 更なる保護が必要な場合は「VBA 保護」で検索しVBAの保護ツールにてパスワード入力を無効化してください。 一度無効化するとパスワード入力自体が出来なくなるので当然メンテナンスも出来なくなります。 オリジナルファイルのバックアップをお忘れなく・・・。

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.5

こんにちは。 希望に合うか分かりませんが作ってみました。 まず、動作の概要ですが初回起動時にレジストリにタイムスタンプを刻み使用期間をチェックします。 悪意を持ってシステム日付を変更される可能性も考慮起動毎に日付チェックを行います。 初期設定として「メニュー」「シート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)
回答No.4

過去に同じような質問に回答したものです 参考にしてみてください http://okwave.jp/qa4825730.html http://okwave.jp/qa5122809.html

回答No.3

k_jinenさんの回答の方法が現実的かと思いますが、少し私の意見を追加して要点だけ。 ・初回起動時にPCのタイムスタンプを取得し+7日して使用期限とする  ⇒使用期限を管理するシートを作成し常に非表示にする。 ・但し、これだとPCの時計をいじられると使用可能になるため別の対策も施す。  ⇒一度でも使用不可と判定されたらずっと使用不可にする   →期日(日付)を見るのではなく使用不可フラグを作成してそこを見るようにする。  ⇒別で起動回数もカウントしていき、例えば50回以上起動した場合は   使用不可とする仕組みも入れる。7日間で50回も起動しないかなという感じで設定すればいいかと。 (PCの時計がバラバラならこの方法だけでもいいかも?) ・起動時にマクロを有効にしなかった場合の対処。  ⇒デフォルトで全シート非表示にしておき使用期限内の場合のみシートを表示するようにする。  ⇒ファイルを閉じる際に全シート非表示のマクロを自動実行する。 ・ファイルを渡す場合はメールやCD-R等での渡しは避ける。  ⇒原本が残っているとそこからコピーしてくればまた使えるので。

回答No.2

No.1です 追加です。 無論、マクロ(VB)のコマンドにもパスワードをかける必要があります。 重要なのは、 1.起動時に相手がマクロの稼働を停止したばあい、あるいは、パスワードを入力しなかった場合、ファイル(シート)へのアクセスができないようにしなければならない。(通常、セキュリティを重視するため、マクロ起動は行われないようになっている) 2.ファイルを保存する段階で、非表示シートの処理が行われなかったならば、次の起動時にマクロの稼働が行われなかったなら、ファイル内容へのアクセスを遮断する方法がない。 ということです。 無論、どのようにアクセス制御するにしても、解除するための高度なテクニックがあると思われますので、どの程度アクセス制御をかけるのかは、エクセルファイルの内容によると思います。

sumi3377
質問者

補足

内容は理解できました。 やはり大変なのですね。 実際に今やっているのは、7日後の期日をVBA内に記載し、 その期日が来たらシートを隠し、強制終了させてしまうという やり方をしています。 しかし、日付が狂っているパソコンがあることに気が付き、 7日後の期日をVBAに記載しても実際の日付とパソコンの日付が異なるので、その後も最大1年間使用できてしまうという問題が起きました。 パソコンの日付が狂っていても、ファイルが開いてから7日間経過したら、動作するVBAを組めればと思ったのです。 なんとかなりますか?

回答No.1

起動時から一定時間経過後に自動的にパスワード入力しないと、特定のシートを非表示にすると同時に、アクセス不可能にする機能を埋め込んで使っています。 私の場合、起動後からの時間で計測していますが、最初に起動後からの日時ということですので、下記のような手順になろうかと思われます。 詳しい記述は容量を超えますので、この場では、お教えしかねます。 === 制御用の専用シートを1ページ用意します。 そのシート内のセルを利用して、過去にファイルを開いたかどうかのフラグ、および最初にファイルを開いた日時をマクロ(VB)にて記入するようにします。 マクロ(VB)は、ファイルオープン時に稼働するようにしておきます。 すなわち、ThisWorkbookのイベント「Workbook_Open()」などで起動するようにします。 マクロが起動した段階で、制御用シートに「マクロ稼働した」旨のフラグを立て、制御用シート以外のアクセスさせていいシートの非表示を解除します。 最終的にシートを非表示にし、ブックの保護で表示解除できないようにします。 注意すべきは、マクロ(VB)実行中、マクロを編集すると、動作がおかしくなる(特に時間が来ると制御するように設定している割り込み関係が正常に動作しなくなる)ことがあるので、割り込みを一時停止するようなコマンドを、イミディエィトウィンドウで実行する必要があります。 以上ですが、思ったような動作を得るためには、試行錯誤しながら、テストしなければならないと思います。私の場合、思ったような動作をさせるまでに、仕事の合間を縫って1か月程度かかりました。

関連するQ&A

  • エクセルファイルの使用期限の設定について

    こんにちわ。 VBAを現在、勉強中です。 エクセルのVBAを使ってファイルに使用期限を設定できるのでしょうか? 出来れば設定日付以降は開かないようにしたいのですが、どうでしょうか? そうした場合、パソコンの日付を変更するとやはり開いてしまうのでしょうか? 皆様のお力をぜひお貸し頂ければ幸いです。

  • VBAで日付についての質問

    お世話になります。 下記についてのVBA記述方法をご教示頂きたく 宜しくお願い致します。       記 1)20080924と言う日付が表示されているセルから   09の月だけを違うセルに表示する(取得)方法 2)20080924と言う日付が表示されているセルから   一月減らして(200808)違うセルに表示する(取得)方法 3)20080924と言う日付が表示されているセルから   一月増やして(200808)違うセルに表示する(取得)方法

  • Excel VBAでファイルの制御をしたい

    今、Excel VBAでファイル操作の制御スクリプトをくみたくて 悩んでおります。。 "test.xls"ファイルというエクセルの共有ファイルがあります。 そのファイルは日々様々なユーザーがデータを書き込みます。 この共有ファイルに対し、誰か一人がこのファイルを開いている際に 違う誰かがファイルを開こうとした場合に、警告メッセージを表示した後、強制的にファイルを閉じるというプログラムを組みたいのですが・・。 何せ、VBAでのプログラミングはまったくの初心者の為、 悪戦苦闘しております。 どなたか、良いアドバイスを頂けたら嬉しいです。 是非、宜しくお願い致します。

  • エクセルVBAで、元になるファイルをコピーし、ファイル名を連続した日付

    エクセルVBAで、元になるファイルをコピーし、ファイル名を連続した日付としたいのですが、 ボタン一つで、ファイル名を、2010.1.1請求書.xls~2010.1.31請求書.xlsとして、 2010.1.1請求書のシート1のA1セルに、その日付2010.1.1を入力保存し、ファイルを連続作成する コードはどのようになるのでしょうか?  VBA初心者です。ご教授お願いします。

  • access VBA でテキストファイルの編集をしたい

    既に退社した前任者の代から受注データを本社のサーバからダウンロードしてエクセルで加工するファイルがあるのですが、日々更新されるのも不都合が出てきましたのでなんとかアクセスのデータに日々蓄積したくなりました。 毎日日付を含む名前のファイルがアップされFTPで○月○日のファイルを受信するのですが、バッチファイルとテキストファイルをを使ってFTPの受信をしていました。 1、VBAでテキストファイルの日付を変更する。(任意の日付) 2、VBAからバッチファイルを実行し、先に変更した日付のファイルを受信する。 これをアクセスで同じことをしたいです。 フォームにテキストボックスを作って、そこに日付を入れるようにして、VBAでテキストファイルの日付をテキストボックスにある日付に変更して、それから・・・まだ工程はあるのですが、まずテキストファイルが変更できないと先へ進めません。 エクセルのVBAは少しは判るのですが、accessVBAは初心者です。 よろしくお願いします

  • 【VBA】「時間+日付.xls」ファイルの作成

    vbaで 「Shell ("cmd /C copy """ & 」を使用し、 今日の日付と時間を名前にしたエクセルファイル( Time$ & Time$ をファイル名にして)を作成しているのですが Date$ →2009-05-12 は、エラーになることなくファイルが作成できるのですが Time$→16:00:24 は、↑の様に「:」が入ってしまう為エラーになってしまいます。 VBAを使って現在の「時間+日付.xls」を作成するにはどうしたらよいでしょうか? ちなみにnow$はライブラリにすらありませんでした。 ご教授よろしくお願いします。

  • VBA publicで日付が呼び出せない

    VBAにて、ユーザーフォーム上のテキストボックスに初期値として今日の日付が入力されており、さらにそれを任意で変更することも出来、最終的なテキストボックスの値を変数に格納するというマクロを作成しようとしています。 'テキストボックス2の初期値を今日の日付とする Private Sub UserForm_Initialize() TextBox2.Text = Format$(Date, "yyyy/mm/dd") 'テキストボックス2の値が日付かどうかチェック Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If IsDate(TextBox2.Value) Then DenpyouDate = TextBox2.Value Else TextBox2.Value = "" MsgBox ("日付が不正です") TextBox2.Text = Format$(Date, "yyyy/mm/dd") End If End Sub '他のモジュールでdenpyoudateを使用し、指定のセルに和暦形式で入力する Public DenpyouDate As Date Sheets("伝票").Range("A10").Value = Format(DenpyouDate, "e") Sheets("伝票").Range("C10").Value = Format(DenpyouDate, "m") 「ユーザーフォームのテキストボックスに初期値として日付を表示させ、その最終的な値を変数として格納、別のモジュールで呼び出してセルにセットする」というイメージです。 このマクロを実行した際、初期値である今日の日付を任意の日付に変更した場合は、問題なくそのままの値がセルにセットされるのですが、初期値のまま実行すると、その数値が反映されません。 ローカルウィンドウをチェックすると、ユーザーフォームの時点では、テキストボックスの初期値がきちんとdenpyoudateに格納されているのですが(例:2009/11/24)、それを別モジュールで呼び出した時は、denpyoudateの値が(#0:00:00#)になっており、これが原因だと考えています。 このエラーを回避し、初期値の場合でも値がきちんとセルにセットされるようにするには、どうしたらよいでしょうか?

  • EXCEL VBAでの日付の表示について

    EXCEL2003のVBAを始めたばかりなので、初歩的なことですが、分かる方ぜひ教えてください。 フォーム上に、『取得年月日』という項目をつくり、表示を"H○○.○○.○○"としたいのですが、どのように作成をしたらよいのでしょうか? ちなみに、その日付を使って更新をしたり、計算をしたりもします。 よろしくお願いします。

  • VBSで指定した日付のファイルのみを抽出するには

    以下の内容について教えていただけないでしょうか? ○実施したいこと ・インプットボックスに日付を入力 ・指定したフォルダに移動 ・インプットボックスで入力された日付を含むファイルのみ抽出  (ファイル名: **130503**) →ファイルは0個、1個、複数個の場合あり ・抽出したファイルを別フォルダにコピー ○困っていること ・入力した日付をパラメータとして、ファイル検索を行い該当するファイルを  抽出する方法 ※入力する日付は130503のようにしたいです。 ○現在、作成中のソース Option Explicit Dim hizuke Dim fs Do '日付を入力するためのインプットボックスを表示 hizuke = InputBox("日付を入力してください。" &_ vbCR & vbCR &_ "例)2000/01/01") '「キャンセル」または未入力で終了 If hizuke = "" Then Exit Do '正しい日付が入力された場合 ElseIf IsDate(hizuke) then MsgBox "テスト(正しい日付が入力されました。)" 'オブジェクトを作成する Set fs = CreateObject("Scripting.FileSystemObject") 'ファイルをコピーする fs.CopyFile "D:\test130503.log","D:\test\" '日付でなかったら、注意を表示して、インプットボックスに戻る Else MsgBox "入力した値が不正です。" End If Loop 宜しくお願いします。

  • ExcelVBA/ダイアログボックスで選んだファイルのファイル名を取得したい

    ExcelのVBAについて教えてください。 「ファイルを開く」の時に出てくるようなダイアログボックスを表示させ、そこで選択したファイルのフルパス+ファイル名を文字列形式で取得したいのですが、どのようにしたら良いでしょうか? 自分でヘルプファイルもある程度調べてみたのですが、よく分かりませんでした。 最終的には、ワークシート上に画像ファイルを挿入し、その作成日付をセルに表示するようなものを作りたいのですが、 Application.Dialogs(xlDialogInsertPicture).Show では、画像は挿入されるものの、挿入した画像のファイル名を取得できないので、日付が調べられないのです。 宜しくお願いします。

専門家に質問してみよう