[英]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實例有某種關系,我嘗試執行以下操作(當文件由腳本打開時):
現在這很奇怪,因為我使用的是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
對於我,Windows 7上有注冊表項HKEY_CLASSES_ROOT\\Excel.Sheet.8\\shell\\Open\\command
,默認值為"C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE" /dde
。 命令行/dde
開關啟用DDE(動態數據交換機制-一種古老的Win 3.0進程間通信方法),該功能強制Excel在單個實例中啟動。 我試圖刪除該開關並打開工作簿,但無濟於事。 順便說一句,如果您沒有編輯注冊表的權限,或者打算將腳本分發給沒有此權限的人,那是不可行的。 也嘗試過此答案 ,但不適用於Win 7 Office 2010。
我已經測試了啟用DDE的test.xlsm
文件。 當用戶打開文件時,實際上只是在現有實例中重新打開它使其可見。 如果腳本已經進行了任何更改,則Excel會發出警報:
無論如何,都會為用戶提供寫訪問權限。 之后,當腳本保存文件時,將顯示另一個警報:
不久前,我創建了一個可與Excel應用程序一起使用的腳本,並在Win 7 Excel 2010中遇到了與您所描述的相同的問題。 我注意到,如果腳本中使用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
嘗試打開文件,您將獲得所需的輸出:
腳本結束后的通知:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.