#excel #vba #selection #powerquery #listobject
#excel #vba #выбор #powerquery #listobject
Вопрос:
Я написал следующий код в модуле рабочего листа, чтобы обновить таблицу Power Query, которая после обновления должна позволить выбрать ячейку B3 и добавить туда выпадающий список, используя уникальные значения из 1-го столбца таблицы. Я использую QueryTable_AfterRefresh()
метод, чтобы указать, является ли Query refresh completed successfully
.
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
Код работает нормально, однако таблица по-прежнему выделяется (выделяется), и выделение не перемещается в ячейку B3 (это происходит, только на короткое время).
Есть ли возможность или способ отключить выбор таблицы Power Query после успешного обновления запроса?
Комментарии:
1. Возможно, вам нужно отключить events (
Application.EnableEvents=False
) перед обновлением таблицы запросов и включить их после выбора B3 (Application.EnableEvents=True
).2. вы имеете в виду в
table_AfterRefresh
процедуре? Не работает! Таблица по-прежнему выделяется.3. Отключите его в событии изменения листа перед обновлением таблицы запросов. Повторно включите его после того, как вы выбрали B3 в событии после обновления
4. @RonRosenfeld можете ли вы продемонстрировать на примере, что вы имели в виду?
5. У меня нет времени на настройку модели. Но я предполагаю, что проблема в том, что события запускаются, когда вы этого не хотите. Я попытаюсь что-нибудь настроить позже сегодня.