Откройте файл 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 предупреждает:

changes to be discarded

в любом случае доступ на запись предоставляется пользователю. После этого, когда скрипт сохранит файл, появится другое предупреждение появляется:

file already exists

некоторое время назад я создал сценарий, который работал с приложением Excel, и столкнулся с той же проблемой с Win 7 Excel 2010, как вы описываете. Я заметил, что если было несколько экземпляров приложения Excel, созданных с помощью CreateObject() в скрипте, затем файл Excel, открытый пользователем, всегда использовал именно первый созданный экземпляр. Я решил проблему, создав два невидимых экземпляра приложения Excel, скажем, dummy и цель. В общих чертах алгоритм для скрипта выглядит следующим образом:

  1. сначала создайте фиктивный экземпляр, не нужно добавлять книгу. После этого фиктивный экземпляр предоставляет файл Excel для открытия Пользователем в нем.
  2. создать целевой экземпляр.
  3. выйти из фиктивного экземпляра.
  4. откройте целевую книгу, измените и сохраните ее.
  5. выход из целевого экземпляра.

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

' 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

пытаясь открыть файл, вы получите желаемый результат:

open read-only and notify

и уведомление после завершения скрипта:

open read-write


что странно, что вы не получаете сообщение, как показано ниже:

enter image description here

одним из возможных методов было бы

  • изменить атрибуты файла в начале и конце кода, указанных ниже версии файла только для чтения и скрытый
  • внести изменения
  • сохраните файл с другим именем
  • изменить атрибуты назад!--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