如何避免与IsWorkBookOpen的自我引用
我想在服务器上使用共享的excel工作簿,这些工作簿将以各种方式相互连接。
我花了很多天的时间才发现它有许多问题需要处理,因为共享工作簿不支持许多function。
- 我想让macros检查打开文件,看看这个文件是否被其他人打开,如果是“是”,它会告诉人以后再回来。
- 不幸的是,我现在正在引用自己,这造成了一个循环。
- 我打开文件,它自己检查它已经打开,然后closures它的消息。
你能帮我逃避这个循环,以便达到目的吗?
我相信只有代码的上半部分涉及到我的问题,所以我不把它全部发布:
Option Explicit Private Sub Workbook_Open() Dim Ret Ret = IsWorkBookOpen(ThisWorkbook.FullName) If Ret = True Then MsgBox "Come back later." ThisWorkbook.Close savechanges:=False End If End Sub
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
我不认为你需要使用这个function来达到你的目的。
您可以使用以下方式实际检查文件的状态:
ThisWorkbook.ReadOnly
它返回一个布尔值; 如果文件是只读的,则为true。
现在,在打开文件之前,你真的不能禁止popup询问你是否打开它只读或不。 但是,你仍然可以尝试把这个代码一旦用户打开文件作为只读触发。
Private Sub Workbook_Open() If ThisWorkbook.ReadOnly Then MsgBox "Comeback some other time. File in use" ThisWorkbook.Close False End If End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.Quit End Sub
与ReadOnly
testing相比, IsWorkBookOpen
方法的IsWorkBookOpen
是与通过networking打开工作簿相比的速度更快。
我build议你改变你的方法来加载从vbs
,或单独的Excel文件检查 – 因为这是最好的方法。
- 下面的代码可以保存在你的networking驱动器上的记事本中,比如check.vbs 。 代码检查文件是否打开,如果不是,则在Excel的新实例中启动文件。 如果是,则提供消息。
vbs代码
Dim objExcel FileName = "C:\temp\file.xlsm" If Not IsWorkBookOpen(FileName) Then Set objExcel = CreateObject("Excel.Application") Set ojbWb = objExcel.Workbooks.Open(FileName) objExcel.Visible = True Else wscript.echo FileName & " already opened" End If Function IsWorkBookOpen(FileName) Set oFSO = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set objFile = oFSO.OpenTextFile(filename, 8, False) ErrNo = Err ObjFile.Close On Error GoTo 0 Select Case ErrNo Case 0: IsWorkBookOpen = False Case 70: IsWorkBookOpen = True Case Else: Error ErrNo End Select set objFSO = Nothing End Function
-
如果要从实际文件运行检查,则需要更改为
ReadOnly
testing码
Private Sub Workbook_Open()
If Me.ReadOnly Then MsgBox "file already opened", vbCritical
End Sub
我发布这个,因为我也看到这个问题也没有回答在其他论坛上。
我想在服务器上使用许多共享的excel工作簿,这些工作簿将以各种方式相互连接。
我想使用所谓的共享工作簿,所以每个人都可以访问它,特别是因为它会跟踪(用户,时间,…)内的变化,
我想让macros检查打开文件,看看这个文件是否被其他人打开,如果是“是”,它会告诉人以后再回来。
build议的答复在这里不能帮助,我相信没有机会为文件本身的path创build一个macros,以便IsWorkBookOpen(ThisWorkbook.FullName)可以以我尝试的方式使用。
我决定编写macros来跟踪工作簿中的变化,就好像它是“共享的”。 通过这种方式,我能够“取消共享”,并使用这里讨论的ReadOnly方法。