Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Worksheet.RefreshAll触发器工作表\u已更改事件-如何阻止这种情况发生?_Vba_Excel - Fatal编程技术网

Vba Worksheet.RefreshAll触发器工作表\u已更改事件-如何阻止这种情况发生?

Vba Worksheet.RefreshAll触发器工作表\u已更改事件-如何阻止这种情况发生?,vba,excel,Vba,Excel,我有一个excel工作表,用作access的数据库前端。当用户更改单元格中的数据时,它将运行“工作表更改”事件以运行更新access数据库的代码 然而,我也有一个刷新按钮,你猜到了,刷新电子表格。这也会导致“工作表更改”事件运行,有时会导致程序出错 Private Sub RefreshButton_Click() Refreshbuttons ActiveWorkbook.RefreshAll End Sub 按下刷新按钮时,如何阻止工作表更改事件发生?我尝试了一个布尔标志,当按下刷新按

我有一个excel工作表,用作access的数据库前端。当用户更改单元格中的数据时,它将运行“工作表更改”事件以运行更新access数据库的代码

然而,我也有一个刷新按钮,你猜到了,刷新电子表格。这也会导致“工作表更改”事件运行,有时会导致程序出错

Private Sub RefreshButton_Click()

Refreshbuttons
ActiveWorkbook.RefreshAll

End Sub
按下刷新按钮时,如何阻止工作表更改事件发生?我尝试了一个布尔标志,当按下刷新按钮时,它将停止工作表更改事件的运行,但在我所做的所有示例中,它都会停止它的运行

Private Sub RefreshButton_Click()

Dim Flag as Boolean

Flag = True

Refreshbuttons
ActiveWorkbook.RefreshAll

Flag = False 

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

If Flag = true then
Exit Sub
Else

[...] {Rest of code below here}
我被卡住了-非常感谢任何帮助

谢谢

伊桑

编辑 谢谢蒂姆!你给我指明了正确的方向。我最终使用了下面的代码,它运行得很好。我感谢大家的帮助

Private Sub RefreshButton_Click()

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
    If ActiveSheet.FilterMode = True Then
     ActiveSheet.ShowAllData
        Else
    End If
    'Set background-refresh value back to original value
    objConnection.OLEDBConnection.BackgroundQuery = bBackground
Next

MsgBox "Refresh Complete"

End Sub

将标志声明为全局标志,如下所示。它应该会起作用


公共标志为布尔值

所有office应用程序都有一个内置函数来控制此行为。只需添加: Application.EnableEvents=False至刷新按钮的开头\u单击事件并单击
Application.EnableEvents=True直到事件结束。

我试着使用你们说的EnableEvents,但它仍然会运行工作表更改事件-如果我在存根的开头有Application.EnableEvents=False,它将停止运行。但是,一旦我将Application.EnableEvents=True放在sub的末尾,它就会导致工作表更改事件run@EthanV:插入一个新模块并添加以下内容:Public Flag为布尔值,delete Dim Flag为布尔值,从Private Sub RefreshButton_单击“如果不起作用请告诉我”此问题和回答:如果有工作簿中设置为在后台运行然后刷新所有的查询将在查询完成之前返回,因此在数据实际更新之前会重新启用事件处理程序。你需要做更多的工作来处理这个问题。
Private Sub RefreshButton_Click()

    On Error Goto haveError

    Refreshbuttons
    Application.EnableEvents = False
    ActiveWorkbook.RefreshAll

    haveError:
    Application.EnableEvents = True

End Sub