VBScript управляет уже открытым документом Excel [дубликат]

Принятый ответ работает, но немного больше объяснений не повредит.

Атрибуты класса не становятся атрибутами экземпляра при создании экземпляра. Они становятся атрибутами экземпляра, когда им присваивается значение.

В исходном коде значение no присваивается атрибуту list после создания экземпляра; поэтому он остается атрибутом класса. Определение списка внутри __init__ работает, потому что __init__ вызывается после создания экземпляра. В качестве альтернативы, этот код также выдаст желаемый результат:

>>> class a:
    list = []

>>> y = a()
>>> x = a()
>>> x.list = []
>>> y.list = []
>>> x.list.append(1)
>>> y.list.append(2)
>>> x.list.append(3)
>>> y.list.append(4)
>>> print(x.list)
[1, 3]
>>> print(y.list)
[2, 4]

Однако запутанный сценарий в вопросе никогда не случится с неизменяемыми объектами, такими как числа и строки, поскольку их значение не может быть изменено без назначения. Например, код, аналогичный оригиналу со строковым атрибутом, работает без каких-либо проблем:

>>> class a:
    string = ''


>>> x = a()
>>> y = a()
>>> x.string += 'x'
>>> y.string += 'y'
>>> x.string
'x'
>>> y.string
'y'

Итак, чтобы суммировать: атрибуты класса становятся атрибутами экземпляра тогда и только тогда, когда им присваивается значение после создания, в методе __init__ или нет. Это хорошо, потому что таким образом вы можете иметь статические атрибуты, если никогда не присваиваете значение атрибуту после создания экземпляра.

1
задан Jeeped 24 August 2015 в 19:25
поделиться

3 ответа

CreateObject создает новый объект. Если я правильно понял ваш вопрос, вы хотите подключиться к уже запущенным (потерянным) процессам Excel, чтобы их прервать. Вы можете сделать это с помощью GetObject:

On Error Resume Next
Do
  Set xl = GetObject(, "Excel.Application")
  status = Err.Number
  If status = 0 Then
    For Each wb in xl.Workbooks
      wb.Close False  'discard changes in open workbooks
    Next
    xl.Quit
  ElseIf status <> 429 Then
    WScript.Echo Err.Number & ": " & Err.Description
    WScript.Quit 1
  End If
Until status = 429
On Error Goto 0

Обратите внимание, что это попытается закрыть все запущенные экземпляры Excel, отменив все изменения в открытых книгах. Если вы хотите сохранить изменения в открытых книгах, измените аргумент метода Close на True. Если у вас есть экземпляры Excel, которые вы хотите продолжать работать, вам нужно добавить код, чтобы исключить их из закрытия.

Обратите также внимание, что это не приведет к принудительному прекращению действия невосприимчивых экземпляров. Вам нужно будет убить этот процесс:

Set wmi = GetObject("winmgmts://root/cimv2")
For Each xl In wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'excel.exe'")
  xl.Terminate
Next
3
ответ дан Ansgar Wiechers 26 August 2018 в 06:08
поделиться

Попробуйте это пожалуйста.

ThisWorkbook.Saved = True
Application.Quit
0
ответ дан Barry Guvenkaya 26 August 2018 в 06:08
поделиться

CreateObject создает COM-объект, поэтому ваш

Set MyApp = CreateObject("Excel.Application") 

запускает новый процесс Excel. Используйте GetObject для «получения существующего объекта с указанным ProgID». См. это для теории и практики.

0
ответ дан Community 26 August 2018 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: