Excel VBA刷新以只读方式打开的文档

Excel VBA刷新以只读方式打开的文档,excel,vba,vbscript,Excel,Vba,Vbscript,是否可以刷新以只读方式打开的文档,这样,如果其他人以写入方式打开文档,它会显示自上次刷新以来所做的任何更新,但不会偏离活动工作表 我已经完成了前者,但当它重新打开时,它将转到上次保存之前打开的任何工作表 Sub refresh() Application.DisplayAlerts = False Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & "name.xls", ReadOnly:=True End

是否可以刷新以只读方式打开的文档,这样,如果其他人以写入方式打开文档,它会显示自上次刷新以来所做的任何更新,但不会偏离活动工作表

我已经完成了前者,但当它重新打开时,它将转到上次保存之前打开的任何工作表

Sub refresh()
    Application.DisplayAlerts = False
    Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & "name.xls", ReadOnly:=True
End Sub

谢谢

此代码包含在两个工作簿中

  • 它使用
    SheetActivate
    事件继续写入 主文件(上面示例中的name.xls)的当前工作表 log.txt文件
  • “控制器”工作簿用于:
    • 测试主文件是否打开
    • 如果是,则打开只读版本(如果不是,则正常打开实际文件),并且
    • 访问文件日志(其中存储最后一张工作表、windows登录名和当前时间,可能是过度使用)以设置最新的工作表
  • 注:
    1.我只能在本地计算机上通过在主文件上运行两个单独的Excel实例来测试这一点,因为Excel不会让同一个文件在同一实例中打开两次)
    2.我建议使用从桌面快捷方式执行的工作簿,而不是控制器工作簿

    更改此行以设置要测试是否打开的文件路径和名称
    StrFileName=“c:\temp\main.xlsm”

    待打开文档的代码:此工作簿模块

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
        Open ThisWorkbook.Path & "\log.txt" For Append As #1
        Print #1, Sh.Name & ";" & Environ("username") & ":" & Format(Now(), "dd-mmm-yy hh:mm")
        Close #1
    End Sub
    
    控制器工作簿代码:普通模块

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
        Open ThisWorkbook.Path & "\log.txt" For Append As #1
        Print #1, Sh.Name & ";" & Environ("username") & ":" & Format(Now(), "dd-mmm-yy hh:mm")
        Close #1
    End Sub
    
    我已更新了microsoft网站代码,以测试
    StrFileName
    是否已打开。如果它是打开的ElseWare,则只读版本将打开到最新页面

    Sub TestFileOpened()
        Dim Wb As Workbook
        Dim StrFileName As String
        Dim objFSO As Object
        Dim objTF As Object
        Dim strLogTxt As String
        Dim arrStr
    
        StrFileName = "c:\temp\main.xlsm"
        If Dir(StrFileName) = vbNullString Then
            MsgBox StrFileName & " does not exist", vbCritical
            Exit Sub
        End If
        If IsFileOpen(StrFileName) Then
            Set Wb = Workbooks.Open(StrFileName, , True)
            If Dir(Wb.Path & "\log.txt") <> vbNullString Then
                Set objFSO = CreateObject("Scripting.FileSystemObject")
                Set objTF = objFSO.OpenTextFile(Wb.Path & "\log.txt", 1)
                Do Until objTF.AtEndOfStream
                    strLogTxt = objTF.ReadLine
                Loop
                objTF.Close
                arrStr = Split(strLogTxt, ";")
                On Error Resume Next
                If Not IsEmpty(arrStr) Then
                    Wb.Sheets(arrStr(0)).Activate
                    If Err.Number <> 0 Then MsgBox arrStr(0) & " could not be activate"
                End If
                On Error GoTo 0
            End If
        Else
            Set Wb = Workbooks.Open(StrFileName)
        End If
    End Sub
    
    ' This function checks to see if a file is open or not. If the file is
    ' already open, it returns True. If the file is not open, it returns
    ' False. Otherwise, a run-time error occurs because there is
    ' some other problem accessing the file.
    
    Function IsFileOpen(filename As String)
        Dim filenum As Integer, errnum As Integer
        On Error Resume Next   ' Turn error checking off.
        filenum = FreeFile()   ' Get a free file number.
        ' Attempt to open the file and lock it.
        Open filename For Input Lock Read As #filenum
        Close filenum          ' Close the file.
        errnum = Err           ' Save the error number that occurred.
        On Error GoTo 0        ' Turn error checking back on.
        ' Check to see which error occurred.
        Select Case errnum
            ' No error occurred.
            ' File is NOT already open by another user.
        Case 0
            IsFileOpen = False
            ' Error number for "Permission Denied."
            ' File is already opened by another user.
        Case 70
            IsFileOpen = True
            ' Another error occurred.
        Case Else
            Error errnum
        End Select
    End Function
    
    子测试文件打开()
    将Wb设置为工作簿
    将StrFileName设置为字符串
    作为对象的Dim objFSO
    作为对象的Dim objTF
    Dim strLogTxt作为字符串
    暗色条纹
    StrFileName=“c:\temp\main.xlsm”
    如果Dir(StrFileName)=vbNullString,则
    MsgBox StrFileName&“不存在”,vbCritical
    出口接头
    如果结束
    如果IsFileOpen(StrFileName),则
    Set Wb=Workbooks.Open(StrFileName,True)
    如果Dir(Wb.Path&“\log.txt”)vbNullString,则
    设置objFSO=CreateObject(“Scripting.FileSystemObject”)
    设置objTF=objFSO.OpenTextFile(Wb.Path&“\log.txt”,1)
    直到objTF.AtEndOfStream
    strLogTxt=objTF.ReadLine
    环
    objTF,关闭
    arrStr=Split(strLogTxt,“;”)
    出错时继续下一步
    如果不是空的(arrStr),那么
    工作分解表(arrStr(0))。激活
    如果错误号为0,则MsgBox arrStr(0)&“无法激活”
    如果结束
    错误转到0
    如果结束
    其他的
    Set Wb=工作簿.打开(StrFileName)
    如果结束
    端接头
    '此函数检查文件是否打开。如果文件是
    '已打开,返回True。如果文件未打开,它将返回
    ”“错。否则,会发生运行时错误,因为存在
    '访问该文件时遇到其他问题。
    函数IsFileOpen(文件名为字符串)
    Dim filenum为整数,errnum为整数
    “错误恢复下一步”关闭错误检查。
    filenum=FreeFile()'获取一个自由文件号。
    '尝试打开并锁定该文件。
    打开输入锁的文件名,读取为#filenum
    Close filenum'关闭文件。
    errnum=Err'保存发生的错误号。
    在错误转到0'时,重新启用错误检查。
    '检查发生的错误。
    选择Case errnum
    '没有发生错误。
    '文件尚未由其他用户打开。
    案例0
    IsFileOpen=False
    “权限被拒绝”的错误号
    '文件已由其他用户打开。
    案例70
    IsFileOpen=True
    '发生了另一个错误。
    其他情况
    错误errnum
    结束选择
    端函数
    
    我将此解决方案无限期搁置,因为要实现它需要大量的工作才能获得准确的结果。无论我是否决定使用它,我都很感激你的帮助。