質問: 繰り返しの質問で済みませんが、お力添えをお願いします。 共有フォルダにあるExcelファイルを数人で使用する時、誰かがファイルを開いたまま閉じ忘れ、他の方が使えない問題をマクロで解消したいと考えております。前回同じ質問をし、皆様からご指摘やご教訓を頂戴し、私も仰せの様にしたいのですが、組織の性質上、組織自体の仕組み(最先端技術の導入での解消)には至る事ができません。どうしてもマクロで解決したく、以下の条件を満たすマクロコードを教えてください。叶えたい事は、Excelファイルの無操作が一定時間続いたら、それまでの状態を自動保存して閉じる事ができるマクロです。条件は、 要件1: 使用者がマクロを有効にするとSheet1("メッセージ")は非表示になり、操作対象のSheetが表示されること。 要件2: 操作対象のSheet2("データ")が表示されたら、後は一定時間ファイル操作が無ければ、それまでの状態を自動保存してファイルを閉じること。 要件3: ファイルを閉じるまでの無操作時間は任意で設定できること。 要件4: 操作対象のSheetは1枚限りではなく後から追加で増やせても同様の事ができること。 なお、vbaコードにVBProject.VBComponentsなどを組み込まれると「プログラミングによるVisual Basic プロジェクトへのアクセス権は信頼性に欠けます」というエラーメッセージが出てしまい、これを出なくするのに幾つかの手順を踏まなければならないため、このようなコードは使わないでください。 この質問には賛否両論ある事と思いますが、今回回答してくださる方は、マクロvbaコードを教えてくださる方のみでお願いします。それ以外の方のご回答はご遠慮ください。 また、私はマクロ初心者のため、コードを書かれたら、できるだけそのコードをどこに書く(コピペ)するのか等、詳しいやり方を教えてください。私もここへ質問を投稿するまで散々調べましたが、希望のコードは見つからず、かといって、自身では知識不足でコードは書けず、切なる思いで質問しています。それをお汲み取りくださり、コードを教えてくださる方以外の方の回答は済みませんがご遠慮をお願いします。宜しくお願い致します。
回答: '************************************************* '「ThisWorkbook」モジュールに書くコード '************************************************* Private Sub Workbook_Open() Call 全てのシートを表示する Call 表示しないシートを非表示にする Call 閉じる時刻をセット Call タイマーをスタート End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) Call 全てのシートを表示する Application.DisplayAlerts = False ThisWorkbook.Save Application.DisplayAlerts = True End Sub '************************************************* '「データ」シートのシートモジュールに書くコード '************************************************* Private Sub Worksheet_SelectionChange(ByVal Target As Range) Call タイマーをストップ Call 閉じる時刻をセット Call タイマーをスタート End Sub '************************************************* '標準モジュールに書くコード '************************************************* Const 表示するシート$ = "データ" Const 表示しないシート$ = "メッセージ" Const 閉じるまでの時間_時間 As Integer = 0 Const 閉じるまでの時間_分 As Integer = 0 Const 閉じるまでの時間_秒 As Integer = 12 Public 閉じる時刻 As Date Public Sub 閉じる時刻をセット() 閉じる時刻 = Now + TimeSerial(閉じるまでの時間_時間, 閉じるまでの時間_分, 閉じるまでの時間_秒) End Sub Public Sub タイマーをスタート() Application.OnTime 閉じる時刻, "ブックを閉じる" End Sub Public Sub タイマーをストップ() Application.OnTime 閉じる時刻, "ブックを閉じる", , False End Sub Public Sub 表示しないシートを非表示にする() Dim wss: wss = Split(表示しないシート, ",") Dim i& For i = LBound(wss) To UBound(wss) ThisWorkbook.Worksheets(wss(i)).Visible = False Next End Sub Public Sub 全てのシートを表示する() Dim ws For Each ws In ThisWorkbook.Worksheets ws.Visible = True Next End Sub Public Sub ブックを閉じる() If Workbooks.Count = 1 Then Application.Quit Else ThisWorkbook.Close True End If End Sub