0

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

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

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

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

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

4

2 回答 2

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

于 2019-02-04T16:03:10.183 回答
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
于 2019-02-04T15:14:19.783 回答