2016-04-06 3 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 
Смежные вопросы