- ベストアンサー
エクセルVBA 上書き保存禁止と強制終了
以下のようなVBAを作成したいのですが、糸口が見つかりません。 ヒント等や解説webの紹介でもかまいませんのでお願いいたします。 共通で使用するエクセルファイルがあります。 (1)ファイルの上書き保存を禁止したい ・今あるフォルダ内での上書き保存のみ禁止としたいです ・別フォルダに一度でも保存していた場合の上書き保存はOKです つまり共通ファイルを上書きするのはダメですが、自PC等に名前をつけて保存等をしていた場合の上書き保存はOKとしたいです (2)ファイルを開いている時間を5分と制限したい(5分経過したら強制終了) ・今あるフォルダ内での時間制限としたいです ・別フォルダに一度でも保存していた場合は時間制限なしとしたいです つまり共通ファイルを開きっぱなしなのはダメですが、自PC等に名前をつけて保存等をしていた場合は制限なしとしたいです 個々のVBAは多少webなどでわかるのですが、こうだったらこうという記述がよくわからずにおります。 お手数をおかけ致しますが、よろしくお願い申し上げます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No3です。 No2様の例をそのまま利用するなら、こんな感じ Private Sub Workbook_Open() Const filePath = "\\......" '//共用ファイルのパス If ThisWorkbook.Path <> filePath Then Exit Sub '//パスが違う場合は終了 Application.OnTime Now + TimeValue("00:01:00"), "Macro1" End Sub
その他の回答 (3)
- fujillin
- ベストアンサー率61% (1594/2576)
同じような回答ですが… (1)基本的にはNo1様のおっしゃるように権限設定で行うのが良いと思われます。(一般ユーザグループと権限のあるユーザグループに分ける) BVAで行っても、ご質問のような機能の場合だと、一度ローカルに保存したデータを不心得ものがメインに上書きすることが可能になってしまいますから。 (2)制限をかけるときと外すときの違いは、ThisWorkbookのPathで判断するのがよさそう。保護するファイルは決まったPathにあるでしょうから、それ以外の場合は、マクロを実行しないか、またはマクロを消去してしまう。 マクロの消去についてはこのあたりをご参考に… http://officetanaka.net/excel/vba/vbe/07.htm#sample06
お礼
ご回答ありがとうございます 1)の権限については私自身がまだあまり知識を持ち合わせておりませんので調べてみます。 ただ今回はfujillinさまがおっしゃるような不心得モノについては考慮しておりません。 回避したいのが「うっかり上書きしてしまった」に関してだけであることと、 保存してある場所が通常のユーザーならまずたどり着けないような場所にあるからです。 オリジナルも保存してありますし、この点はあまり気にしていません。 2)に関しては、おそらくそうであろうと考えておりました。 例として、回答者hallo-2007さまの Private Sub Workbook_Open() Application.OnTime Now + TimeValue("00:01:00"), "Macro1" End Sub に、どのように組み入れるのかがよくわからなかったのです。 少ない知識での予想なのですが・・・ Private Sub Workbook_Open() On Error GoTo Err_chek パスを取得してーうんたらかんたら←ここがわからない Application.OnTime Now + TimeValue("00:01:00"), "Macro1" Exit Sub Err_chek: このシートをアクティブにする←ファイル名が変更されていた場合を考慮する方法がよくわからない End Sub 多分こうなんだろうなぁとは考えているのですが、根本から間違っていたらすみません。 お手数をおかけ致しますが、もう一度ご教授願いたいです。
- hallo-2007
- ベストアンサー率41% (888/2115)
(1)ですが、フォルダ内の全てのファイルに読み取り専用というのであれば そのフォルダのプロパティで 読み取り専用に チェックで出来ます。 特定のエクセルファイルというのであれば、ファイルを保存するときに パスワードを設定して、管理者のみが書き込みのパスワードを知っている といった使用方法が良いと思います。 (2)ですがVBAでThisWorkBookのモジュールに Private Sub Workbook_Open() Application.OnTime Now + TimeValue("00:01:00"), "Macro1" End Sub 標準モジュールに Sub Macro1() MsgBox "閉じます" ThisWorkbook.Close End Sub をコピィして試してみてください(最初は、適当なサンプルで試してください) 上記コードではファイルを開いた時間の1分後にMacro1のコードを実行 Macro1ではファイルを閉じます。 あくまでもファイルを開くときにマクロを無効で開かれると意味ありませんが。
お礼
ご回答ありがとうございます。 ご指示頂いた件ですと「別フォルダに一度でも保存した場合」でも、 同様の制限(上書きできない・時間制限あり)かと思われます。 知りたいのは「こうだったらこう」という記述の部分になります。 ご回答ありがとうございました。
- SePapa
- ベストアンサー率50% (47/94)
こんにちは。 通常、ファイルの更新権限を設定する場合は VBAを使用するのではなく 通常はそのフォルダやファイルのプロパティにて セキュリティ設定で対応するものだと思います。 (更新権限をOFFにし、参照権限のみとする) また、更新不可に設定したのであれば 開く時間の制限をかける必要もないかと思います。 あるユーザが何分ファイルを開いていようが、別のユーザも同時に ファイルを読み取りで開くことができるのですから 更新権限のみ制御すればいいのではないでしょうか。 どうしても5分の制限をかけたいのであれば ブックオープン時(Private Sub Workbook_Open)に マクロ実行し、 5分間実行待ち(Sleep (300000))した後で ブックを閉じる処理(Workbooks("Book1.xlsm").Close)を実行すれば よいとか思いますが、負荷もかかりますし、 私はあまりお勧めしません。 以上、ご参考まで。
お礼
ご回答ありがとうございます。 通常であればそうすればよいのかと思いますが、残念ながら、 ・参照のみではない ・ファイルは1ユーザーのみの制限がかけてある という条件下となっております。 ご回答ありがとうございました。
お礼
おはようございます。再度のご教授ありがとうございます。 ようやっと意味がわかりました。ありがとうございます。 また作業も行ってみましたが、やりたいことが再現できました。 本当にありがとうございます。勉強になりました。