VBA启用事件未按预期运行

时间:2019-02-15 11:19:58

标签: excel vba

我在工作簿的两张表中嵌入了一个worksheet_change宏。它们在那里是为了防止任何人更改工作表。但是,我仍然希望每隔一段时间刷新工作表中的数据。这是行不通的。

工作簿中的两个工作表通过查询连接到另一个工作簿。从本质上讲,这些工作表是其他工作簿中工作表的副本。 我已经将 Code1 嵌入到两个工作表中。这是为了防止任何人对工作表进行更改,但仍然允许他们查看工作表并从中复制数据。它会弹出一个消息框,然后撤消用户所做的更改。效果很好,对此我感到满意。

同时,我希望能够刷新工作簿,以便已连接的工作表相对于与其连接的其他工作簿而言是最新的。

为此,我在工作簿中添加了一个名为“刷新”的按钮。此按钮调用 Code2 。这样做是为了禁用事件,以便暂停worksheet_change宏以允许刷新数据。

但是,这不起作用,因为worksheet_change宏仍然有效。即,单击按钮后,工作簿将刷新并然后撤消任何更新并显示消息框,这不是我所需要的。

CODE1

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range

' The variable KeyCells contains the cells that will
' cause an alert when they are changed.
Set KeyCells = Range("A1:Z1000")

If Not Application.Intersect(KeyCells, Range(Target.Address)) _
       Is Nothing Then

    With Application
        .EnableEvents = False
        .Undo
        .EnableEvents = True
    End With

    ' Display a message when one of the designated cells has been
    ' changed.
    ' Place your code here.
    MsgBox "DO NOT MODIFY THIS SHEET - Any necessary modifications should be made in 'Master Invoice Template' and this sheet will automatically be updated!"

End If
End Sub

CODE2

Sub refresh()

On Error GoTo ErrorHandler
Application.EnableEvents = False
ThisWorkbook.RefreshAll

ErrorHandler:
Application.EnableEvents = True

End Sub

我在互联网上搜寻解决方案,发现的所有内容几乎都指向enableevents = false的方向,但是如我的帖子所述,这是行不通的。我是否需要更改解决问题的方法,或者我在代码中做错了什么?

我怀疑撤消代码是导致此问题的原因,但我不确定!

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我想我已经弄清楚了代码出了什么问题;如果我错了,请纠正我。运行 Code2 时,刷新数据所需的时间太长。这意味着代码2 中的Application.EnableEvents = Ture在完全刷新数据之前生效,并且当它最终完成更新时,触发了Worksheet_Change事件。

我在DoEvents命令之后尝试使用RefreshAll,但这也不起作用。我已使用在this post中找到的内容来解决此问题,并且刷新按钮现在可以使用了!

具体的帮助代码如下:我将 Code2 替换为:

Sub Refresh_All_Data_Connections()

For Each objConnection In ThisWorkbook.Connections
    'Get current background-refresh value
    bBackground = objConnection.OLEDBConnection.BackgroundQuery

    'Temporarily disable background-refresh
    objConnection.OLEDBConnection.BackgroundQuery = False

    'Refresh this connection
    objConnection.Refresh

    'Set background-refresh value back to original value
    objConnection.OLEDBConnection.BackgroundQuery = bBackground
Next

MsgBox "Finished refreshing all data connections"

End Sub

请让我知道我在解释为​​什么代码不起作用时的逻辑是否正确-我对VBA还是陌生的,并且希望完全理解该问题!