【问题标题】:Open/Close workbook and Refresh Connection打开/关闭工作簿并刷新连接
【发布时间】:2016-04-14 06:18:16
【问题描述】:

我在共享网络驱动器上有两个工作簿:

  • 工作簿 A(表)
  • 工作簿 B(数据透视表 - 连接到源工作簿 A)

我正在尝试,当打开工作簿 B 时,运行宏并执行以下操作:

  1. 取消保护工作簿 B 上的某个工作表
  2. 如果工作簿 A 处于打开状态,请刷新工作簿 B 上的数据连接
  3. 如果工作簿 A 已关闭,请打开工作簿 A 并刷新工作簿 B 上的数据连接,然后关闭工作簿 A。
  4. 保护工作簿 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 实例中打开它即可。
  • 好的。我不需要它在新实例中打开它,只需在刷新连接时打开它。

标签: excel vba


【解决方案1】:

如果您在即时窗口中对工作簿 B 运行 ThisWorkbook.RefreshAll,它会起作用吗?

您也可以设置 XLApp.Visible = true 来查看它是否正在打开

我认为你应该使用类似的东西:

Dim pt As PivotTable
For Each pt In ActiveSheet.PivotTables

    pt.RefreshTable

Next pt

要完成您可以使用的整个工作簿:

Sub AllWorkbookPivots()
Dim pt As PivotTable
Dim ws As Worksheet

    For Each ws In ActiveWorkbook.Worksheets

        For Each pt In ws.PivotTables
            pt.RefreshTable
        Next pt
    Next ws

End Sub

【讨论】:

  • 我在工作簿 B 上运行了 ThisWorkbook.RefreshAll,但它不起作用。但是当我点击功能区中的刷新按钮时,它会在我打开工作簿 A 时起作用。当我将 ExcelApp.Visible 从 false 更改为 true 并手动运行代码时,代码确实打开了工作簿 A。但是,当我打开 Workbook B 时,代码没有运行。谢谢
  • 我认为打开另一个工作簿没有意义,但如果这样做,请不要在另一个 Excel 实例中打开它。单独的 Excel 实例不通信。
  • 愚蠢的错误,我需要在运行 Thisworkbook.Refreshall 之前取消保护工作簿。它奏效了。
  • 如果我没有打开工作簿 A,它不会刷新数据。我收到一条错误消息,提示无法从工作簿 A 中获取数据,请将其打开并重试。
  • 您完成整个工作簿的解决方案是刷新数据。谢谢你。我唯一缺少的是我必须在代码运行之前打开工作簿 A。我尝试在上面添加我的代码以打开工作簿 A。工作簿 A 打开,但我收到一个调试错误,提示无法从工作簿 A 获取数据以更新数据透视表,请打开并重试。有什么想法吗?谢谢。
【解决方案2】:

Microsoft Office 使用与原始文件在同一目录中创建的文件来跟踪这些锁。文档 filename.xlsx 获得一个临时锁定文件:~$filename.xlsx。如果文档正在使用中,其他用户/宏以只读方式打开该文档。这是设计使然。

我们可能会尝试使用 Excel 的共享工作簿功能,但有一些限制。

更多详细信息,请参考以下链接:

https://support.office.com/en-za/article/Use-a-shared-workbook-to-collaborate-79bd9dee-1aa3-49b5-bc27-a1ad28ffcbce

这里提到:https://social.technet.microsoft.com/Forums/ie/en-US/c1b179e1-ec4a-4ab9-abf4-21dc8b0c9326/vba-excel-to-excel-data-connection-it-opens-the-source-file-at-refresh?forum=excel

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    相关资源
    最近更新 更多