2011-12-29 150 views
2

是否可以刷新打开为只读的文档,以便如果有其​​他人将其打开进行写入,则会显示自上次刷新以来进行的任何更新,但不显示离开活动工作表?Excel VBA刷新文档只读

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

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

感谢

回答

4

这个代码进入两个工作簿

  1. 它使用SheetActivate事件到时间可持续写入日志您的主文件(name.xls的 电流片的在你的榜样以上)至 a log.txt文件
  2. “控制器”工作簿用于:
    • 测试的主要文件是开放的,
    • 如果它是那么的只读版本中打开(如果没有实际的文件通常打开),并
    • 文件日志(这最后一片存储,Windows登录名&当前时间渐进式 - 也许矫枉过正)被访问以设置最近的工作表。

注:
1.我只能通过我的主文件运行Excel的两个独立的情况下,在测试我的本地机器上此为Excel不会让相同的文件被打开两次相同的实例)
2,而不是一个控制器工作簿我会建议使用从桌面快捷方式执行

改变这一行来设置文件路径和名称,以测试为开放
StrFileName = "c:\temp\main.xlsm"

Code for document to be opened: ThisWorkbook module

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 

Code for Controller workbook: Normal module

我已经更新了微软网站的代码来测试是否StrFileName已经打开。如果是开放elsehwere那么只读版本打开到最新页面

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 
+0

我搁置下去,因为它是一个大量的工作来实现只是为了获得一个精密这一解决方案。无论我是否决定使用它,我都很感激帮助。 – Wes 2012-04-20 00:21:29

+0

+ 1很好完成 – 2012-04-20 18:18:36