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
结束选择
端函数
我将此解决方案无限期搁置,因为要实现它需要大量的工作才能获得准确的结果。无论我是否决定使用它,我都很感激你的帮助。