【问题标题】:vba check if a read-only workbook is openedvba 检查是否打开了只读工作簿
【发布时间】:2013-12-23 02:27:39
【问题描述】:

对于只读工作簿是否打开,我似乎无法获得明确的反馈。在我的代码中,我在关闭/保存工作簿后将其复制。如果只读工作簿被其他用户以只读方式打开,我希望能够覆盖该工作簿。我尝试了类似这段代码的东西,但没有运气,它只是一直说“文件未打开!”即使我打开它。 如何检查是否在 vba 中打开了“只读 .xlsx”文件?

Sub Test_If_File_Is_Open_2()

Dim wBook As Workbook

On Error Resume Next

Set wBook = Workbooks("C:\Users\" & Environ("username") & "\Documents\Dropbox\Systems\Open     Machine Schedule\Open Machine Schedule.xlsx")
If wBook Is Nothing Then 'Not open
MsgBox "File is Not open!"
Else 'It is open
MsgBox "File is Open!" 'Never get this to display when I have the excel file open

End If

End Sub

开始提示使用这段代码(上图)是因为我希望宏在只读工作簿被其他用户打开时不会导致错误。当我运行下面的宏并事先打开复制的只读工作簿时,出现错误:“vba 运行时错误 1004 无法访问只读文档” 关闭复制的工作簿时,我没有收到此错误,它会按预期覆盖它。 下面是提示这个问题的代码:

Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim backupfolder As String

backupfolder = "C:\Users\" & Environ("username") & "\Documents\Dropbox\Systems\Open Machine Schedule\"

ThisWorkbook.SaveAs Filename:=backupfolder & "Open Machine Schedule - Current.xlsx", FileFormat:=xlOpenXMLWorkbook
End Sub

Sub Auto_Save()

Dim savedate

savedate = Date

Dim savetime
savetime = Time
Dim formattime As String
formattime = Format(savetime, "hh.MM.ss")
Dim formatdate As String
formatdate = Format(savedate, "DD - MM - YYYY")


Application.DisplayAlerts = False

Dim backupfolder As String
backupfolder = "C:\Users\" & Environ("username") & "\Documents\Dropbox\Systems\Open Machine Schedule\"
ActiveWorkbook.Save
ActiveWorkbook.SaveAs backupfolder & "Open Machine Schedule - Current.xlsx", FileFormat:=xlOpenXMLWorkbook
SetAttr backupfolder & "Open Machine Schedule - Current.xlsx", vbReadOnly
Application.DisplayAlerts = True
MsgBox "Backup Run. Please Check at: " & backupfolder & " !"

End Sub

任何帮助/建议将不胜感激

【问题讨论】:

    标签: vba save readonly


    【解决方案1】:

    您的第一个代码只是测试工作簿是否存在而不是其状态。

    你可以改用这个:

    If wBook.ReadOnly Then
        MsgBox "File is Read-only"
    Else
        MsgBox "File is not read-only"
    End If
    

    【讨论】:

    • 我不想查看它是否是只读的,我确实将副本设置为只读版本。我知道这是一本只读的工作簿。我想知道是否有人打开了它,因为当它打开时,原始工作簿宏将不允许复制并覆盖复制的工作簿,直到它关闭。
    • @cheapkid1 没有 100% 安全的方法来“了解文件是否正在使用”,因为在您检查几毫秒后,该文件可能不再使用,反之亦然。相反,您只需打开文件并在没有异常的情况下使用它
    • 无需学习。我只是在测试用户在打开时不会收到错误,如果打开则退出宏。我什么也没做,只是关闭工作簿,如果打开了也不复制。 vba 知道它已打开,因为当我测试打开复制的工作簿并运行宏说它已打开且无法访问时,它给了我一个错误。下次保存原始工作簿并关闭复制的工作簿(两者都必须发生)时,只有这样宏才会覆盖复制的工作簿。
    • 为了测试用户不会收到错误,需要您的 VBA 了解文件是否正在使用......正如我所说,如果没有办法知道 100%文件正在使用或未使用。您最好的选择是让错误发生并添加错误处理以在错误发生时执行您想要的操作......
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2013-10-13
    相关资源
    最近更新 更多