Excel VBA功能可识别只读模式

时间:2017-06-01 12:07:01

标签: excel vba excel-vba

我正在使用一些代码打开另一个文件来获取数据。 这使用了我在某处调用IsWorkBookOpen的函数来检查文件是否已经打开。 下面的代码效果很好,但我试图让它在只读模式下工作。

我想要做的只是在只读模式下打开文件。 所以更新 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

IsWorkBookOpen功能代码:

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

我想知道一种修改IsWorkBookOpen以处理只读模式的方法。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

这样的东西可以工作(不需要额外的引用),并会告诉您应用程序是否打开工作簿,以及工作簿是否只读。默认情况下,如果工作簿处于打开状态,该函数将仅返回true,并且是只读的。

x = fread('gunzip -cq test/allRequests.csv.gz')