Есть ли возможность запустить макрос в файле Excel (источник данных), когда подключение к данным обновляется другим файлом Excel (цель-данных)? - PullRequest
0 голосов
/ 04 февраля 2019

многие пользователи в нашей сети используют рабочую книгу excel (.xlsm [офис 2010]), созданную на основе шаблона.

Теперь в шаблон необходимо внести некоторые важные изменения иЯ хочу, чтобы все пользователи обновляли свои рабочие книги, но я бы не хотел связываться со всеми из них.

Итак, моя идея - сделать автообновление (копирование содержимого их рабочих книг в новые созданные рабочие книги).и удалите старую версию).

К сожалению, в существующих книгах нет макросов обновления, но они ссылаются на макрос в другой книге.Каждый раз, когда они открывают свои книги, соединения данных обновляются автоматически.

Можно ли использовать это событие обновления для запуска макроса в Excel-файле (источника данных) (возможно, путем создания класса WithEventsмодуль)

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете попробовать это.Он использует события и запускается при обновлении данных.

Сначала вам нужно создать имя класса "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

Затем вы можете поместить этокод в вашем событии workbook_open на ThisWorkbook

    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

0 голосов
/ 04 февраля 2019

Вы можете сделать что-то в этом духе, когда пользователь открывает рабочую книгу, но его задача - контролировать версию.Вы можете изменить это так, чтобы код изменял листы и т. Д.

Текстовый файл, правильный, содержит ver9, рабочая книга содержит ver8 в рабочем листе ver_cont.

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
...