Excel 禁用在电源查询刷新时选择查询表
我在工作表模块中编写了以下代码,用于刷新Power Query表,该表一旦刷新,将允许选择单元格B3,并使用表的第一列中的唯一值在其中添加下拉列表。我正在使用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
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你能举例说明你的意思吗?我没有时间建立模型。但我猜问题在于,事件是在你不想被触发的时候被触发的。今天晚些时候我会试着安排一下。