- ベストアンサー
Excel保存終了時間の問題とは?
- ExcelVBAで作成したファイルを使用している際に、保存終了する際に時間がかかり、操作が二重に行われることがあります。
- この問題により、ファイルが壊れる可能性もあります。
- 終了処理中の別の終了処理要求を受け付けない方法について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Application.Visible = False これで、Excel自体が見えなくなります。(つまり、操作不可能) 保存が済んだらVisibleプロパティをTrueにします。 もし、Excel2003等で、Excel本体のウィンドウハンドルが入手できれば GetWindowLong、SetWindowLongでウィンドウをDISABLEにすることも できます。(DISABLE中は可視状態だが、操作を受け付けない)
その他の回答 (1)
- nda23
- ベストアンサー率54% (777/1415)
DISABLEの方法 Declare Function SetWindowLongA& Lib "user32" _ (ByVal H&, ByVal S&, ByVal L&) Declare Function GetWindowLongA& Lib "user32" _ (ByVal H&, ByVal S&) Const GWL_STYLE = -16 Const WS_DISABLED = &H8000000 Sub 無効化() 'DISABLEにする Dim H&, S& H = Application.hwnd S = GetWindowLongA(H, GWL_STYLE) S = S Or WS_DISABLED SetWindowLongA H, GWL_STYLE, S End Sub Sub 有効化() 'ENABLEにする Dim H&, S& H = Application.hwnd S = GetWindowLongA(H, GWL_STYLE) S = S And (Not WS_DISABLED) SetWindowLongA H, GWL_STYLE, S End Sub
お礼
ありがとうございます。 Workbook_Activate()において有効化() Workbook_Deactivate()において無効化() を試みました。 (他の箇所での挿入タイミングはわかりませんので) Excel本体を終了する分には良いのですが、Bookを終了させると、残ったExeclに対して何も操作出来ないと云う問題が生じました。 故に、当面はApplication.Visibleの方法で進めたいと思います。 保存終了時のWorkbook_Deactivate()ですが、Excel本体終了時は直ぐにイベントが発生しますが、Bookのみの終了時は、長い時間保存処理を行なってから最後の方でイベントが発生する様です。 Disable/Enableのハンドラは別の部分で応用したいと思います。 ただしプログラムの意味は大雑把しか分かりませんので、ハンドラのDLLを入手して、実行時にリンクする形式に持っていきたいと思います。 10年以上前にCプログラマーを引退しました。もうDLLを作る意欲と体力はありませんので、フリーソフトをVBにくっ付けて動かせれば良いかなあと思っています。
お礼
ありがとうございます。 DISABLEに出来れば良いのですが、ウィンドウハンドルの知識はありません。 Visibleプロパティを色々試行しました。 作成したExcelVBAは、親Bookが複数の子BookをOpenする形をしています。 Visible=Falseにすると、開いている全てのBookが見えなくなってしまう為、各Bookを次の様にしました。 Private Sub Workbook_Deactivate() UserForm1Menu.Hide ''←既存処理です If (Workbooks.Count = 1) Then ActiveWorkbook.Application.Visible = False End If End Sub これで上手く動作しました。 難点は砂時計が表示されなくなったので、保存して終了した事を目視できないと云う事です。 次の段階では、せめて親Bookだけでも、変更有無に関わらず保存終了にしようかと色々試してみようと思っています。