- ベストアンサー
VBAで読み取り専用時にマクロを無効にする方法
- VBAで読み取り専用時にマクロを無効にする方法を探しています。ネットワークで共有しているファイルが閉じられない問題があり、その解決策としてVBAを使用して自動的にファイルを閉じる方法を試しましたが、読み取り専用時でもマクロが実行されてしまいます。
- VBAを使用してエクセルの入力操作がない場合に自動的にファイルを閉じる方法を試していますが、読み取り専用時でもマクロが実行される問題があります。
- VBAを使ってエクセルの入力操作がない場合に自動的にファイルを閉じる方法を試していますが、読み取り専用時にマクロが実行されてしまいます。マクロを無効にするための構文を追加する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
マクロでは, sub プロシジャ名() から end sub まで のヒトカタマリをプロシジャと言います。 【注意】 しばしば sub macro1() : end sub sub macro2() : end sub などのようにあったときに sub macro1() ←ここから end sub sub macro2() end sub ←ここまでですね♪ なんて具合にすっとぼけた勘違いをするヒトがいらっしゃるので,間違えないように気をつけてください。 それから。 追記する一行マクロを少し変更します。 sub macro1() ↑macro1プロシジャの始まり if thisworkbook.readonly then end ↓macro1プロシジャはここまで end sub sub macro2() ↑macro2プロシジャの始まり if thisworkbook.readonly then end ↓macro2プロシジャはここまで end sub : 以下同文 とします。
その他の回答 (1)
- keithin
- ベストアンサー率66% (5278/7941)
ご覧になった過去ログでは,ベストアンサーのANo.1も実際には色々上手くないようで,要は「アナタがいま実際に運用しているマクロ」は一体全体どういう内容になっているのですか?ってことなんですが。 でもあんまりグダグダと情報提供を待っていても先に進みませんし,アナタもさっさと回答が欲しいでしょうから。 ご質問の直接の回答としては if 対象ブック.readonly then exit sub のような仕込みで,対象ブックが読み取り専用で開かれている場合は「余計なことはしないでさっさとマクロを終了する」といった具合に仕込んでおけばOKです。 具体的に「どこに」この一文を仕込んでおけばよいのかはそれこそアナタのマクロ次第ですが,もしもご自分じゃ判断できないのでしたら,アナタが今運用中の全てのプロシジャの先頭に組み込んでください。
お礼
早速の回答ありがとうございます。 説明不足失礼しました。 リンク先ANo.1をそのままコピペで使用しています。 標準モジュールの内容が下記になります。 ----------------------------------------------- Public Operated As Boolean Sub SetTimer() Application.OnTime Now + TimeValue("00:05:00"), "CloseMe" End Sub Sub CloseMe() If Operated Then Operated = False SetTimer Exit Sub End If 'ブックの上書き保存 ActiveWorkbook.Save ' 保存確認を避けるため、保存済みにする ThisWorkbook.Saved = True ' 他にブックが開いていなければ、Excelを終了する If Workbooks.Count <= 1 Then Application.Quit ' 本ブックをClose ThisWorkbook.Close False End Sub ------------------------------------------------------ ThisWorkbookの内容が下記になります。 ------------------------------------------------------- Private Sub Workbook_Open() Operated = False SetTimer End Sub Private Sub Workbook_BeforePrint(Cancel As Boolean) Operated = True End Sub Private Sub Workbook_Deactivate() Operated = True End Sub Private Sub Workbook_Activate() Operated = True End Sub Private Sub Workbook_SheetActivate(ByVal Sh As Object) Operated = True End Sub Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Operated = True End Sub Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Operated = True End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Operated = True End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) Operated = True End Sub Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Operated = True End Sub Private Sub Workbook_WindowActivate(ByVal Wn As Window) Operated = True End Sub Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) Operated = True End Sub Private Sub Workbook_WindowResize(ByVal Wn As Window) Operated = True End Sub --------------------------------------------------------- すべてのプロシージャの先頭ということは 標準モジュールとThisWorkbookに ----------------------------------- if 対象ブック.readonly then exit sub ----------------------------------- という上記内容を追加すれば良いということでしょうか? また、当方まだまだ知識が乏しいため 詳細な構文がわかりません。 ----------------------------------- Sub MacroStop() If ThisWorkbook.readonly Then Exit Sub End If End Sub ----------------------------------- とすれば良いのでしょうか? 重ね重ね申し訳ありませんがよろしくお願いします。
お礼
お礼が遅くなってしまって申し訳ありません。 教えて頂いたとおりにやってうまくいきました。 ようやくテスト運用期間を終えて、グループ内でも問題なさそうということでした。 ありがとうございました。