使用VBScript以独占模式打开Excel文件

时间:2016-03-15 18:44:31

标签: excel excel-vba vbscript com dde vba

我有一个简单的问题,但我已经搜索过这个问题,但却找不到任何有用的话题。

我正在使用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 个答案:

答案 0 :(得分:2)

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

enter image description here

一种可能的方法是

  • 要更改代码开头和结尾的文件属性,下面的版本会使文件 readonly 隐藏
  • 进行更改
  • 使用其他名称保存文件
  • 更改属性
  • 将更改的文件重命名为原始名称

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

答案 1 :(得分:2)

Win 7 Excel 2010上有注册表项HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\command,默认值为"C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" /dde。命令行/dde开关启用DDE(动态数据交换机制 - 一种古老的Win 3.0进程间通信方法),强制Excel在单个实例中启动。我试图删除该开关并打开工作簿,但无济于事。顺便说一句,如果您没有编辑注册表的权限,或者您打算将脚本分发给没有注册的人,那么这不是一种方法。也尝试了this answer,但它对Win 7 Office 2010并不起作用。

我已经在启用了DDE的情况下测试了test.xlsm文件。当用户打开文件时,实际上它只是在现有实例中重新打开,使其可见。如果脚本已经进行了任何更改,则Excel会发出警报:

changes to be discarded

无论如何,为用户提供了写访问权限。之后,当脚本保存文件时,会出现另一个警告:

file already exists

前段时间我创建了一个与Excel应用程序一起使用的脚本,并且遇到了与您描述的Win 7 Excel 2010相同的问题。我注意到如果在脚本中使用CreateObject()创建了多个Excel应用程序实例,则用户打开的Excel文件始终使用的是第一个创建的实例。我通过创建两个不可见的Excel应用程序实例解决了这个问题,让我们说虚拟和目标。概括地说,脚本的算法如下:

  1. 首先创建虚拟实例,无需添加工作簿。之后,虚拟实例将暴露出一个Excel文件,由用户在其中打开。
  2. 创建目标实例。
  3. 退出虚拟实例。
  4. 打开目标工作簿,修改并保存。
  5. 退出目标实例。
  6. 考虑以下代码,说明实现所需内容的可能方式:

    ' 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