2017-06-01 250 views
0

我正在使用一些代碼打開另一個文件來獲取數據。 這使用一個函數,我找到了一個叫做​​的地方來檢查文件是否已經打開。 下面的代碼運行良好,但我試圖讓它在只讀模式下工作。Excel VBA函數識別只讀模式

我想要做的只是以只讀模式打開文件。 所以更新 Workbooks.Open FileName:="R:\Development\Copy of Product Information.xlsm", ReadOnly:=True, Password:="bcd"

我曾嘗試更新此代碼中讀打開文件而已,但宏不識別該文件已經打開(只讀模式),並試圖再次打開它。

Ret = IsWorkBookOpen("R:\Development\Copy of Product Information.xlsm") 
If Ret = True Then 
      Workbooks("Copy of Product Information.xlsm").Activate 
      Sheets("Main").Select 
Else 
     Workbooks.Open FileName:="R:\Development\Copy of Product Information.xlsm", Password:="bcd" 
     Sheets("Main").Select 
End If 

的​​功能代碼:

Function IsWorkBookOpen(FileName As String) 
    Dim ff As Long, ErrNo As Long 

    On Error Resume Next 
    ff = FreeFile() 
    Open FileName For Input Lock Read As #ff 
    Close ff 
    ErrNo = Err 
    On Error GoTo 0 

    Select Case ErrNo 
    Case 0: IsWorkBookOpen = False 
    Case 70: IsWorkBookOpen = True 
    Case Else: Error ErrNo 
    End Select 
End Function 

我想知道的方式來修改​​處理只讀模式,請。

回答

0

像這樣的東西就可以了(無需額外的引用),並會告訴你簿是否是由應用程序打開,是否工作簿是隻讀的。默認情況下,只有工作簿處於打開狀態,該函數纔會返回true,並且是隻讀的。

Function IsWorkBookOpen(ByVal FileName As String) As Boolean 
    Dim TargetWorkbook As Workbook 

    Dim IteratorWorkbook As Workbook 
    For Each IteratorWorkbook In Application.Workbooks 
     If IteratorWorkbook.FullName = FileName Then 
      Set TargetWorkbook = IteratorWorkbook 
     End If 
    Next 

    If Not TargetWorkbook Is Nothing Then 
     If TargetWorkbook.ReadOnly Then 
      IsWorkBookOpen = True 
      Exit Function 
     End If 
    End If 
End Function 
+0

循環找不到XLA/XLAM工作簿。您的字符串比較是二進制比較。您的'TargetWorkbook'設置完成後,您可以立即退出循環。 「ReadOnly」屬性只會告訴您Excel是否以只讀方式打開文件,而不是文件是否具有隻讀屬性。 – ThunderFrame

1

如果您打開工作簿只讀,我猜你的函數總是返回false,除非其他進程或用戶打開文件。如果你只需要檢查,如果工作簿是在當前Excel會話打開,你可以只使用類似:

Function IsWorkbookOpen(sWbName As String) As Boolean 
    Dim oWb As Workbook 
    On Error Resume Next 
    Set oWb = Workbooks(sWbName) 
    IsWorkbookOpen = (Err.Number = 0) 
End Function 
+0

我試過這段代碼,但是使用這個函數宏沒有意識到文件已經打開。我已經使用了其他解決方案之一 – Jeanclaude

+0

我提到了限制:只需檢查當前Excel會話中是否打開文件。請注意:函數期望的參數只是文件名,沒有路徑。 – jkpieterse

+0

好的,感謝您的解決方案和意見,我已upvoted您的答案。 – Jeanclaude

2

嘗試以下,它會告訴你,如果一個文件被標記爲只讀的文件系統級別,這與應用程序以只讀方式打開的文件不同。

'Add a reference to Microsoft Scripting Runtime 

Function FileIsReadOnly(filePath As String) As Boolean 

    Dim fso As Scripting.FileSystemObject 
    Set fso = New Scripting.FileSystemObject 

    Dim fil As Scripting.File 
    Set fil = fso.GetFile(filePath) 
    FileIsReadOnly = fil.Attributes And ReadOnly 

End Function