簡體   English   中英

使用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

對於我,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應用程序實例(例如,啞元和目標)解決了該問題。 概述中,腳本的算法如下:

  1. 首先創建虛擬實例,無需添加工作簿。 之后,該虛擬實例將暴露一個Excel文件,供用戶在其中打開。
  2. 創建目標實例。
  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

嘗試打開文件,您將獲得所需的輸出:

打開只讀並通知

腳本結束后的通知:

打開讀寫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM