如何避免与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 

ReadOnlytesting相比, IsWorkBookOpen方法的IsWorkBookOpen是与通过networking打开工作簿相比的速度更快。

我build议你改变你的方法来加载从vbs ,或单独的Excel文件检查 – 因为这是最好的方法。

  1. 下面的代码可以保存在你的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 
  1. 如果要从实际文件运行检查,则需要更改为ReadOnlytesting

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方法。