|
FindWindowExで試しにつくってみました。
ただし、結構条件を限定していますので、Excelのバージョンによっては使えないかもしれません。
Option Explicit
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, ByVal lpszWindow As String) As Long
' GetWindowTextWを使用(戻り値でLeft$したいから)
Private Declare Function GetWindowText _
Lib "user32" Alias "GetWindowTextW" _
(ByVal hWnd As Long, ByVal lpString As Long, _
ByVal nMaxCount As Long) As Long
Sub test()
Const strBookPath As String = "D:\TESTエリア\testarea\sample.xls"
If IsExistBook(strBookPath) Then
MsgBox strBookPath & "は開いています。"
Else
MsgBox strBookPath & "は開いていません。"
End If
End Sub
' 該当のBookを開いているかどうかを調査する関数(FindWindowEx使用)
' 動作確認 : Windows Xp Pro Sp2, Excel 2002 Sp3
Private Function IsExistBook(ByVal strBookPath As String) As Boolean
Dim hXLMainWnd As Long
Dim hXLDeskWnd As Long
Dim strTitle As String
Dim lngLen As Long
Dim strBookName As String
' ブック名の取得(ファイルタイトル)
strBookName = Dir(strBookPath)
Do
' EXCELウィンドウの取得(クラス名 "XLMAIN" で列挙)
hXLMainWnd = FindWindowEx(0&, hXLMainWnd, "XLMAIN", vbNullString)
' EXCELウィンドウはもうないので終わり
If hXLMainWnd = 0 Then Exit Do
' EXCELのウィンドウタイトルの取得
strTitle = String(256, vbNullChar)
lngLen = GetWindowText(hXLMainWnd, StrPtr(strTitle), 256)
If lngLen > 0 Then
strTitle = Left$(strTitle, lngLen)
' Bookを最大化していない場合
' (ウィンドウタイトル "Microsoft Excel" で該当とする)
If strTitle = "Microsoft Excel" Then
' MDIのウィンドウ(?)を取得(クラス名 "XLDESK" で取得)
hXLDeskWnd = FindWindowEx(hXLMainWnd, 0&, _
"XLDESK", vbNullString)
If hXLDeskWnd <> 0 Then
' 該当のBookが開いているかどうか(Book名で検索する)
If FindWindowEx(hXLDeskWnd, 0&, _
vbNullString, strBookName) <> 0 Then
IsExistBook = True
Exit Function
End If
End If
' Bookを最大化している場合
' (ウィンドウタイトル "Microsoft Excel - Book名" で該当とする)
ElseIf strTitle Like "Microsoft Excel - " & strBookName Then
IsExistBook = True
Exit Function
End If
End If
Loop
End Function
|
|