我们网络中的许多用户使用从模板创建的excel工作簿(.xlsm [office 2010])。
现在,我需要在模板中做一些重要的更改,我希望所有用户都更新他们的工作簿,但我想避免与他们联系。
因此,我的想法是进行自动更新(将其工作簿的内容复制到新创建的工作簿中并删除以前的版本)。
不幸的是,现有工作簿中没有更新宏,但它们引用另一个工作簿中的宏。 每次他们打开工作簿时,数据连接都会自动刷新。
我可以使用此刷新事件来触发(数据源)excel文件中的宏吗(也许通过创建WithEvents类模块)?
答案 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