Excel VBAfunction识别只读模式

我正在使用一些代码,打开另一个文件来获取数据。 这使用一个函数,我find了一个名为IsWorkBookOpen来检查文件是否已经打开。 下面的代码运行良好,但我试图使其工作在只读模式。

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

我已经尝试更新此代码以只读方式打开该文件,但macros不能识别该文件已打开(在只读模式),并尝试再次打开它。

 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 

IsWorkBookOpenfunction代码:

 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来处理只读模式。

像这样的东西可以工作(不需要额外的引用),并会告诉你工作簿是否被应用程序打开,以及工作簿是否只读。 默认情况下,只有工作簿处于打开状态,函数才会返回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 

请尝试以下内容,它将告诉您文件系统级别是否标记为只读,与应用程序以只读方式打开的文件不同。

 '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 

如果打开工作簿只读,我猜你的函数总是返回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