使用VBScript以独占模式打开Excel文件
我有一个简单的问题,但我已经find了这个,找不到任何有用的主题..
我正在打开一个Excel文件,并修改了一些东西的VBScript的工作..所以我使用这个代码:
Set objXLApp = CreateObject("Excel.Application") objXLApp.Visible = False objXLApp.DisplayAlerts = False Set objXLWb = objXLApp.Workbooks.Open(FilePath)
现在,我想要做的是使用locking文件的方式打开Excel文件,并防止用户在脚本打开时打开它(直到closures)。
更新:
我认为这个问题与Excel实例有某种关系,我试图做到以下几点(当文件被脚本打开时):
- 当我手动打开文件(当它被脚本打开时),它们都变成了一个单一的实例。
- 当我打开任何其他的Excel文件,他们都成为一个单一的实例! 原始文件(由脚本打开)变得可见!
现在这很奇怪,因为我使用的是CreateObject("Excel.Application")
而不是GetObject(, "Excel.Application")
在Win 7 Excel 2010中有默认值为"C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" /dde
registry项HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command
。 命令行/dde
开关启用DDE(dynamic数据交换机制 – 古老的Win 3.0进程间通信方法),强制Excel在单个实例中启动。 我试图删除该开关,并打开工作簿,但无济于事。 顺便说一句,如果你没有编辑registry的权限,或者你打算把脚本分发给不是的人,那是不行的。 也试过这个答案 ,但它不适用于Win 7 Office 2010。
我已经testing了启用DDE的test.xlsm
文件。 当用户打开文件时,实际上只是在现有的实例中重新打开,使其可见。 如果脚本已经做出任何更改,则Excel提醒:
无论如何,写入访问是为用户提供的。 之后当脚本保存文件时,会出现另一个警报:
前一段时间我创build了一个可以与Excel应用程序一起工作的脚本,并且遇到了与Win 7 Excel 2010相同的问题。 我注意到,如果在脚本中使用CreateObject()
创build了多个Excel应用程序实例,那么用户打开的Excel文件总是使用第一个创build的实例。 我已经通过创buildExcel应用程序的两个不可见实例来解决这个问题,比方说虚拟和目标。 概述一个脚本的algorithm如下:
- 首先创build虚拟实例,不需要添加工作簿。 之后,虚拟实例暴露出一个Excel文件,由用户在其中打开。
- 创build目标实例。
- 退出虚拟实例。
- 打开目标工作簿,修改并保存它。
- 退出目标实例。
考虑下面的代码,说明实现你所需要的一种可能的方法:
' 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
尝试打开文件,你会得到所需的输出:
脚本结束后的通知:
奇怪的是,你没有得到如下的消息:
一种可能的方法是
- 要在代码的开始和结尾更改文件属性,下面的版本使文件只读和隐藏
- 进行更改
- 用不同的名字保存文件
- 改回属性
- 将更改后的文件重命名为原始名称
码
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