• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBでExcelが起動されているか知りたい)

VBでExcelが起動されているか知りたい

このQ&Aのポイント
  • VBからExcelの起動状態を確認したい場合、FindWindowEx関数を使用します。
  • 状況1では、特定のExcelファイルが起動している場合に正しく動作します。
  • 状況2では、前面に表示されているExcelファイル名を指定する必要がありますが、ウィンドウの最大化によって起動判定が失敗する可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.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

terasyst
質問者

お礼

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

その他の回答 (1)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。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つあった場合はどうします?

terasyst
質問者

お礼

この方法も大変参考になりました。 ホントありがとうございました^^

terasyst
質問者

補足

ありがとうございます! 希望通りの回答です!! >でも、この方法では探しきれないと思います。Excel のプロセスが2つとか、 3つあった場合はどうします? た 確かに…。探せないですね。(汗 もう少し自分で考えてみます…。 もし何か良い知恵がございましたらご教授願いますm(_ _)m とりあえずありがとうございました!!

関連するQ&A