マクロが有効なワークブックを開いているときに別のワークブックを選択できません

StackOverflow https://stackoverflow.com//questions/25071193

  •  26-12-2019
  •  | 
  •  

質問

コードを使用してタイマーを設定するマクロが有効なワークブックがあります。これは共有ブックであり、多くの場合、人々はブックにアクセスし、デスクを離れることがあります。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 イベントハンドラ。

つまり、次のことができます。

  1. ワークブックを保存して終了するための新しいルーチンを追加します。これを呼び出しましょう。 SaveWorkbookAndExit. 。これは次によって呼び出されます OnTime 後で。
  2. の内容を置き換えます Workbook_SheetChange イベントハンドラは次のようになります。

    Application.OnTime Now + TimeValue("00:30:00"), _
                       "SaveWorkbookAndExit", _
                       Schedule:=False
    

    これは基本的にルーチンをスケジュールします SaveWorkbookAndExit 今から 30 分後に電話されます。注目してください Schedule:=False -- これは、以前に設定した手順をクリア/キャンセルする必要があることを示しており、これは非常に重要です。

  3. また、上記と同じコードを Workbook_Open イベントハンドラ。 ただし、上記とは異なり、設定する必要があることに注意してください Schedule:=True ここに!

以上です。ワークブックを開くと、新しい SaveWorkbookAndExit 操作が予定されています。その後、中に入るたびに、 Workbook_SheetChange, 、以前にスケジュールされた操作はキャンセルされ、代わりに新しい操作がスケジュールされます。

私はこれについて何もテストしていませんが、アイデアが理解できることを願っています。さらに説明が必要な場合はお知らせください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top