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

标签 excel vba

是否可以刷新以只读方式打开的文档,以便如果其他人将其打开以进行写入,它会显示自上次刷新以来所做的所有更新,但不会偏离事件工作表?

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

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

谢谢

最佳答案

此代码进入两个工作簿

  1. 它使用 SheetActivate 事件持续写入日志 主文件的当前工作表(上面示例中的 name.xls) log.txt 文件
  2. “ Controller ”工作簿用于:
    • 测试主文件是否打开,
    • 如果是,则打开只读版本(如果不是,则正常打开实际文件),并且
    • 访问文件日志(逐渐存储最后一个工作表、Windows 登录名和当前时间 - 可能有点过分) 来设置最新的工作表。

注意:
1.我只能通过在主文件上运行两个单独的 Excel 实例来在本地计算机上进行测试,因为 Excel 不会让同一个文件在同一实例中打开两次)
2. 我建议使用 而不是 Controller 工作簿从桌面快捷方式执行

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

要打开的文档的代码:ThisWorkbook 模块

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

Controller 工作簿代码:普通模块

我已更新 Microsoft 网站代码以测试 StrFileName 是否已打开。如果它是打开的,则打开到最新页面的只读版本

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

关于Excel VBA刷新以只读方式打开的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8663633/

相关文章:

excel - 在 Sub VBA 中调用用户定义的函数

excel,其他选项卡中的条件格式

excel - 查找特定列值集中的第二大值(无需创建新列)

ms-access - EOF 返回真,即使我在 ADO 的第一个位置有一个填充的记录集

VBA - Word - 随着时间的推移,遍历段落的速度会令人难以置信地变慢

python - 添加数据后保存并关闭 Excel 文件?

VBA 跳过空白不起作用

vba - 如何将范围对象与工作表对象一起使用

c# - Excel API 另存为对话框问题

excel - 使用 vba 将一列日期循环到 url 行以进行 Web 查询并从 xe.com/currencytables 检索汇率表