2016-04-06 31 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 ......?) 。也許這就解釋了兩臺電腦之間的區別。參見[this](http://stackoverflow.com/questions/29723694/excel-2013-windows-class-names/29724663#29724663)。 – Jeeped

+0

謝謝,我們都運行32位版本的單詞,但他使用32位電腦,我使用64位電腦。 – 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