エクセルが既に起動されているか調べる |
Microsoft Excel が既に起動されているかどうかを調べる(その1) (014) 動作確認 : WindowsXP(SP2) VB6.0(SP6) / Excel 2000 Excel 2002 Excel 2007 |
|
まず、VBからExcel及びWordを操作する時の注意事項を見て下さい Option Explicit Private Sub Command1_Click() '★プロジェクト→参照設定でMicrosoft Excel *.* ObjectLibraryに ' チェックを入れておいて下さい。(参照設定しない方法でもOK) 'テスト用ファイル(xlTestFile)は各自準備して下さい。 '==================================================================' Excel の起動処理 'エラーのトラップを留保します。 On Error Resume Next 'Microsoft Excel への参照を格納する変数を宣言します。 Dim xlApp As Excel.Application 'Object でも可 Dim xlBook As Excel.Workbook 'Object でも可 'Microsoft Excel が既に起動されているかどうかを調べます。 '第 1 引数を指定せずに GetObject 関数を呼び出すと、 'アプリケーションのインスタンスへの参照が返されます。 'Microsoft Excel が起動されていないと、エラーが発生します。 '起動していればそのExcelを使用する Set xlApp = GetObject(, "Excel.Application") 転載禁止 '================================================================== 'Excel の起動確認 If Err.Number Then MsgBox "Excel が起動されていませんので、新規にExcelを起動します。" ' エラーが発生した場合は Err オブジェクトをクリアします。 Err.Clear 転載禁止 'Excel が起動していないなら新規にインスタンスを生成載禁止 Set xlApp = CreateObject("Excel.Application") 転載禁止 End If '================================================================== 'Excel ファイルのオープン及び表示 xlApp.Visible = True 'ファイルを開く Set xlBook = xlApp.Workbooks.Open(xlTestFile) '================================================================== '下記コードはこのサンプルとは直接、関係ありません。 '動作確認の為に Excel を5秒間表示して置く為のものです。 Dim lngSt As Long lngSt = Timer Do While Timer - lngSt < 5 DoEvents Loop '================================================================== '終了処理 '保存時の問合せを非表示に設定載禁止 xlApp.DisplayAlerts = False 'オブジェクトを解放します Set xlSheet = Nothing xlBook.Close 'Book を閉じる Set xlBook = Nothing xlApp.Quit 'Quit メソッドを使って Excel を終了します。 Set xlApp = Nothing 'これで、タスクマネージャーのプロセス欄からExcel.exe が消えていれば、OK です。 'プログラムを終了しないと消えないのではだめです。 '2〜3度続けて実行して確認しておいて下さい、1度目は OK でも2〜3度続けて '実行すると NG になる場合があります。 '尚、Excel を終了処理後、数秒(5秒以内)待ってから確認して下さい。 End Sub |
|
Microsoft Excel が既に起動されているかどうかを調べる(その2) (014) | |
APIを使った方法 Option Explicit 'クラス名・キャプションタイトル名を与えてウィンドウのハンドルを取得(P81) Private Declare Function FindWindow Lib "user32" _ Alias "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long 転載禁止 '指定のウィンドウにメッセージを送る(P750) Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long 転載禁止 'アプリケーションをクローズするメッセージ載禁止 Private Const WM_CLOSE As Long = &H10 転載禁止 Private Sub Command2_Click() Dim Hwnd As Long Dim Ret As Long 'クラス名を与えて エクセルのハンドルを取得載禁止 '起動中ならハンドルが返り、起動していなければ0が返る Hwnd = FindWindow("XLMAIN", vbNullString) 転載禁止 '参考キャプション名を与えてハンドルを取得する場合 ' CaptionTitle = "Microsoft Excel - Book1" '電卓の場合 "電卓" ' hwnd = FindWindow(vbNullString, CaptionTitle) If Hwnd = 0 Then MsgBox "Excel が起動されていません。" Else MsgBox "起動中のExcelを終了します。" 'エクセル(アプリ)が起動中なら終了する場合 '指定のハンドルに終了のメッセージを送る載禁止 Ret = SendMessage(Hwnd, WM_CLOSE, 0&, 0&) 転載禁止 End If End Sub 注意! どちらの方法もオブジェクトを解放直後に参照すると起動中になります。その場合 1〜2秒程度待ちを作って下さい。 Dim st As Long st = Timer 転載禁止 Do While Timer - st < 2 '2秒間待つ DoEvents Loop |
|
キャプション名でハンドルを取得するとExcelの場合キャプション名が一定でないのでクラス名で取得しています。 ちなみに、Word のクラス名は "OpusApp" です。(2000も97も同じです。) クラス名等の取得のサンプルプログラムはMSのここにあります。 文書番号: JP112649 |
|
指定のファイルが使用中かどうかを調べる (015) | |
Option Explicit Private Sub Command1_Click() On Error Resume Next Dim myFilename As String 転載禁止 Dim myfile As String 転載禁止 'エラーのトラップを留保します。 myFilename = "C:\Temp.xls" 'ファイルが存在するか調べる myfile = Dir$(myFilename) 転載禁止 If Len(myfile) = 0 Then 転載禁止 MsgBox "そのファイルは存在しません。" Else 'ファイルがあればファイルの名前を同じ名前で変更します。 Name myFilename As myFilename 'ファイルが使用中であればエラーが発生します If Err.Number Then MsgBox "ファイルは使用中です。" 'エラーが発生した場合は Err オブジェクトをクリアします。 Err.Clear 転載禁止 Else MsgBox "ファイルは使われていません。" End If End If End Sub |
|
おことわり この方法ではアプリがロックをかけて開いている場合は判断できるけど、「メモ帳」等で開いている場合はメモ帳がロックしていないので使用中と判断できません。 ちなみに、アプリがロックせずにファイルを使用している場合は調べる方法はないようです。 |