Private Sub Worksheet_SelectionChange(ByVal Target As Range) If ActiveSheet.ListObjects("Таблица1").AutoFilter.FilterMode Then ActiveSheet.ListObjects("Таблица1").TableStyle = "TableStyleLight10" Else ActiveSheet.ListObjects("Таблица1").TableStyle = "TableStyleLight9" End If
End Sub
Единственное работает не когда ставится фильтр а когда после установки фильтра какое то действие с ячейкой происходит.
Есть задача отслеживать наличие фильтрации в умной таблице и менять стиль таблицы. думал что по Worksheet_SelectionChange получится проверять, но все что нашел на форуме не работает для умной таблицы. по идее надо чтобы getActiveFilterCount выдавал 1 или более по количеству установленных фильтров в умной таблице но что именно в эту функцию записать - пока загадка
Private Sub Worksheet_SelectionChange(ByVal Target As Range) i = getActiveFilterCount If i <> 0 Then ActiveSheet.ListObjects("Таблица1").TableStyle = "TableStyleLight10" Else ActiveSheet.ListObjects("Таблица1").TableStyle = "TableStyleLight9" End If End Sub
мне нужно чтобы значения наработки были в столбце "Средняя наработка действующего оборудования для обычный" таблицы на вкладке вычисления пример как вычисляется для сегодняшней дыты я показал полного примера у меня нет ибо нужно вручную 500 значений для 5ти типов двигателей посчитать. а такие значения в целом нужны и по другим условиям. нужен принцип вычисления или подход к решению такой задачи.
это не то. Эта формула подойдет только для даты равной сегодня в таблице вычислений. а ее нужно всю заполнить значениями средней наработки и медианной наработки. нужна формула для вычисления всех вариантов на даты конца месяца (уже есть в таблице) или хотябы ответ на вопрос Как в эту формулу подставить разность дат вместо диапазона значений наработки ($F:$F) проблема именно в том что наработка на неделю раньше будет включать оборудование которое еще не отказало например и не будет включать оборудование которое еще не смонтировано. т.е. для каждой вычисляемой даты наработка в каждой строке отчета это индивидуальный результат.
Поправил пример. отфильтровал по колонке остановка. получил в строках таблицы только оборудование которое работает на сегодня. в доп столбце посчитал наработку на сегодня простой формулой. в отдельной ячейке вычисляется средняя наработка для оборудования на сегодня.
это ручной способ. нжны только значения наработки на даты.
На вкладке отчет вариант части табличных данных отчета на вкладке вычисление пример вычисления количества работающего оборудования по типу двигателя на нужную дату. данные собираются для построения графика динамики показателя.
Задача: для каждого типа двигателя среди работающего на дату (как в примере) подсчитать среднюю и медианную наработку в примере отбор только по одному варианту условия, в действительности нужно решение для использования множественного условия
пример в 11 сообщении. Есть массив данных о смонтированном оборудовании. он содержит в строках тип оборудования а в столбцах даты монтажа запуска остановки и демонтажа. столбец наработка вычисляется на момент выгрузки отчета в доп колонку. для остановленного оборудования наработка считается с момента запуска до остановки. для работающего с момента запуска до даты отчета.
Вопрос как посчитать среднюю наработку по множественному условию понятен и легко выполняется через суммеслимн и счетеслимн. а вот задача посчитать наработку на действующем фонде оборудования на момент времени в прошлом. (на конец каждого месяца начиная с 2015 года и до сегодня) не понятна. и тем более непонятно как посчитать медианную наработку. т.е. надо посчитать разность между заданной датой конца месяца и датой запуска для всего оборудования у которого нет остановки на момент времени. или хотя бы получить массив чисел с наработками оборудовани для последующей обработки.
те же приколы но с ними можно уже жить. если удалить файл из папки обработчика - программа считает что он есть и даже открывает его до завершения синхронизации. появляется открытие закрытие. (можно ли это в фоне оставить интересно?) и обратное событие откабатывает с выдачей системной ошибки что нет доступа к файлу а потом только выполнение.
Код
Sub Извлечение_данных_1С()
Dim wb As Workbook
Dim FileFormat As Long, FileDate As String, LocalAdress As String
Dim objFSO As Object
Dim sFileName As String
sFileName = "//222223/1Cdata/zzzzz.xlsx" 'имя исходного файла отчета
Set objFSO = CreateObject("Scripting.FileSystemObject") 'создаем объект FileSystemObject
If objFSO.FileExists(sFileName) = False Then 'проверяем наличие файла на серваке 1С
MsgBox "Нет файла отчета на сетевом диске", vbCritical, "Дашборд"
Exit Sub
Else
FileDate = FileDateTime(sFileName) 'определяем дату выгрузки
FileDate = Left(FileDate, InStrRev(FileDate, " ") - 1) 'извлекаем только дату в формате текст
FileFormat = 51 'определяем формат сохранения -> xlsx
LocalAdress = ThisWorkbook.Path & "/Data " & FileDate & ".xlsx" 'определяем путь с новым именем файла пересохраняемого отчета
Err.Clear
On Error Resume Next
Set wb = Workbooks.Open(LocalAdress, ReadOnly:=False)
If wb Is Nothing Then 'если файла нет
Application.ScreenUpdating = 0 'отключаем оповещения
Application.DisplayAlerts = 0
Set wb = Application.Workbooks.Open(sFileName, False)
wb.SaveAs LocalAdress, FileFormat
wb.Close
DoEvents
Application.ScreenUpdating = 1 'включаем оповещения
Application.DisplayAlerts = 1
Range("B4").Value = "Data " & FileDate & ".xlsx"
Range("B7").Value = Now
MsgBox "В папку с дашбордом сохранен Data " & FileDate & ".xlsx", vbInformation, "Дашборд"
Else
wb.Close
MsgBox "Файл этой выгрузки уже есть. Если требуется обновить удалите его из папки с текущим файлом"
Exit Sub
End If
End If
End Sub
написал: вот здесь и надо подробнее пояснять. Что значит "не сохраняет"? Причину определили? Не сохраняет кодом? А до сохранения вообще доходит? На чем "валится" код - что мешает ему сохранить или дойти до строки сохранения?
Выдает ошибку метода 1004 при выполнении 32 строки. связываю это с процессом отложенной синхронизации OneDrive. потому что ошибку дает только если подряд два раза выполнять макрос. если перерыв будет - все работает
Цитата
написал: Почему нельзя попробовать приведенный мной код?
Щас попробую.
Цитата
написал: а формат то какой? почему не пойти от корня проблемы?
программер обслуживающий 1С говорит что это тот самый xlsx. но возможно с нюансами создания из 1С. если файл сразу запихивать в запрос PowerQuery то он не видит структуры. пишет : DataFormat.Error: Входные данные не удалось распознать как допустимый документ Excel. Сведения: [Binary]
погуглил решение - написали пересохранять
Цитата
4 сообщение какое понимание или пояснение проблемы дает?
Прошу простить, не туда посмотрел, в 3 сообщении писал.
Задача изначальная обработать выгрузку 1С средствами PowerQuery и получить 100500 графиков. Обработчик должен быть универсальным для любого пользователя. почти все пользователи работают через Sharepoint. Обработчик тоже будет предоставлен в виде доступа к папке группы в тимс или на OneDrive проблема: выгрузка формируется еженедельно и лежит на внешнем сервере. сама структура файла выгрузки не позволяет его сразу использовать средствами PowerQuery. решение в интернете говорит что надо пересохранить в нужном формате. Если есть файл с нужным форматом - Обработка работает.
я пошел по пути: макросом открыть и сохранить выгрузку в нужном формате в папку с обработчиком. (на внешнем сервере сохранять левые файлы нельзя) потом обрабатывать получившийся файл средствами PowerQuery. Наткнулся на то, что второй раз он уже не сохраняет файл если запускаю из синхронизируемой папки (Sharepoint). ругается и сбрасывает выполнение макроса. т.е. надо делать ограничения и проверки на наличие файла, а это тоже не работает.
потому что его там нет, а цель стоит в автоматизации. т.е. любой пользователь с доступом к расшаренной папке с обработчиком должен получить результат в виде обработки. поэтому сначала файл с общего сервера закидывается в папку пользователя, а потом обрабатывается.
это не отменяет проблемы но, возможно в моем случае проще по другому организовать автоматизацию.
При обработке файла посредством PowerQuery использую конструкцию:
Код
Content = if Text.StartsWith(fParam("Path"),"https://") then Web.Contents(fParam("Path")) else File.Contents(fParam("Path")),
Источник = Excel.Workbook(Content, null, true),
НО если файл еще не синхронизировался в папке - выдает ошибку доступа к файлу.
Не работает с OneDrive. файл из которого запускается макрос имеет адрес: https://slb001-my.sharepoint.com/ т.е. строка 21 sFolder = ThisWorkbook.Path 'записываем путь текущего файла записывает адрес в таком виде в переменную sFolder
файл уже перезаписанного отчета есть в папке, а исполнение идет дальше. т.е. что он есть что его нет выполняется. при этом обход перезаписи делаю только из-за того что, что если файл уже есть на OneDrive то метод записи книги не срабатывает и появляется ошибка.
для несинхронизируемой папки работает.
не знаю как правильно код вставить чтобы комменты остались
Код
Sub Извлечение_данных_1С()
Dim sFolder As String, sFiles As String
Dim wb As Workbook
Dim FileFormat As Long, FileDate As String, Adress As String
Dim objFSO As Object
Dim sFileName As String, sNewFileName As String
sFileName = "//ru22223/1Cdata/Vigruzka.xlsx" 'имя исходного файла отчета
Set objFSO = CreateObject("Scripting.FileSystemObject") 'создаем объект FileSystemObject
If objFSO.FileExists(sFileName) = False Then 'проверяем наличие файла на серваке 1С
MsgBox "Нет файла отчета на сетевом диске", vbCritical, "Дашборд"
Exit Sub
Else
FileDate = FileDateTime(sFileName) 'определяем дату выгрузки
FileDate = Left(FileDate, InStrRev(FileDate, " ") - 1) ' извлекаем только дату в формате текст
FileFormat = 51 ' определяем формат сохранения -> xlsx
sFolder = ThisWorkbook.Path 'записываем путь текущего файла
adress = sFolder & "/Data " & FileDate & ".xlsx" 'определяем путь с новым именем файла пересохраняемого отчета
If objFSO.FileExists(adress) = True Then ' пересохраненный файл уже есть?
MsgBox "Файл этой выгрузки уже есть. Если требуется обновить удалите его из папки с текущим файлом"
Exit Sub
Else
Application.ScreenUpdating = 0 'отключаем оповещения
Application.DisplayAlerts = 0
Set wb = Application.Workbooks.Open(sFileName, False)
wb.SaveAs adress, FileFormat
wb.Close
DoEvents
Application.ScreenUpdating = 1 'включаем оповещения
Application.DisplayAlerts = 1
Range("B4").Value = "Data " & FileDate & ".xlsx"
Range("B7").Value = Now
MsgBox "В папку с дашбордом сохранен Data " & FileDate & ".xlsx", vbInformation, "Дашборд"
End If
End If
End Sub
ps. задача изначальная обработать выгрузку 1С средствами PowerQuery и получить 100500 графиков. выгрузка формируется еженедельно и лежит на внешнем сервере. обработчик должен быть универсальным для любого пользователя. почти все пользователи работают через Sharepoint. я пошел по пути: открыть и сохранить выгрузку в нужном формате в папке с обработчиком. потом обрабатывать получившийся файл средствами PowerQuery. Наткнулся на то что второй раз он не сохраняет файл если запускаю из синхронизируемой папки.
Коллеги, добрый день. автоматизирую манипуляции с выгрузкой 1С формат файла для последующего использования требует пересохранения. иначе не работает PowerQuery. но т.к. файл очень объемный нужно добавить в макрос проверку наличия файла с выгрузкой 1С на сервере и наличие пересохраненного файла у пользьзователя. Но почти все пользователи в компании сидят на OneDrive (Sharepoint) Dir - ругается чем и как сделать?
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
написал: источник = Excel.CurrentWorkbook(){[Name="Запрос 1"]}[Content]
По факту это то что я использую. Запрос с именем "Результат объединения" выгружает результат на страницу в таблицу "Результат_объединения", я создаю новый запрос из данных этой таблицы. и получаю Источник = Excel.CurrentWorkbook(){[Name="Результат_объединения"]}[Content]
если подставлять название запроса вместо названия выгруженной таблицы выдает ошибку Expression.Error: Не найдена таблица Excel с именем "Результат объединения".
Тогда не понятно о чем речь:
Цитата
Вот и корень проблемы. Я же правильно понял, что речь о запросах PQ?Не делайте запрос из выгруженной на лист таблицы, а ссылайтесь на запрос в PQ. При обновлении запроса все запросы, на которые ссылается текущий, будут пересчитаны в любом случае.
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Вот и корень проблемы. Я же правильно понял, что речь о запросах PQ? Не делайте запрос из выгруженной на лист таблицы, а ссылайтесь на запрос в PQ. При обновлении запроса все запросы, на которые ссылается текущий, будут пересчитаны в любом случае.
Разве в этом случае любой запрос ссылающийся на предыдущий приведет к повторному исполнению первого? ( на примере описания PBI https://learn.microsoft.com/ru-ru/power-bi/guidance/power-query-referenced-queries) т.е. представим что первый запрос обновляется две минуты. А второй и последующие 100 шт это несколько простых операций над результатом первого. выполнение шагов кторых занимают по паре секунд. Если ссылаться во всех из них на первый запрос, то результат обновления будет 200 минут + 200 сек. если делать промежуточную таблицу - 2 мин + 200сек на все остальные. или мое представление некорректно?
Цитата
Цитата
Павел Воробей написал: нужна строгая последовательность выполнения запросов
не выполняется
Да не выполняется, похоже ввел всех в заблуждение. Принцип как делать уяснил, спасибо! Вместо цикла прописываем последовательнось команд для обновления каждого отдельного запроса. При решении столкнулся с ошибкой скрипта. Оказалось дело в названии запросов. Выяснил это когда вывел на страницу названия через другой код.
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Sub KeyPush() Dim ws As Worksheet, oc As Object, IsBG_Refresh As Boolean, pt As PivotTable
'Перебираем все запросы и обновляем в цикле For Each oc In ThisWorkbook.Connections IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery oc.OLEDBConnection.BackgroundQuery = False oc.Refresh oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh Next
'Перебираем все сводные и обновляем их For Each ws In ThisWorkbook.Worksheets For Each pt In ws.PivotTables pt.RefreshTable Next pt Next ws
'Выводим сообщение MsgBox "Запросы обновлены", vbInformation,
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
отключил но, не решает проблему. первый запрос обновляется сильно дольше остальных. последний запрос сделан на выгруженных результатах первого менее сложен и обновляется куда быстрее. получается что при изменении источника данных (внешнего файла с отчетом 1С) последний запрос обновляет старые данные, потом только прогружается первый тяжелый запрос и в итоге на дашборде проходят только частичные обновления. по идее нужна строгая последовательность выполнения запросов и потом обновление сводных
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
В файле много запросов некоторые из которых очень большие и несколько этапов вычислений в том числе через сводные таблицы. Один запрос преобразует файл с данными из отчетов 1С, другой обрабатывает уже обработанное ит тд.
нужно чтобы обновление проходило последовательно сначала запросы потом одни сводные потом другие сводные. сейчас если заменить файл отчета, то только после трех нажатий обновить все запросы и таблицы обновлябтся.