Добрый день, уважаемые форумчане) Возникает досадная ситуация при использовании Power Query. При запуске макроса на vba есть строка, которая обновляет Query.
Код
Err.Clear
Application.DisplayAlerts = False
On Error Resume Next
With Workbooks("forum.xlsm").Connections("my_query").OLEDBConnection
.BackgroundQuery = False 'or true, up to you
.Refresh
End With
If Err.Number <> 0 Then GoTo nextx
Debug.Print "обновлено"
nextx:
Раз в энное количество запусков макроса вылетает "Непредвиденная ошибка", связанная с PQ. On Error Resume Next, application.displayallert = false - не помогают убрать возникновение "Непредвиденной ошибки"
Свою задачу могу решить и без PQ, но хочется разобраться в чем дело??? Что бы с уверенностью полагаться на PQ.
Подробные сведения об ошибке приложил. Пользуюсь Excel 2016 64bit
Добрый день, уважаемые форумчане) Прошу Вашей помощи в формировании массива на основании двух других массивов. Интересно задачку решить именно через массивы.
Добрый день. Прошу помочь адаптировать макрос под пример! Есть прекрасный код, который ищет в массиве все строки, подходящие под заданный критерий, и возвращает результат в виде отфильтрованного массива. Вот только есть ограничение. В столбце можно фильтровать только по одному критерию. А мне нужно, что бы в одном столбце фильтровало по нескольким критериям.
Код
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'НУЖНО ЧТО БЫ РАБОТАЛО ТАК:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub FilterExample1()
On Error Resume Next
Dim arr As Variant
' получает по ссылке массив ARR для фильтрации
' и список критериев фильтрации в формате "3=некий текст" (номер столбца, "=", искомое значение)
' возвращает двумерный массив с подходящими строками
temp = Worksheets("Лист2").Range("a1:A3")
arr = ArrAutofilterEx(Worksheets("Лист1").Range("a1:D20").Value, "1=" & temp)
' создаем лист, вставляем на него результат
Worksheets.Add.Range("a1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'РАБОТАЕТ ПО ОДНОМУ КРИТЕРИЮ В СТОЛБЦЕ. В 1 столбце отфильтрует все значения 2
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub FilterExample()
On Error Resume Next
Dim arr As Variant
' получает по ссылке массив ARR для фильтрации
' и список критериев фильтрации в формате "3=некий текст" (номер столбца, "=", искомое значение)
' возвращает двумерный массив с подходящими строками
temp = 2
arr = ArrAutofilterEx(Worksheets("Лист1").Range("a1:D20").Value, "1=" & temp)
' создаем лист, вставляем на него результат
Worksheets.Add.Range("a1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
Function ArrAutofilterEx(ByRef arr, ParamArray args() As Variant) As Variant
' получает по ссылке массив ARR для фильтрации
' и список критериев фильтрации в формате "3=некий текст" (номер столбца, "=", искомое значение)
' возвращает двумерный массив с подходящими строками
Dim Index As Long, OK As Boolean, ComparedColumn As Long, res As String
If Not IsArray(arr) Then MsgBox "Это не массив!", vbCritical, _
"Ошибка в функции ArrAutofilter": Exit Function
For Index = LBound(args) To UBound(args) ' перебираем все параметры фильтрации
If Not IsMissing(args(Index)) Then
If GetAutofilterArgument(args(Index), ComparedColumn, res) Then
If (ComparedColumn > UBound(arr, 2)) Or (ComparedColumn < LBound(arr, 2)) Then _
ArrAutofilter = ArrAutofilter & "В массиве нет столбца с номером " & _
ComparedColumn & vbNewLine
Else
ArrAutofilter = ArrAutofilter & "Неверно сформирована строка фильтрации: " & _
args(Index) & vbNewLine
End If
Else
ArrAutofilter = ArrAutofilter & (Index + 1) & "-й аргумент фильтрации отсутствует" & _
vbNewLine
End If
Next Index
If Len(ArrAutofilter) Then
MsgBox ArrAutofilter, vbCritical, "Ошибка в функции ArrAutofilter"
ArrAutofilterEx = "": Exit Function
End If
Dim coll As New Collection
For i = LBound(arr, 1) To UBound(arr, 1) ' перебираем все строки массива
OK = True
For Index = LBound(args) To UBound(args) ' перебираем все параметры фильтрации
' получаем параметры фильтрации
X = GetAutofilterArgument(args(Index), ComparedColumn, res)
If Not (arr(i, ComparedColumn) Like res) Then OK = False: Exit For
Next Index
If OK Then coll.Add i
Next i
' формируем новый массив
ReDim newarr(1 To coll.Count, LBound(arr, 2) To UBound(arr, 2))
For i = 1 To coll.Count
ro = coll(i)
For j = LBound(arr, 2) To UBound(arr, 2): newarr(i, j) = arr(ro, j): Next j
Next i
ArrAutofilterEx = newarr
End Function
Function GetAutofilterArgument(ByVal arg, ByRef col As Long, ByRef searchStr As String) As Boolean
col = 0: searchStr = ""
If UBound(Split(arg, "=")) < 1 Then Exit Function ' нет знака =
sCol = Split(arg, "=")(0): If Len(sCol) = 0 Or Not sCol Like String(Len(sCol), "#") Then _
Exit Function ' номер столбца не соответствует
searchStr = Mid$(arg, Len(sCol) + 2): col = Val(sCol)
If col > 0 Then GetAutofilterArgument = True
End Function
Добрый день! Прошу помочь адаптировать макрос под пример! С помощью VBA подставить данные в таблицу по двум значениям. сделать через Sub. Function не подходит.
В приложенном примере макрос работает. На странице, где не работает - помогите, пожалуйста, адаптировать.
Код
Sub Макрос1()
'работает
Worksheets("здесь макро работает").Select
i = Application.Match(Cells(23, 1), Range("A2:A20"), 0)
j = Application.Match(Cells(23, 2), Range("B1:G1"), 0)
Cells(24, 1).Value = Application.Index(Range("B2:G20"), i, j)
End Sub
А как такое же сделать в сводной таблице куба OLAP ??? способом ниже цикл проходит, но в фильтр ничего не применяет....
Код
Sub Макрос1()
Dim pItem As PivotItem
Application.ScreenUpdating = False
With ActiveSheet.PivotTables("Сводная таблица11")
For Each pItem In .PivotFields("[Аптеки].[Компания].[Компания]").PivotItems
If pItem = "[Аптеки].[Компания].&[Офисы]" Then
pItem.Visible = False
Else
pItem.Visible = True
End If
Next
.PivotCache.Refresh
End With
Application.ScreenUpdating = True
End Sub
Добрый день. Формирую отчеты макросами в книге эксель подключенной к кубам. Иногда возникает подвисание экселя(процесс выполняется слишком долго) именно на строчках обновления таблиц через кубы(плохой интернет, слишком большой отчет или что-то еще...). Повторное обновление сводной таблицы через несколько минут вполне спасает ситуацию.
Код
'строчка кода обновления сводной таблицы, где возможны подвисания
ActiveWorkbook.Connections("Tabular Модель1").Refresh
Подвисание обновления таблицы не зависает намертво - макрос обновления можно остановить простым нажатием Esc. Но если этого не сделать, он так и будет обновлять и обновлять довольно долго..... Поэтому важно сделать обработчик "зависаний", который, в случае чего, будет перезапустит невыполненную часть макроса заново для удачного исполнения.
Sub обработчик_зависаний_макроса()
'если зависнет - попытку выполнения повторить 2 раза.
For i = 1 To 2
'время, которым ограничено выполнение части скрипта в цикле
maxtime_for_macro = Now() + TimeValue("00:00:10")
a = Timer 'таймер для контроля работы обработчика зависаний макроса
DoEvents 'Передает управление Windows
Do While Now <= maxtime_for_macro 'нужно выполнять только разрешенное время - 10 сек.
Application.Wait Now() + TimeValue("00:00:15") 'пример процесса, который выполняется слишком долго (больше 10 сек.)
MsgBox Timer - a & "работает, если выполнение около 10 секунд"
Loop
if maxtime_for_macro - Now < 10 Then exit For 'если выполняется меньше чем за 10 сек - повтор цикла не нужен
Next i
End Sub
Подскажите пожалуйста как подправить макрос. Таблица эксель имеет подключение к OLAP кубам. Перед запуском основного кода необходимо выполнить проверку на подключение к OLAP кубам.
Код
Sub check()
Dim a As Boolean
a = ActiveWorkbook.Connections("Tabular Модель1")
If a = False Then
End If
Подскажите пожалуйста как подправить макрос, что бы при фильтрации макросом, условия для фильтра подтягивалось из ячейки
Код
Sub Макрос1()
'присвоить переменную для применения в фильтре
Dim d As Integer
d = Sheets("звіт").[B2]
'фильтр
ActiveSheet.ListObjects("Таблица1").Range.AutoFilter Field:=8, Criteria1:= _
"<d", Operator:=xlAnd
End Sub