Откройте файл Excel в эксклюзивном режиме с помощью VBScript
у меня простой вопрос, но я искал и не мог найти любые полезные темы..
Я работаю над VBScript, который открывает файл Excel и изменяет несколько вещей в нем.. поэтому я использую этот код:
Set objXLApp = CreateObject("Excel.Application")
objXLApp.Visible = False
objXLApp.DisplayAlerts = False
Set objXLWb = objXLApp.Workbooks.Open(FilePath)
Теперь, что я хочу сделать, это открыть файл Excel, используя способ, который блокирует файл и запрещает пользователю открывать его, пока он открыт скриптом (пока он не закрыт).
обновление:
Я думаю, что проблема как-то связана с экземплярами Excel, я попытался сделать следующее (пока файл открыт скриптом):
- Когда Я вручную открыть файл (хотя он открыт скриптом) они оба становятся одним экземпляром.
- когда я открываю любой другой файл Excel, они оба и станьте одним экземпляром!!! И исходный файл (открытый скриптом) становится видимым!
сейчас это странно, потому что Я использую CreateObject("Excel.Application")
, а не GetObject(, "Excel.Application")
2 ответов
ключ реестра HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command
на Win 7 Excel 2010 для меня значение по умолчанию "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" /dde
. Командная строка /dde
переключатель включает DDE (динамический механизм обмена данными - древний метод межпроцессной связи Win 3.0), который заставляет Excel запускаться в одном экземпляре. Я попытался удалить этот переключатель и открыл книги, но безрезультатно. Кстати, если у вас нет разрешения на редактирование реестра или вы собираетесь распространять свой сценарий кому-то, кто этого не делает, это не способ. Также пробовал ответ, но он не работает для Win 7 Office 2010.
Я проверил test.xlsm
файл с включенным DDE. Когда пользователь открывает файл, на самом деле он просто открывается в существующем экземпляре, который делает его видимым. Если какие-либо изменения уже были внесены скриптом, то Excel предупреждает:
в любом случае доступ на запись предоставляется пользователю. После этого, когда скрипт сохранит файл, появится другое предупреждение появляется:
некоторое время назад я создал сценарий, который работал с приложением Excel, и столкнулся с той же проблемой с Win 7 Excel 2010, как вы описываете. Я заметил, что если было несколько экземпляров приложения Excel, созданных с помощью CreateObject()
в скрипте, затем файл Excel, открытый пользователем, всегда использовал именно первый созданный экземпляр. Я решил проблему, создав два невидимых экземпляра приложения Excel, скажем, dummy и цель. В общих чертах алгоритм для скрипта выглядит следующим образом:
- сначала создайте фиктивный экземпляр, не нужно добавлять книгу. После этого фиктивный экземпляр предоставляет файл Excel для открытия Пользователем в нем.
- создать целевой экземпляр.
- выйти из фиктивного экземпляра.
- откройте целевую книгу, измените и сохраните ее.
- выход из целевого экземпляра.
рассмотрим ниже код, который иллюстрирует возможный способ чтобы реализовать то, что вам нужно:
' target file path
sPath = "C:\Users\DELL\Desktop\test.xlsm"
' create dummy instance
Set oExcelAppDummy = CreateObject("Excel.Application")
' create target instance
Set oExcelApp = CreateObject("Excel.Application")
' quit dummy instance
oExcelAppDummy.Quit
' open target workbook
With oExcelApp
.Visible = False
.DisplayAlerts = False
Set oWB = .Workbooks.Open(sPath)
End With
' make some changes and save
Set oWS = oWB.Sheets(1)
oWS.Cells(1, 1).Value = Now()
oWB.Save
' give additional time for test
MsgBox "Try to open test.xlsm, OK to end the script"
' close target workbook
oWB.Close
' quit target instance
oExcelApp.Quit
пытаясь открыть файл, вы получите желаемый результат:
и уведомление после завершения скрипта:
что странно, что вы не получаете сообщение, как показано ниже:
одним из возможных методов было бы
- изменить атрибуты файла в начале и конце кода, указанных ниже версии файла только для чтения и скрытый
- внести изменения
- сохраните файл с другим именем
- изменить атрибуты назад!--16-->
- переименовать измененный файл в исходное имя
код
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objXLApp = CreateObject("Excel.Application")
filePath = "C:\Temp\MyFile.xlsm"
filePath2 = "C:\Temp\MyFile1.xlsm"
set objFile = objFSO.GetFile(filePath)
objFile.Attributes = 3
objXLApp.Visible = False
objXLApp.DisplayAlerts = False
Set objxlWB = objXLApp.Workbooks.Open(filePath)
'do stuff
objxlWB.saveas filePath2
objxlWB.Close
objXLApp.Quit
set objXLApp = Nothing
objFile.Attributes = 32
objFile.Delete
objFSO.MoveFile filePath2, filePath