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

标签 excel vba onedrive

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

OpenFSO.OpenTextFile 命令在本地文件上按预期工作。但是,我无法使用“https://d.docs.live.net/ .....”文件路径工作。它们抛出运行时错误。

Workbooks.Open 可以处理此类路径名(正如我自己阅读和测试的那样 in another SO post )但我不想在 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

最佳答案

我看到你想要构建与我完全相同的设置。
我建议改为读取和写入文件锁定文本文件。
文件可能会卡住而不是在应该关闭的时候关闭,但根据我的经验,更改内容更安全。

我有一个文本文件,其中包含单词“open”或“closed”,具体取决于它将打开共享数据库文件的值。

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) 打开或关闭,这将返回真/假。
但我主要依赖文本文件,因为它更快并且可以保存额外的信息(我的是最后打开的)。

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

关于excel - 我应该如何格式化 OneDrive 文件路径以便 Open() 或 FSO.OpenTextFile 打开它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58803112/

相关文章:

excel - 如何在 Excel 中将 "3 days"转换为 "3"?

winapi - 如何检测 OneDrive 仅在线文件

excel - 访问onedrive的工作簿时找不到Microsoft Graph API资源

javascript - 将文件上传到skydrive

excel - 如何在 MAC 上使用 VBA 从 Excel 16 打开工作簿?

java - 使用 Apache POI 3.14 获取 Excel 中公式的计算值

date - VBA自动过滤器在Excel中按日期设置-不显示任何数据

python - 如何在 Pandas 中使用 read_excel 提高处理速度?

excel - 如何避免在 Excel VBA 中使用 Select

excel - 在excel中随机值组合