非アクティブ後にブックを強制的に閉じる(Microsoft Excel)
デイブは、現在使用されていない場合、一定時間後にワークブックを強制的に閉じることができるかどうか疑問に思います。彼のオフィスでは、サーバー上にあるワークブックを開いた後、開いていることを忘れています。その場合、他の誰もそれらを編集できないので、60分間放置すると、ワークブックを強制的に閉じたいと考えています。
マクロを使用してこれを行うことは可能ですが、ビジネスまたはユーザー指向の観点からは実際には行いたくない場合があります。たとえば、ユーザーが自分のシステムで3つのワークブックを開いていると、それらの間で比較を行うことができます。 「縛られる」可能性があります
かなり長い間2つのワークブックがあり、3つ目はシャットダウンをトリガーするものです。 ExcelのVBAは、それほど識別力がありません。ブックが閉じられているときは、通常、現時点で焦点が当てられているものです。
さらに、閉じるときに保存されていない変更をどのように処理しますか?それらを保存すると、おそらくユーザーがそれらを保存するつもりがなかったという問題が発生します。それらを保存しないと、逆の問題が発生します。おそらく、保存する必要のあるデータがたくさんありました。情報を保存する必要があるかどうかを閉じる手順で尋ねることはできません。これにより、ブックを開いたままにする(および使用しない)場合と同じように、ブックを確実に拘束することができます。
考えられる解決策は、単にブックを共有することです。 (他の_ExcelTips_で説明されているように)共有を有効にすると、複数のユーザーが同じブックを同時に開くことができます。それらの人の1人がそれを開いたままにしておくと、他の人はそれを開いたままにして、オプションでブックに変更を加えることができるので、他の誰も不便を感じることはありません。
マクロベースのルートを選択する場合、解決策はかなり単純です。ある種のタイマー構造(OnTimeメソッドを使用して簡単に実装)と、誰かがブックで何かを行っているかどうかを確認する方法が必要です。
開始するには、次のコードを標準のマクロモジュールに追加します。追加するルーチンが3つあることに注意してください:
Dim DownTime As Date Sub SetTimer() DownTime = Now + TimeValue("01:00:00") Application.OnTime EarliestTime:=DownTime, _ Procedure:="ShutDown", Schedule:=True End Sub
Sub StopTimer() On Error Resume Next Application.OnTime EarliestTime:=DownTime, _ Procedure:="ShutDown", Schedule:=False End Sub
Sub ShutDown() Application.DisplayAlerts = False With ThisWorkbook .Saved = True .Close End With End Sub
これらの3つのルーチンはかなり簡単です。最初の2つはそれぞれタイマーをオンにし、オフにします。これらのルーチンは、どのルーチンの外部でも宣言されているDownTime変数を利用していることに注意してください。このようにして、その内容を複数のルーチンで利用できます。
3番目のルーチンShutDownは、実際にブックを閉じるルーチンです。これは、OnTimeメソッドが1時間の終わりに期限切れになった場合にのみ呼び出されます。加えられた可能性のある変更を保存せずにブックを閉じます。
次のルーチン(4つあります)をThisWorkbookオブジェクトに追加する必要があります。 VBAエディターを開き、プロジェクトエクスプローラーでThisWorkbookオブジェクトをダブルクリックします。 Excelが開くコードウィンドウに、次のルーチンを配置します。
Private Sub Workbook_Open() Call SetTimer End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) Call StopTimer End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Call StopTimer Call SetTimer End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _ ByVal Target As Excel.Range) Call StopTimer Call SetTimer End Sub
最初の2つのルーチンは、ブックが開かれたときと閉じられたときにトリガーされます。彼らはタイマーを開始し、それをオフにします。他の2つのルーチンは、ワークシートが再計算されるたび、または誰かがワークブックで選択を行うたびに自動的に実行されます。どちらも、誰かがブックを使用していることを示す良い指標です(ブックは非アクティブに開いていません)。彼らはタイマーを止めてから再開するので、1時間のカウントダウンが最初からやり直します。
これらのようなマクロのセットを使用することには欠点があります。Excelの元に戻す機能を効果的に排除します。マクロが実行されると、元に戻すスタックはExcelによって自動的に消去されます。ブックに変更が加えられるたびにマクロが実行されるため、ユーザーの変更を元に戻すことはできません。 (この欠点を回避する方法はありません。)
注:
このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(2281)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。