2016-04-06 28 views
0

私はExcelを実行しているかどうかを調べようとしています。なぜなら、Excelファイルを作成した後、私はExcelを閉じるべきかどうかを知る必要があるからです。Excelが実行されているか調べる

私の方法は問題なく動作していますが、別のユーザーでは失敗し、なぜ失敗したのかわかりません。私の賭けは、whileループが永遠に実行されることです。だから私はこれを避けるためのカウンタを追加するか、Excelが実行されているかどうかを調べるためのより良い方法はありますか?だからここ

Function ListWins(Optional title = "*", Optional Class = "*") As Boolean 
    Dim hWndThis As Long 
    ListWins = True 
    hWndThis = FindWindow(vbNullString, vbNullString) 
    While hWndThis 
     Dim sTitle As String, sClass As String 
     sTitle = Space$(255) 
     sTitle = Left$(sTitle, GetWindowText(hWndThis, sTitle, Len(sTitle))) 
     sClass = Space$(255) 
     sClass = Left$(sClass, GetClassName(hWndThis, sClass, Len(sClass))) 
     If sTitle Like title And sClass Like Class Then 
      ListWins = False 
      Debug.Print sTitle, sClass 
     End If 
     hWndThis = GetWindow(hWndThis, GW_HWNDNEXT) 
    Wend 
End Function 
+1

これらのWin32 API呼び出しが32ビットと64ビットのOfficeのインストールのために別々にインポートする必要があり(がUser32 ...?) 。おそらくそれは2台のコンピュータの違いを説明します。 [this](http://stackoverflow.com/questions/29723694/excel-2013-windows-class-names/29724663#29724663)を参照してください。 – Jeeped

+0

ありがとう、我々は両方の32ビット版の単語を実行するが、彼は32ビットのPCを使用し、私は64ビットのPCを使用します。 – skatun

+1

ちょうどFWIW:GetObject(、 "Excel.Application")を使用して、そのエラー(429、思い出したように)が実行されていない場合。 –

答えて

0

は、私の作品の新しい機能である:

#If VBA7 Then 
    Private Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" (_ 
    ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr 
#Else 
    Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (_ 
    ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
#End If 

Function ExcelOpen() As Boolean 
    ExcelOpen = FindWindow("XLMAIN", vbNullString) 
End Function 
関連する問題