2017-06-01 338 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