使用 VBScript 以独占模式打开 Excel 文件
Open an Excel file in exclusive mode using 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")
很奇怪,您没有收到如下消息:
一种可能的方法是
- 更改代码开头和结尾的文件属性,以下版本使文件只读和隐藏
- 进行更改
- 用不同的名称保存文件
- 改回属性
- 将更改后的文件重命名为原来的名称
代码
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
我在 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 警报:
无论如何,写访问权都给了用户。之后,当脚本保存文件时,会出现另一个警告:
前段时间我创建了一个与 Excel 应用程序一起使用的脚本,并且在 Win 7 Excel 2010 中遇到了与您描述的相同的问题。我注意到如果在脚本中有多个 Excel 使用 CreateObject()
创建的应用程序实例,那么用户打开的 Excel 文件总是使用第一个创建的实例。我通过创建 Excel 应用程序的两个不可见实例解决了这个问题,比方说虚拟和目标。大纲脚本的算法如下:
- 首先创建虚拟实例,无需添加工作簿。之后,虚拟实例会暴露一个 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
尝试打开文件,您将获得所需的输出:
以及脚本结束后的通知:
我有一个简单的问题,但我搜索了这个但找不到任何有用的主题..
我正在开发一个 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")
很奇怪,您没有收到如下消息:
一种可能的方法是
- 更改代码开头和结尾的文件属性,以下版本使文件只读和隐藏
- 进行更改
- 用不同的名称保存文件
- 改回属性
- 将更改后的文件重命名为原来的名称
代码
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
我在 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 警报:
无论如何,写访问权都给了用户。之后,当脚本保存文件时,会出现另一个警告:
前段时间我创建了一个与 Excel 应用程序一起使用的脚本,并且在 Win 7 Excel 2010 中遇到了与您描述的相同的问题。我注意到如果在脚本中有多个 Excel 使用 CreateObject()
创建的应用程序实例,那么用户打开的 Excel 文件总是使用第一个创建的实例。我通过创建 Excel 应用程序的两个不可见实例解决了这个问题,比方说虚拟和目标。大纲脚本的算法如下:
- 首先创建虚拟实例,无需添加工作簿。之后,虚拟实例会暴露一个 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
尝试打开文件,您将获得所需的输出:
以及脚本结束后的通知: