GetObject работает, CreateObject - нет - PullRequest
1 голос
/ 04 октября 2019

Попытка написать скрипт, который

  • Если сессия Excel уже открыта, присоедините его к этому,
  • Сессия Excel не открыта, поэтому создайте его.

Первый вариант работает великолепно! Второй вариант не работает и не дает никаких объяснений, просто выходит и ничего не делает!

Dim objXLApp, objXLWb, objXLWs
Dim XLWasRunning

XLWasRunning = True

Set objXLApp = GetObject(, "Excel.Application")

If Not TypeName(objXLApp) = "Empty" Then
    strMessage = "Excel Running."
Else
    strMessage = "Excel Not Running."
    Set objXLApp = CreateObject("Excel.Application")
End If

Set objXLWb = objXLApp.Workbooks.Open("F:\GFD\Sam\Test\test.xlsx")
Set objXLWs = objXLWb.Sheets(1)

РЕДАКТИРОВАТЬ: изменено CreateObject(, "Excel.Application") на CreateObject("Excel.Application")

1 Ответ

1 голос
/ 04 октября 2019

Этот код, основанный на полученных комментариях, должен работать:

Dim objXLApp, objXLWb, objXLWs
Dim XLWasRunning
Dim strMessage

' Get running instance
Set objXLApp = GetObject("", "Excel.Application")

If Not objXLApp Is Nothing Then
    strMessage = "Excel Running."
    XLWasRunning = True
Else
    strMessage = "Excel Not Running."
    Set objXLApp = CreateObject("Excel.Application")
    XLWasRunning = False
End If

objXLApp.Visible = True

Set objXLWb = objXLApp.Workbooks.Open("C:\Temp\test.xlsx")
Set objXLWs = objXLWb.Sheets(1)

Возможно, вы захотите добавить следующее, чтобы проверить, нужно ли вам снова загружать книгу:

If Not XLWasRunning Then
    Set objXLWb = objXLApp.Workbooks.Open("C:\Temp\test.xlsx")
    Set objXLWs = objXLWb.Sheets(1)
End If

Если Excel уже запущен, вы также можете проверить, загружена ли ваша Рабочая книга перед ее загрузкой:

Dim bWorkbookFound
bWorkbookFound = False
For Each objXLWb In objXLApp.Workbooks
    If objXLWb.Name = "test.xlsx" Then
        ' Workbook already loaded
        bWorkbookFound = True
        objXLWb.Activate
    End If
Next
...