Excel 我应该如何格式化OneDrive文件路径,以便Open()或FSO.OpenTextFile打开它?

Excel 我应该如何格式化OneDrive文件路径,以便Open()或FSO.OpenTextFile打开它?,excel,vba,onedrive,Excel,Vba,Onedrive,我试图在内存中的OneDrive上锁定一个小的虚拟文本文件,方法是以读/写方式打开它,这样我就可以独占访问另一个打开的共享xlsm中的一些共享Excel表。在进行必要的修改后,我将关闭该文件以允许其他用户锁定它,并在必要时修改共享xlsm Open和FSO.OpenTextFile命令在本地文件上按预期工作。但是,使用“…”文件路径,我无法使这两种方法都起作用。它们抛出一个运行时错误 工作簿。Open可以处理此类路径名(我自己阅读并测试过),但我不希望在Excel中打开该文件,只希望在操作系统级

我试图在内存中的OneDrive上锁定一个小的虚拟文本文件,方法是以读/写方式打开它,这样我就可以独占访问另一个打开的共享xlsm中的一些共享Excel表。在进行必要的修改后,我将关闭该文件以允许其他用户锁定它,并在必要时修改共享xlsm

OpenFSO.OpenTextFile命令在本地文件上按预期工作。但是,使用“…”文件路径,我无法使这两种方法都起作用。它们抛出一个运行时错误

工作簿。Open可以处理此类路径名(我自己阅读并测试过),但我不希望在Excel中打开该文件,只希望在操作系统级别将其锁定在内存中,直到完成修改

Public Sub GetExclusiveAccess()

Dim fso As FileSystemObject
Dim txtStream As TextStream
Dim filepath As String
Dim PathDelimiter As String

PathDelimiter = IIf(InStr(ThisWorkbook.Path, "//") > 0, "/", "\")
filepath = ThisWorkbook.Path & PathDelimiter & "filelock.txt"

' First method

Set fso = New FileSystemObject
'On Error Resume Next
Set txtStream = fso.OpenTextFile(filepath, ForWriting, False)
'On Error GoTo 0
If txtStream Is Nothing Then GoTo Error
'Success...
txtStream.Close

' Second method

Open filepath For Output As #1
'Success...
Close #1

Error:

End Sub

我知道您想建立与我完全相同的设置。
我建议改为读写文件锁定文本文件。
文件可能会被卡住,在应该关闭的时候无法关闭,但根据我的经验,更改内容更安全

我有一个文本文件,上面写着“打开”或“关闭”,这取决于它将打开共享数据库文件的值

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(TXT_File_Path, 1)
Contents = objFile.ReadLine
DoEvents
objFile.Close

if Contents = "Open" then
    ' output error
else
    ' open file

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.CreateTextFile(TXT_File_Path)

    objFile.WriteLine "Open" ' write open in the text file
    objFile.Close

    Set FSO = Nothing
    Set oFile = Nothing


    ' do your stuff


    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.CreateTextFile(TXT_File_Path)

    objFile.WriteLine "Closed" ' write Closed in the text file
    objFile.Close

    Set FSO = Nothing
    Set oFile = Nothing
end if
我相信我在Microsoft帮助页面上也找到了一个名为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
如果工作簿(Excel)处于打开或关闭状态,则返回true/false。
但我主要依赖文本文件,因为它速度更快,可以保存额外的信息(我上次打开时就是这么做的)


我还建议您更改为xlsb文件,因为它们比xlsm更快。像这样的数据库文件需要打开和关闭很多次,当文件通过网络仅达到2 MB左右时,这将花费很长时间。

据我所知,您无法按照描述的方式锁定文本文件。记事本不会注意到其他人打开了该文件。是您需要更改其中内容的实际文本文件,还是另一个文件?否,每个用户都打开了自己的code.xlsm和共享的data.xlsm。我需要修改data.xlsm。我用一个本地文件(“C:\Test\filelock.txt”)尝试了我的代码,但代码没有抛出运行时错误。在调试模式下,我切换到Windows资源管理器窗口并尝试删除本地文件,但由于从Excel打开而被拒绝。这就是我所期望的。实际上,我并没有试图从另一台计算机上删除它,以测试我是否会得到同样的拒绝。请尝试路径的UNC版本:谢谢您提供的详细答案。iWorkBookOpen是我到现在为止还没有遇到过的一个版本。也谢谢你。文件的“打开”/“关闭”内容也很好!不过有一两点。。。。我的data.xlsm文件始终处于打开状态,我不打开/关闭它。我的应用程序一直从中读取数据。有时,用户必须编辑某些字段或将记录附加到表中。追加操作是阻止其他人同时修改它的更深层次的需要。新记录需要获得一个顺序记录ID,该ID将在该阶段计算。另一件事是我的主要问题,当文件路径是OneDrive URL时,如何在内存中打开该文件。您使用Set-objFSO=CreateObject(“Scripting.FileSystemObject”)Set-objFile=objFSO.OpenTextFile(TXT\u File\u Path,1),在我的情况下会引发错误。您不能在工作区使用网络驱动器吗?SharePoint、onedrive等通常很难在Excel中使用。如果其他人想写入文件,你怎么能一直打开该文件?Excel只允许一个人同时写入文件。不确定我是否了解完整的设置。此应用程序适用于不同站点的两个用户,我正在探索利用OneDrive的共享访问/更新功能和Excel AutoSave的可能性。如果这被证明是不可行的,我将不得不求助于某种类型的打开/关闭只读/读写设置,正如你已经提到的,这不是很有效。我将我的理论付诸于测试,它按照我的想法工作。当我从台式机和笔记本电脑的OneDrive中打开data.xlsm时(这不是LAN连接,因为我的笔记本电脑在一个离散的子网上使用WiFi,流量通过Internet传输),我可以看到两台机器上的同一工作表上有两个光标移动,对其中一个所做的任何更改都会复制到另一个(AutoSave=on)。MS在单元格的基础上进行同步更改,因此非常有效。我认为如果我将data.xlsm拆分为更小的数据文件和更少的工作表,效果会更好。