2014-06-08 135 views
4

我正在爲將在網絡上使用它的公司編寫一些代碼。我沒有像他們的網絡那樣能夠測試,所以我正在檢查以確保代碼第一次正確!與其他用戶打開的Excel VBA文件

工作簿將它們以各種方式網絡上的其他工作表進行交互,而且基本上我需要能夠檢查:

  1. 目標工作簿已經是他們自己的系統上打開,並 理想:
    • 無論是在同一個Excel實例打開,或
    • 無論是在一個單獨的實例開放(我相信這可能 需要複製和粘貼的範圍不同的動作,節省了等 ,我需要更多地瞭解)
  2. 目標工作簿是由其他網絡用戶開放(此推斷它會只開放爲)只讀

我遇到很多關於檢查工作簿是否已經打開的內容,例如:http://support.microsoft.com/kb/291295

但是我還沒有發現任何明顯區分上述兩種場景的內容。

謝謝

更新

我現在使用:

Function IsFileOpenInInstance(FileName As String) 
Dim ShortFileName As String 
Dim ValidOpenFile As Boolean 
Dim ErrNum As Integer 
On Error Resume Next 
ShortFileName = Dir(FileName) 
If FileName = Workbooks(ShortFileName).FullName Then ValidOpenFile = True 
ErrNum = Err 
On Error GoTo 0 
If ErrNum <> 0 Then 
    IsFileOpenInInstance = False 
Else 
    IsFileOpenInInstance = ValidOpenFile 
End If 
End Function 
+0

感謝您的回覆。我無法找到您發送的鏈接中的相關代碼。讓我困惑一點! – iambasil

回答

0
  1. 由於Excel宏是如何解決的,單一實例中的Excel工作簿是由不合格的區別名稱(沒有完整路徑的文件名)。

    嘗試訪問Workbooks("File Name.xls")以查看工作簿是否在當前實例中加載,如果是,請檢查FullName以查看它是否確實是正確的。

    無論是否在不同的實例中打開兩個工作簿,它在操作方面都沒有區別。但是,獲取指向另一個實例的指針可能會有問題,我不建議這樣做(例如,如果調用GetObject("File Name.xls"),它可以返回您的Excel實例,而不是另一個,即使您沒有打開該文件) 。您應該假設所有必需的工作簿都在相同的實例中打開。

  2. 無論您還是其他用戶打開工作簿,這都沒有什麼不同。如果您嘗試在另一個Excel實例中打開相同的工作簿,它會告訴您它被阻止的方式與其他人打開方式相同。

+0

(2)是正確的,但我認爲羅勒想區分由同一用戶或其他人打開的文件。在(1)上,如果您知道工作簿名稱,可以使用'GetObject'來掛接已打開此工作簿的實例。 – brettdj

+0

@brettdj據我所知,(2)的要點是,當另一個用戶打開一個文件時,它變爲只讀。這是真的,但是如果你打開文件,它也變成只讀文件,所以從只讀的角度來看,打開文件的人並不重要。至於'GetObject',它可以返回任一實例,事實上,當我測試它時,它返回了我調用它的實例,而不是那個打開文件的實例。這與您鏈接的代碼不同,您可以從腳本中調用GetObject,而不是從Excel實例中調用GetObject。 – GSerg

+0

是的,它將是隻讀的,但大概是OP想要區分本地只讀和網絡只讀,因爲打開的操作過程是不同的。在你的GetObject測試中,你使用了完整的路徑名(示例[here](http://stackoverflow.com/questions/20849853/running-code-from-vba-to-vbscript-back-to-vba)?) – brettdj

相關問題