Excel 禁用在电源查询刷新时选择查询表

Excel 禁用在电源查询刷新时选择查询表,excel,vba,selection,powerquery,listobject,Excel,Vba,Selection,Powerquery,Listobject,我在工作表模块中编写了以下代码,用于刷新Power Query表,该表一旦刷新,将允许选择单元格B3,并使用表的第一列中的唯一值在其中添加下拉列表。我正在使用QueryTable\u AfterRefresh()方法指示查询刷新是否成功完成 Private WithEvents table As Excel.QueryTable Private Sub table_AfterRefresh(ByVal Success As Boolean) Do DoEvents

我在工作表模块中编写了以下代码,用于刷新Power Query表,该表一旦刷新,将允许选择单元格B3,并使用表的第一列中的唯一值在其中添加下拉列表。我正在使用
QueryTable\u AfterRefresh()
方法指示
查询刷新是否成功完成

Private WithEvents table As Excel.QueryTable

Private Sub table_AfterRefresh(ByVal Success As Boolean)
    Do
        DoEvents
    Loop Until Success
    Me.Cells(3, "B").Select
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim Rng As Range, Rng1, V, Dict As Object, Frm As String

Set Rng = Me.Cells(3, "B")
Set table = Me.ListObjects("_Rpt4").QueryTable
Set Rng1 = table.ListObject.ListColumns("Answers").DataBodyRange

Set Dict = CreateObject("Scripting.Dictionary")
For Each V In Rng1.Cells
    On Error Resume Next
    Dict.Add Key:=CStr(V.Value), Item:=CStr(V.Value)
    On Error GoTo 0
Next V

Frm = Join(Dict.Keys, ",")

If Target.Address = "$D$3" Then
    With table
        .BackgroundQuery = False
        .Refresh BackgroundQuery:=False
    End With
    
    DoEvents
    AddDataValidation Rng:=Rng, sFormula:=Frm
    
ElseIf Target.Address = "$B$3" Then
    If Target.Value2 <> "" Then
        table.ListObject.Range.AutoFilter field:=1, Criteria1:=Target.Value2
        table.ListObject.ShowAutoFilterDropDown = False
    ElseIf Target.Value2 = "" Then
        table.ListObject.Range.AutoFilter field:=1
        table.ListObject.ShowAutoFilterDropDown = False
    End If
End If

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub


Sub AddDataValidation(Rng As Range, sFormula As String)
Application.EnableEvents = False
    With Rng.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=sFormula
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
Application.EnableEvents = True
End Sub
Private with events表为Excel.QueryTable
刷新后的私有子表_(ByVal Success作为布尔值)
做
多芬特
循环直到成功
Me.单元格(3,“B”)。选择
端接头
私有子工作表_更改(ByVal目标作为范围)
Application.ScreenUpdating=False
Application.DisplayAlerts=False
尺寸Rng作为范围,Rng1,V,Dict作为对象,Frm作为字符串
设置Rng=Me.Cells(3,“B”)
Set table=Me.ListObjects(“Rpt4”).QueryTable
Set Rng1=table.ListObject.ListColumns(“答案”).DataBodyRange
Set Dict=CreateObject(“Scripting.Dictionary”)
对于Rng1.单元中的每个V
出错时继续下一步
指令添加键:=CStr(V.Value),项目:=CStr(V.Value)
错误转到0
下一个V
Frm=连接(Dict.Keys,“,”)
如果Target.Address=“$D$3”,则
带桌子
.BackgroundQuery=False
.Refresh BackgroundQuery:=False
以
多芬特
AddDataValidation Rng:=Rng,sFormula:=Frm
ElseIf Target.Address=“$B$3”则
如果Target.Value2为“”,则
table.ListObject.Range.AutoFilter字段:=1,Criteria1:=Target.Value2
table.ListObject.ShowAutoFilterDropDown=False
ElseIf Target.Value2=“”然后
table.ListObject.Range.AutoFilter字段:=1
table.ListObject.ShowAutoFilterDropDown=False
如果结束
如果结束
Application.DisplayAlerts=True
Application.ScreenUpdating=True
端接头
子AddDataValidation(Rng作为范围,sFormula作为字符串)
Application.EnableEvents=False
使用Rng.Validation
.删除
.Add类型:=xlValidateList,AlertStyle:=xlValidAlertStop,运算符:=xlBetween,公式1:=sFormula
.IgnoreBlank=True
.InCellDropdown=True
.InputTitle=“”
.ErrorTitle=“”
.InputMessage=“”
.ErrorMessage=“”
.ShowInput=True
.ror=真
以
Application.EnableEvents=True
端接头
代码工作正常,但是,表仍然会高亮显示(选中),并且选择不会移动到B3单元格(只会在短时间内移动)


有没有一种选项或方法可以在查询成功刷新后禁用电源查询表的选择?

可能需要在更新查询表之前禁用事件(
Application.EnableEvents=False
),并在选择B3(
Application.EnableEvents=True
)之后启用它们.您的意思是在刷新后的
表中?不行!表仍然突出显示。在更新查询表之前,请在工作表更改事件中禁用它。在“后刷新”中选择B3后重新启用event@RonRosenfeld你能举例说明你的意思吗?我没有时间建立模型。但我猜问题在于,事件是在你不想被触发的时候被触发的。今天晚些时候我会试着安排一下。