【发布时间】:2016-04-14 06:18:16
【问题描述】:
我在共享网络驱动器上有两个工作簿:
- 工作簿 A(表)
- 工作簿 B(数据透视表 - 连接到源工作簿 A)
我正在尝试,当打开工作簿 B 时,运行宏并执行以下操作:
- 取消保护工作簿 B 上的某个工作表
- 如果工作簿 A 处于打开状态,请刷新工作簿 B 上的数据连接
- 如果工作簿 A 已关闭,请打开工作簿 A 并刷新工作簿 B 上的数据连接,然后关闭工作簿 A。
- 保护工作簿 B 上的某个工作表
到目前为止,在大多数情况下测试时,下面的代码都按预期工作,但是如果其他人在其他计算机上打开工作簿 A 时尝试在他们的计算机上打开工作簿 B,它会将工作簿 A 作为只读文件打开并在他们的计算机上保持打开状态。我需要它在他们的计算机上关闭,并在另一台计算机上保持最初的打开状态。
Public Sub RefreshPvt()
ThisWorkbook.Worksheets("Sheet1").Unprotect
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim wkb As Workbook
If IsFileOpen("S:\\Testing\Job Closeout Status Test.xlsx") Then
ThisWorkbook.RefreshAll
Else
Set wkb = Workbooks.Open(filename:="S:\\Testing\Job Closeout Status Test.xlsx")
ThisWorkbook.RefreshAll
wkb.Close SaveChanges:=False
End If
ThisWorkbook.Worksheets("Sheet1").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
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
【问题讨论】:
-
等等,为什么要在新实例中打开工作簿 A?绝对没有理由这样做,它可能会导致一些问题。那为什么要这么做呢?
-
我认为您不需要打开工作簿 A。不过,在另一个 Excel 实例 中打开它就像在另一台计算机上打开它一样。没有意义,也没有效果。如果要打开它,只需在工作簿 B 所在的同一个 Excel 实例中打开它即可。
-
好的。我不需要它在新实例中打开它,只需在刷新连接时打开它。