エクセルが既に起動されているか調べる
                                                      玄関へお回り下さい。
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
おことわり
この方法ではアプリがロックをかけて開いている場合は判断できるけど、「メモ帳」等で開いている場合はメモ帳がロックしていないので使用中と判断できません。
ちなみに、アプリがロックせずにファイルを使用している場合は調べる方法はないようです。
転載禁止

2002/04/19
2006/12/27


VBレスキュー(花ちゃん)
Visual Basic6.0  VB6.0