マクロが有効なワークブックを開いているときに別のワークブックを選択できません
質問
コードを使用してタイマーを設定するマクロが有効なワークブックがあります。これは共有ブックであり、多くの場合、人々はブックにアクセスし、デスクを離れることがあります。30 分間操作がないと保存して閉じるように設定されています。この機能は問題なく動作しているようですが、私が直面している問題は、他のブックを開いているときに、タイルをクリックする (Windows 7) か Alt + Tab を押してもそれらを選択できず、移動する唯一の方法が Ctrl であることです。 +シフト。ワークブックを使用しているのが私だけであれば問題はありませんが、なぜこれが起こっているのか知っている人はいますか?以下に投稿されたコード:
Private Sub Workbook_Open()
StartTimer
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
StartTimer
End Sub
Const idleTime = 1800 'seconds
Dim Start
Sub StartTimer()
Start = Timer
Do While Timer < Start + idleTime
DoEvents
Loop
Application.DisplayAlerts = False
ActiveWorkbook.Close True
Application.DisplayAlerts = True
End Sub
解決 2
Thank you again for the reply, I couldn't quite figure you where I was supposed to put what as I am new to this as I had said. I did find a solution, or so it seems:
In the "This Workbook" module I put:
Option Explicit
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
ResetTimer
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ResetTimer
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ResetTimer
End Sub
and in the "user" module (i right click and add module), I used:
Public CloseDownTime As Variant
Public Sub ResetTimer()
On Error Resume Next
If Not IsEmpty(CloseDownTime) Then Application.OnTime EarliestTime:=CloseDownTime, Procedure:="CloseDownFile", Schedule:=False
CloseDownTime = Now + TimeValue("00:00:30") ' hh:mm:ss
Application.OnTime CloseDownTime, "CloseDownFile"
End Sub
Public Sub CloseDownFile()
On Error Resume Next
Application.StatusBar = "Inactive File Closed: " & ThisWorkbook.Name
ThisWorkbook.Close SaveChanges:=True
End Sub
.
私の戦いの半分は、「この」または「そのまま」モジュールによって何を意味するのかを実現しています - このコードは少し過度であるかもしれませんが、それはうまくいくようです。私はあなたが助ける時間をかけて正しいトラックで私を手に入れよう!
他のヒント
まず、なぜそのような動作が起こるのか私にはよくわかりませんが、読み続けてください。私 容疑者 それはあなたと関係があります ビジーウェイト ループ( DoEvents
)、しかしそれは単なる予感です。他の誰かが(より良い)説明を持っているかもしれません。
とにかく、おそらく使用して Application.OnTime
より良いアプローチです。特定の時間または間隔で操作が実行されるようにスケジュールできます。また、以前にスケジュールされた操作をキャンセルして置き換えるオプションもあります。その施設が必要になります Workbook_SheetChange
イベントハンドラ。
つまり、次のことができます。
- ワークブックを保存して終了するための新しいルーチンを追加します。これを呼び出しましょう。
SaveWorkbookAndExit
. 。これは次によって呼び出されますOnTime
後で。 の内容を置き換えます
Workbook_SheetChange
イベントハンドラは次のようになります。Application.OnTime Now + TimeValue("00:30:00"), _ "SaveWorkbookAndExit", _ Schedule:=False
これは基本的にルーチンをスケジュールします
SaveWorkbookAndExit
今から 30 分後に電話されます。注目してくださいSchedule:=False
-- これは、以前に設定した手順をクリア/キャンセルする必要があることを示しており、これは非常に重要です。- また、上記と同じコードを
Workbook_Open
イベントハンドラ。 ただし、上記とは異なり、設定する必要があることに注意してくださいSchedule:=True
ここに!
以上です。ワークブックを開くと、新しい SaveWorkbookAndExit
操作が予定されています。その後、中に入るたびに、 Workbook_SheetChange
, 、以前にスケジュールされた操作はキャンセルされ、代わりに新しい操作がスケジュールされます。
私はこれについて何もテストしていませんが、アイデアが理解できることを願っています。さらに説明が必要な場合はお知らせください。