使用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" /dderegistry项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如下:

  1. 首先创build虚拟实例,不需要添加工作簿。 之后,虚拟实例暴露出一个Excel文件,由用户在其中打开。
  2. 创build目标实例。
  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 

尝试打开文件,你会得到所需的输出:

打开只读并通知

脚本结束后的通知:

开放读写

奇怪的是,你没有得到如下的消息:

在这里输入图像描述

一种可能的方法是

  • 要在代码的开始和结尾更改文件属性,下面的版本使文件只读隐藏
  • 进行更改
  • 用不同的名字保存文件
  • 改回属性
  • 将更改后的文件重命名为原始名称

 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