プロが教えるわが家の防犯対策術!

環境
winXP
Office2000 Excel
VB6.0 sp5

VBからExcelが起動されているか知りたいのです。
【状況1】
[a.xls]を起動している状態で下記を実行すると問題なく起動が確認できます。

【状況2】
[a.xls][b.xls]を起動してて[b.xls]が前面にある場合は下記を実行しても[a.xls]を探せません。
またウインドウを最大化にしていない場合も"Microsoft Excel -"という文言がいらない?せいか探せません。

[FindWindowEx]を使用すればできるのかと思いましたがイマイチ使い方が分からず困っています。

よろしくお願いします。

'sampleソース---------------------------------------------
hwnd = FindWindow("XLMAIN", "Microsoft Excel - a.xls")
If hwnd = 0 Then
Msgbox(" 0 は、Excel が起動していないことを示します。")
Else
Msgbox(" 起動中")
End If
'sampleソース---------------------------------------------

A 回答 (2件)

補足しますね。



単に Excel が開いているかどうか...を調べるなら、API を使う必要はありません。

Dim xlApp As Object
On Error Resume Next
Set xlApp = GetObject(, "Excel.Application")
If xlApp Is Nothing Then
  MsgBox "開いてない"
Else
  MsgBox "開いてる"
End If
Set xlApp = Nothing
On Error GoTo 0

みたいな感じで。ご質問の a.xls が開かれているか? という意味なら、

> Excel のプロセスが2つとか、3つあった場合はどうします?

この点、Excel が異なるプロセスで複数存在する場合は、プロセス毎に調べなく
てはなりません。これはかなり面倒なので、代替案として

  「排他アクセスできなければファイルは使用中=開いている」

というロジックでどうですか?

Private Sub Command1_Click()
  If IsOpend("C:\Sample\a.xls") > 0 Then
    MsgBox "開いている", vbCritical
  Else
    MsgBox "開いてないか、ファイルが無い", vbInformation
  End If
End Sub

' // ファイルが使用中か調べる
Public Function IsOpend(ByVal FilePath As String) As Long
  ' 排他アクセスできなければファイルは使用中
  If Dir$(FilePath) <> "" Then
    Dim n As Integer
    n = FreeFile()
    On Error Resume Next
    Open FilePath For Binary Access Read Lock Read Write As #n
    Close #n
    If Err Then
      IsOpend = 1 ' 既に開いている
    Else
      IsOpend = 0 ' 開いていない
    End If
    On Error GoTo 0
  Else
    IsOpend = -1  ' ファイルが見つからない
  End If
End Function
    • good
    • 3
この回答へのお礼

度々ありがとうございます!

この発想の転換に気づきませんでした!!
本当にお世話になりました。
ありがとうございました。

お礼日時:2006/11/17 09:19

こんにちは。

KenKen_SP です。

XLMAIN --> XLDESK --> EXCEL7 の順で探します。このウインドウ構成は SPY++ を
使うとすぐわかりますよ。

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String _
) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
    ByVal hWnd1 As Long, _
    ByVal hWnd2 As Long, _
    ByVal lpsz1 As String, _
    ByVal lpsz2 As String _
) As Long

Sub Sample()

  Dim hWnd As Long
  hWnd = FindWindow("XLMAIN", vbNullString)
  If hWnd > 0 Then
    hWnd = FindWindowEx(hWnd, 0&, "XLDESK", vbNullString)
    ' lpsz2 === a.xls とか
    hWnd = FindWindowEx(hWnd, 0&, "EXCEL7", "a.xls")
    If hWnd > 0 Then
      MsgBox "(・∀・)ミッケ! Handle:=" & CStr(hWnd)
    Else
      MsgBox "(・∀・)いないみたい"
    End If
  Else
    MsgBox "(・∀・)Excel が起動してないみたい"
  End If

End Sub

でも、この方法では探しきれないと思います。Excel のプロセスが2つとか、
3つあった場合はどうします?

この回答への補足

ありがとうございます!

希望通りの回答です!!

>でも、この方法では探しきれないと思います。Excel のプロセスが2つとか、
3つあった場合はどうします?

た 確かに…。探せないですね。(汗
もう少し自分で考えてみます…。
もし何か良い知恵がございましたらご教授願いますm(_ _)m

とりあえずありがとうございました!!

補足日時:2006/11/16 18:40
    • good
    • 0
この回答へのお礼

この方法も大変参考になりました。

ホントありがとうございました^^

お礼日時:2006/11/17 09:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A