Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10542 / 13646 ツリー ←次へ | 前へ→

【21078】Windowsのシャットダウン時に処理を実行したい G-Luck 05/1/11(火) 11:43 質問[未読]
【21079】Re:Windowsのシャットダウン時に処理を実行... IROC 05/1/11(火) 11:54 回答[未読]
【21098】Re:Windowsのシャットダウン時に処理を実行... G-Luck 05/1/11(火) 18:40 回答[未読]
【21100】Re:Windowsのシャットダウン時に処理を実行... IROC 05/1/11(火) 21:28 回答[未読]
【21138】Re:Windowsのシャットダウン時に処理を実行... G-Luck 05/1/12(水) 19:49 質問[未読]
【21102】Re:Windowsのシャットダウン時に処理を実行... ぎこにゃーにゃん 05/1/11(火) 23:09 回答[未読]
【21103】Re:Windowsのシャットダウン時に処理を実行... ちゃっぴ 05/1/11(火) 23:40 発言[未読]
【21137】Re:Windowsのシャットダウン時に処理を実行... G-Luck 05/1/12(水) 19:46 質問[未読]
【21141】Re:Windowsのシャットダウン時に処理を実行... ちゃっぴ 05/1/13(木) 0:31 発言[未読]
【21142】Re:Windowsのシャットダウン時に処理を実行... ちゃっぴ 05/1/13(木) 0:45 回答[未読]
【21155】Re:Windowsのシャットダウン時に処理を実行... G-Luck 05/1/13(木) 15:37 発言[未読]
【21139】Re:Windowsのシャットダウン時に処理を実行... tester 05/1/12(水) 21:15 回答[未読]
【21154】Re:Windowsのシャットダウン時に処理を実行... G-Luck 05/1/13(木) 15:33 発言[未読]
【21156】すぐに終了を表示させない G-Luck 05/1/13(木) 15:45 発言[未読]
【21169】一瞬の取得成功 G-Luck 05/1/13(木) 18:09 発言[未読]
【21175】取得に成功 G-Luck 05/1/13(木) 20:23 お礼[未読]
【21185】Re:取得に成功 G-Luck 05/1/14(金) 11:00 回答[未読]
【21209】Re:取得に成功 [名前なし] 05/1/15(土) 2:22 発言[未読]
【21210】Re:取得に成功 ちゃっぴ 05/1/15(土) 2:39 発言[未読]
【21211】Re:取得に成功 [名前なし] 05/1/15(土) 3:08 発言[未読]
【21223】Re:取得に成功 G-Luck 05/1/15(土) 19:30 発言[未読]

【21078】Windowsのシャットダウン時に処理を実行...
質問  G-Luck  - 05/1/11(火) 11:43 -

引用なし
パスワード
   お世話になります
環境 WinXP Excel2003

Windowsのシャットダウン時に、「開いているExcelを保存して終了」という処理を自動的に実行したいのですが、そのようなことをする方法はあるでしょうか?

宜しくお願い致します。

【21079】Re:Windowsのシャットダウン時に処理を実...
回答  IROC  - 05/1/11(火) 11:54 -

引用なし
パスワード
   Private Sub Workbook_BeforeClose(Cancel As Boolean)
  ThisWorkbook.Save
End Sub

でしょうか?

【21098】Re:Windowsのシャットダウン時に処理を実...
回答  G-Luck  - 05/1/11(火) 18:40 -

引用なし
パスワード
   お返事ありがとうございます。

▼IROC さん:
>Private Sub Workbook_BeforeClose(Cancel As Boolean)
>  ThisWorkbook.Save
>End Sub
>
>でしょうか?

ThisWorkbook に上記のように書いてみたのですが、
「プログラムの終了-EXCEL.EXE」ダイアログが表示され、
「すぐに終了」「キャンセル」の選択画面で止まってしまいました。

 Msgbox"" も書いてみたのですが、実行されていないみたいです。

【21100】Re:Windowsのシャットダウン時に処理を実...
回答  IROC  - 05/1/11(火) 21:28 -

引用なし
パスワード
   すみません。いま状況が把握できました。

そのメッセージはExcelではなく、
Windowsのものなので対応するのは難しいと思います。
少なくとも私には方法が思いつきません。

シャットダウンをEXCELから行うならともかく、
Windowsのシャットダウンを監視しなくてはいけないので、
VBAだけでは出来ないような気がします。

【21102】Re:Windowsのシャットダウン時に処理を実...
回答  ぎこにゃーにゃん  - 05/1/11(火) 23:09 -

引用なし
パスワード
   WM_ENDSESSION でシャットダウンを知ることが出来ます。
http://www14.big.or.jp/~ken1/tech/tech10.html
※シャットダウンの方法によっては、駄目らしい。
※VBAでこのメッセージを捕まえるには、フックが必要。
成功するかは、未確認。

【21103】Re:Windowsのシャットダウン時に処理を実...
発言  ちゃっぴ  - 05/1/11(火) 23:40 -

引用なし
パスワード
   WMIに"Win32_ComputerShutdownEvent"というClassがあるので
とりあえずScript作ってみましたが、捕らえられんかった・・・

何でだろう・・・

Dim objWMIService  'As WbemScripting.SWbemServices
Dim objWMISink   'As WbemScripting.SWbemSink

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objWMISink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")

objWMIService.InstancesOfAsync _
  objWMISink, "Win32_ComputerShutdownEvent"

Do
  'WScript.Echo "waiting..."
  WScript.Sleep 1000
Loop

Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  WScript.Echo "Computer is shutting down."
End Sub

【21137】Re:Windowsのシャットダウン時に処理を実...
質問  G-Luck  - 05/1/12(水) 19:46 -

引用なし
パスワード
   ぎこにゃーにゃんさん ちゃっぴさん お返事ありがとうございます。

さて、申し訳ないのですが、WMIとはどこに記述するのでしょうか?
標準モジュールでよいのでしょうか?

Scriptとは?
テキストに書いて、拡張子をVBSにするというやつでしょうか?

初歩的な質問ですみません。

【21138】Re:Windowsのシャットダウン時に処理を実...
質問  G-Luck  - 05/1/12(水) 19:49 -

引用なし
パスワード
   IROC さん お返事ありがとうございます。

>そのメッセージはExcelではなく、
>Windowsのものなので対応するのは難しいと思います。
>少なくとも私には方法が思いつきません。
>
>シャットダウンをEXCELから行うならともかく、
>Windowsのシャットダウンを監視しなくてはいけないので、
>VBAだけでは出来ないような気がします。

別名保存とかで、どこかに痕跡だけでも残せるようにしたいのですが、難しいのかな〜

【21139】Re:Windowsのシャットダウン時に処理を実...
回答  tester  - 05/1/12(水) 21:15 -

引用なし
パスワード
   エクセルから電源断というなら
(これは私は実行していません。こういうのがHDDの中にあったんで
 載せているだけです(^^;)。


標準モジュールに入れて。
なお実行前に、エクセル以外のソフトを全て終了させておいて下さい。

Dim ETime As Date

Sub SetSc()
  ETime = Now() + TimeValue("01:00:00")
  Application.OnTime ETime, "All_SD"
End Sub

Sub All_SD()
  Dim Wb As Workbook
  Dim WshShell As Object
 
  On Error Resume Next
  Set WshShell = CreateObject("WScript.Shell")
  Application.OnTime ETime, "All_SD", , False
  For Each Wb In Workbooks
   Wb.Save
  Next
  Application.Quit
  WshShell.Run "C:\WINDOWS\RUNDLL.EXE USER.EXE,ExitWindows"
End Sub

もっとも趣旨に合ってるとは言いがたいのですが

【21141】Re:Windowsのシャットダウン時に処理を実...
発言  ちゃっぴ  - 05/1/13(木) 0:31 -

引用なし
パスワード
   >さて、申し訳ないのですが、WMIとはどこに記述するのでしょうか?
>標準モジュールでよいのでしょうか?

WMIとは、こんなものです。
http://wmifun.atinfinity.net/wmistep/step01.html

>Scriptとは?
>テキストに書いて、拡張子をVBSにするというやつでしょうか?

です。

ただし、前述のとおり、私の環境では動きませんでした・・・
別方面からApproachしてもダメでしたので、Cでしか扱えない?
(*- -)(*_ _)ペコリ

【21142】Re:Windowsのシャットダウン時に処理を実...
回答  ちゃっぴ  - 05/1/13(木) 0:45 -

引用なし
パスワード
   別解、Windows XP Proffesionalならば、LogOff Scriptが使えるかも?

ユーザー ログオフ スクリプトを割り当てるには
http://www.microsoft.com/resources/documentation/WindowsServ/2003/standard/proddocs/ja-jp/Default.asp?
url=/resources/documentation/WindowsServ/2003/standard/proddocs/ja-jp/gptext_logoffscripts.asp

【21154】Re:Windowsのシャットダウン時に処理を実...
発言  G-Luck  - 05/1/13(木) 15:33 -

引用なし
パスワード
   testerさん ありがとうございます。

シャットダウンをExcelでキャンセルして、必要な処理を実行後、Excelからシャットダウンというような利用ができるのではないかと思い、調べてみました。

testerさんのコードは、残念ながら私のPCでは C:\WINDOWS\RUNDLL.EXE が存在せずうまくいきませんでした。
ただ、

http://www1.u-netsurf.ne.jp/~tomo_c/tips/WSH006.html

を参考(というかそのまま)に

Private Sub myShutdown()
  
  Dim ws
  Dim wmi

  Set ws = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")

  For Each wmi In ws
    wmi.Shutdown
  Next

End Sub

というようにしたら、Excelからのシャットダウンはできました。
貴重なアイディアありがとうございました。

【21155】Re:Windowsのシャットダウン時に処理を実...
発言  G-Luck  - 05/1/13(木) 15:37 -

引用なし
パスワード
   ちゃっぴさん ありがとうございます。

対象のPCは、Homeだったのですが、ProのPCで試してみました。

残念ながら、この処理は、シャットダウン完了直前に実行されるようで、Excelの保存確認が先に出てきてしまい、処理は止まってしまいました。

ただ、ログオフスクリプトというものを知らなかったので、とても参考になりました。

【21156】すぐに終了を表示させない
発言  G-Luck  - 05/1/13(木) 15:45 -

引用なし
パスワード
   これは、メモとして記させていただきます。

シャットダウン時の、「すぐに終了」を表示させずに終了する。
http://homepage2.nifty.com/winfaq/w2k/boot.html#1238

【21169】一瞬の取得成功
発言  G-Luck  - 05/1/13(木) 18:09 -

引用なし
パスワード
   一瞬の取得に成功
下記、コードを標準モジュールに書き、実行している状態でシャットダウンをすると、一瞬メッセージボックスが表示されました。
どなたか、WM_QUERYENDSESSION などを確実に捕らえて処理を追加できる方法をご存じないでしょうか?

Type tagMSG
  hWnd    As Integer
  message   As Integer
  wParam   As Integer
  lParam   As Long
  time    As Long
  pt     As POINTAPI
End Type

Public Declare Function GetMessage Lib "user32.dll" Alias "GetMessageA" _
    (ByRef MSG As tagMSG, ByVal h_wnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long

Private Sub myGet()

  Dim myMes As tagMSG
  
  Do
  If GetMessage(myMes, 0, 0, 0) Then
    If myMes.message = WM_QUERYENDSESSION Then
      MsgBox "WM_QUERYENDSESSIONを検知した!!"
    End If
  End If
  Loop
End Sub

【21175】取得に成功
お礼  G-Luck  - 05/1/13(木) 20:23 -

引用なし
パスワード
   お世話になりました。
シャットダウンのメッセージの取得に成功しました。
参考にさせていただいたURLを下に示します。

http://www.remus.dti.ne.jp/~shenron/access/knowhow/SubClass.html

あらゆることを気にされているため、内容はあまりにも複雑に見えます。
一晩考え、僕の望み限定で、シンプルな形にしたものを提示したいと思います。

みなさま、すくなからず私のために時間を割いてくださいましてありがとうございました。

【21185】Re:取得に成功
回答  G-Luck  - 05/1/14(金) 11:00 -

引用なし
パスワード
   成功例を示します。
下記コードを標準モジュールに記してください。
testを一度実行して、シャットダウン(ログアウト、再起動でも可)すると
「ついにWM_QUERYENDSESSIONを検知した!!」と表示され、OKクリックで
Bookを保存して、通常のシャットダウン処理を実行します。

ありがとうございました。

Option Explicit

'コールバック関数をセット
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

'デフォルトの処理へ
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
  (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
  ByVal wParam As Long, ByVal lParam As Long) As Long

'ウィンドウのハンドルを取得
Private Declare Function FindWindow Lib "USER32.dll" Alias "FindWindowA" _
  (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
  
Private Const GWL_WNDPROC = (-4)  '定数?

Public lngRet As Long  'デフォルトの処理のアドレス

Private Sub test()
  '今回の実行用

  Dim strClassName As String
  Dim strWindowName As String
  Dim lngHwnd     As Long
  
  'エクセル自身なので
  strClassName = "XLMAIN"
  'ハンドルを取得
  lngHwnd = FindWindow(strClassName, strWindowName)

  lngRet = SetWindowLong(lngHwnd, GWL_WNDPROC, _
      AddressOf SubWindowProcedure)
End Sub

Private Function SubWindowProcedure(ByVal hWnd As Long, _
    ByVal iMsg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long

  Dim lngDefProp As Long
  
'ここから、独自処理

  Const WM_QUERYENDSESSION = &H11
  If iMsg = WM_QUERYENDSESSION Then
    MsgBox ("ついにWM_QUERYENDSESSIONを検知した!!")
    ThisWorkbook.Save
  End If
  
'ここまで
  
  'デフォルトウィンドウプロシージャの実行
  SubWindowProcedure = CallWindowProc(lngRet, hWnd, iMsg, _
      wParam, lParam)

End Function

【21209】Re:取得に成功
発言  [名前なし]  - 05/1/15(土) 2:22 -

引用なし
パスワード
   >  'エクセル自身なので
>  strClassName = "XLMAIN"
>  'ハンドルを取得
>  lngHwnd = FindWindow(strClassName, strWindowName)
      ↑
lngHwnd = Application.Hwnd

でもよさそうな気がするんですがダメなのかな。

【21210】Re:取得に成功
発言  ちゃっぴ  - 05/1/15(土) 2:39 -

引用なし
パスワード
   >lngHwnd = Application.Hwnd
>
>でもよさそうな気がするんですがダメなのかな。

2002以降でしたらね。
2000以前は使えません。

【21211】Re:取得に成功
発言  [名前なし]  - 05/1/15(土) 3:08 -

引用なし
パスワード
   >2002以降でしたらね。
>2000以前は使えません。

なるほど、そういうことですか。納得しました。

【21223】Re:取得に成功
発言  G-Luck  - 05/1/15(土) 19:30 -

引用なし
パスワード
   バグを発見しましたので報告します。

1.CPUの負荷が常に100%になる。
2.右上のアプリの「×」が効かない。その後EXCELが固まる。
3.ブックの「×」は、閉じた後エラーが出る

コードの内容をすべて理解しているわけではないので、
コード上のバグなのかどうかもわかりませんが、上記の様な症状が出ました。

10542 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free