当数据连接被另一个excel文件(数据目标)刷新时,是否可以在excel文件(数据源)中运行宏?

时间:2019-02-04 15:01:12

标签: excel vba eventhandler data-connections

我们网络中的许多用户使用从模板创建的excel工作簿(.xlsm [office 2010])。

现在,我需要在模板中做一些重要的更改,我希望所有用户都更新他们的工作簿,但我想避免与他们联系。

因此,我的想法是进行自动更新(将其工作簿的内容复制到新创建的工作簿中并删除以前的版本)。

不幸的是,现有工作簿中没有更新宏,但它们引用另一个工作簿中的宏。 每次他们打开工作簿时,数据连接都会自动刷新。

我可以使用此刷新事件来触发(数据源)excel文件中的宏吗(也许通过创建WithEvents类模块)?

2 个答案:

答案 0 :(得分:0)

您可以按照以下步骤进行操作,用户可以在其中打开工作簿,但其工作是控制版本。您可以更改它,以使代码修改工作表等。

正确的文本文件包含ver9,工作簿的ver_cont工作表中包含ver8。

Function get_version() As String

Open "c:\workspace\test_ver.txt" For Input As #1

Input #1, get_version

Close #1

End Function

Function check_version()

If get_version = Worksheets("Ver_cont").Range("a1") Then
    '   Open the workbook here
Else
    '   Copy the workbook
    '   Then open it
End If

End Function

答案 1 :(得分:0)

您可以尝试一下。它使用withevents并在数据更新时运行。

首先,您需要创建一个类名称“ clsQueryTable”,并将此代码放入其中

    Option Explicit

    Public WithEvents QTQueryTable As Excel.QueryTable

    Private Sub QTQueryTable_BeforeRefresh(blnCancel As Boolean)
        'Set blnCancel to true to stop the refresh
        Debug.Print blnCancel
    End Sub

    Private Sub QTQueryTable_AfterRefresh(ByVal blnSuccess As Boolean)
        'blnSuccess can be used to check for refresh success.

        '  I would put your update code here!
        Debug.Print blnSuccess
    End Sub

然后,您可以将此代码放在ThisWorkbook的workbook_open事件中

    Option Explicit

    Dim colQueryTables As Collection

    Private Sub Workbook_Open()
        Dim shtMySheet As Worksheet
        Dim clsQT As clsQueryTable
        Dim qtMyQuery As QueryTable
        Dim loMyList As ListObject
        Dim conn As WorkbookConnection

        Set colQueryTables = New Collection

        For Each shtMySheet In ThisWorkbook.Worksheets
            For Each loMyList In shtMySheet.ListObjects
                Set clsQT = New clsQueryTable
                Set clsQT.QTQueryTable = loMyList.QueryTable

                colQueryTables.Add clsQT
            Next loMyList
        Next shtMySheet

        For Each conn In Connections
            conn.Refresh
        Next
    End Sub