Похоже, вы не установили Option Explicit
- поместите его в первую строку, и это поможет вам избежать ошибок. (С его помощью компилятор заставит вас объявлять все ваши переменные. Это также будет означать, что когда вы вставите его, ваш код не будет работать, если вы не объявите все переменные.)
Первая проблема:
Set xlApp = CreateObject("Excel.Application")
Set MyXL = GetObject(, "Excel.Application")
Сначала вы создаете новый экземпляр Excel с CreateObject
и сохраняете ссылку на него в xlApp
(который впоследствии не используете). Затем вы пытаетесь получить ссылку на существующий экземпляр Excel с GetObject
и сохранить его ссылку в MyXL
. Это работает только надежно, потому что вы сначала создаете новый экземпляр. В противном случае вы не могли бы гарантировать, что всегда доступен экземпляр Excel.
Проблема связана с тем, что вы не отпускаете / не закрываете эти экземпляры. Если вы создаете экземпляр Excel, вам нужно закрыть его с помощью xlApp.Quit
после того, как вы его закончили, в противном случае он будет задерживаться.
Будьте осторожны с экземплярами, которые вы установили с помощью GetObject
- вызов MyXL.Quit
закроет экземпляр независимо от того, какие другие рабочие книги открыты в это время.
Точно так же, если вы открываете файл таким образом, вы должны обязательно закрыть его впоследствии. В противном случае вы столкнетесь с проблемой, с которой вы столкнулись: запись защищенных файлов.
Итак, чтобы исправить вашу проблему: закройте все открытые экземпляры Excel (лучше всего это делать через диспетчер задач, так как некоторые из них могут быть невидимыми). Затем настройте свой код, чтобы использовать только одну ссылку на Excel.Application
. И, наконец, убедитесь, что .Close
книга была сохранена после ее сохранения и .Quit
ваш экземпляр Excel. Надеюсь, это должно предотвратить повторное появление ошибки.
'Dim xlApp As Excel.Application ' early-bound declaration
'Set xlApp = New Excel.Application ' early-bound assignment
Dim xlApp As Object ' late-bound declaration
Set xlApp = CreateObject("Excel.Application") ' late-bound assignment
'Dim wb As Workbook ' early-bound declaration
Dim wb as Object
Set wb = xlApp.Workbooks.Open(FPath)
' stuff you want to do with the workbook
wb.Close SaveChanges:=True
xlApp.Quit
Если вы можете добавить ссылку на объектную модель Excel в своем проекте VBA на Catia (не уверены в этом), вы можете закомментировать строки с поздними границами и использовать вместо них строки с ранними границами. Таким образом, вы получаете очень полезный IntelliSense для объектов Excel. Что делает код намного проще.