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
Единственное работает не когда ставится фильтр а когда после установки фильтра какое то действие с ячейкой происходит.
Проверка наличия фильтра в умной таблице VBA
Пользователь
Сообщений: Регистрация: 11.12.2021
25.08.2024 19:25:42
Есть задача отслеживать наличие фильтрации в умной таблице и менять стиль таблицы. думал что по 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
Изменено: - 25.08.2024 19:26:37
Расчет средней наработки на момент времени в прошлом, Как пользоваться суммеслимн для вычисления по условию
Пользователь
Сообщений: Регистрация: 11.12.2021
10.04.2023 12:59:24
Спасибо за подсказку принципа. понял как работает. Нашел ошибку, адаптировал. =СРЗНАЧ(ЕСЛИ(([@[Отчетная Дата]]>Отчет[Монтаж])*([@[Отчетная Дата]]<ф_дата);[@[Отчетная Дата]]-Отчет[Запуск];""))
Изменено: - 10.04.2023 13:01:20
Расчет средней наработки на момент времени в прошлом, Как пользоваться суммеслимн для вычисления по условию
Пользователь
Сообщений: Регистрация: 11.12.2021
10.04.2023 11:44:43
Цитата
написал: Так?
Нет. результат некорректный получился. посмотрите 12 сообщение. может понятнее будет.
И интересно стало что за ф_дата в формуле. Не нашел где прописано значение.//нашел возможно подход правильный. щас разбираюсь в нюансах
Изменено: - 10.04.2023 12:23:03
Расчет средней наработки на момент времени в прошлом, Как пользоваться суммеслимн для вычисления по условию
Пользователь
Сообщений: Регистрация: 11.12.2021
10.04.2023 10:43:32
Написал в самом файле. Не знаю как еще проще объяснить.
Расчет средней наработки на момент времени в прошлом, Как пользоваться суммеслимн для вычисления по условию
Пользователь
Сообщений: Регистрация: 11.12.2021
10.04.2023 10:16:11
мне нужно чтобы значения наработки были в столбце "Средняя наработка действующего оборудования для обычный" таблицы на вкладке вычисления пример как вычисляется для сегодняшней дыты я показал полного примера у меня нет ибо нужно вручную 500 значений для 5ти типов двигателей посчитать. а такие значения в целом нужны и по другим условиям. нужен принцип вычисления или подход к решению такой задачи.
Все еще не понятно в чем задача?
Расчет средней наработки на момент времени в прошлом, Как пользоваться суммеслимн для вычисления по условию
Пользователь
Сообщений: Регистрация: 11.12.2021
10.04.2023 08:34:13
Цитата
тогда вот так:
Код
=СРЗНАЧЕСЛИМН($F:$F;$C:$C; "" )
это не то. Эта формула подойдет только для даты равной сегодня в таблице вычислений. а ее нужно всю заполнить значениями средней наработки и медианной наработки. нужна формула для вычисления всех вариантов на даты конца месяца (уже есть в таблице) или хотябы ответ на вопрос Как в эту формулу подставить разность дат вместо диапазона значений наработки ($F:$F) проблема именно в том что наработка на неделю раньше будет включать оборудование которое еще не отказало например и не будет включать оборудование которое еще не смонтировано. т.е. для каждой вычисляемой даты наработка в каждой строке отчета это индивидуальный результат.
Изменено: - 10.04.2023 09:37:43
Расчет средней наработки на момент времени в прошлом, Как пользоваться суммеслимн для вычисления по условию
Пользователь
Сообщений: Регистрация: 11.12.2021
10.04.2023 08:17:04
Поправил пример. отфильтровал по колонке остановка. получил в строках таблицы только оборудование которое работает на сегодня. в доп столбце посчитал наработку на сегодня простой формулой. в отдельной ячейке вычисляется средняя наработка для оборудования на сегодня.
это ручной способ. нжны только значения наработки на даты.
Изменено: - 10.04.2023 11:45:08
Расчет средней наработки на момент времени в прошлом, Как пользоваться суммеслимн для вычисления по условию
Пользователь
Сообщений: Регистрация: 11.12.2021
10.04.2023 07:54:09
На вкладке отчет вариант части табличных данных отчета на вкладке вычисление пример вычисления количества работающего оборудования по типу двигателя на нужную дату. данные собираются для построения графика динамики показателя.
Задача: для каждого типа двигателя среди работающего на дату (как в примере) подсчитать среднюю и медианную наработку в примере отбор только по одному варианту условия, в действительности нужно решение для использования множественного условия
Изменено: - 10.04.2023 08:13:22
Расчет средней наработки на момент времени в прошлом, Как пользоваться суммеслимн для вычисления по условию
Пользователь
Сообщений: Регистрация: 11.12.2021
10.04.2023 06:50:33
пример в 11 сообщении. Есть массив данных о смонтированном оборудовании. он содержит в строках тип оборудования а в столбцах даты монтажа запуска остановки и демонтажа. столбец наработка вычисляется на момент выгрузки отчета в доп колонку. для остановленного оборудования наработка считается с момента запуска до остановки. для работающего с момента запуска до даты отчета.
Вопрос как посчитать среднюю наработку по множественному условию понятен и легко выполняется через суммеслимн и счетеслимн. а вот задача посчитать наработку на действующем фонде оборудования на момент времени в прошлом. (на конец каждого месяца начиная с 2015 года и до сегодня) не понятна. и тем более непонятно как посчитать медианную наработку. т.е. надо посчитать разность между заданной датой конца месяца и датой запуска для всего оборудования у которого нет остановки на момент времени. или хотя бы получить массив чисел с наработками оборудовани для последующей обработки.
Изменено: - 10.04.2023 12:36:02
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
20.02.2023 14:06:38
Цитата
написал:
Цитата
написал: программер обслуживающий 1С говорит что это тот самый xlsx.
пусть поменяет на csv
нет такого варианта.
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 15:36:42
те же приколы но с ними можно уже жить. если удалить файл из папки обработчика - программа считает что он есть и даже открывает его до завершения синхронизации. появляется открытие закрытие. (можно ли это в фоне оставить интересно?) и обратное событие откабатывает с выдачей системной ошибки что нет доступа к файлу а потом только выполнение.
Код
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
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 14:59:21
Цитата
написал: вот здесь и надо подробнее пояснять. Что значит "не сохраняет"? Причину определили? Не сохраняет кодом? А до сохранения вообще доходит? На чем "валится" код - что мешает ему сохранить или дойти до строки сохранения?
Выдает ошибку метода 1004 при выполнении 32 строки. связываю это с процессом отложенной синхронизации OneDrive. потому что ошибку дает только если подряд два раза выполнять макрос. если перерыв будет - все работает
Цитата
написал: Почему нельзя попробовать приведенный мной код?
Щас попробую.
Цитата
написал: а формат то какой? почему не пойти от корня проблемы?
программер обслуживающий 1С говорит что это тот самый xlsx. но возможно с нюансами создания из 1С. если файл сразу запихивать в запрос PowerQuery то он не видит структуры. пишет : DataFormat.Error: Входные данные не удалось распознать как допустимый документ Excel. Сведения: [Binary]
погуглил решение - написали пересохранять
Цитата
4 сообщение какое понимание или пояснение проблемы дает?
Прошу простить, не туда посмотрел, в 3 сообщении писал.
Изменено: - 16.02.2023 15:01:05
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 14:20:06
Видимо не прочитали 4 сообщение, повторю:
Задача изначальная обработать выгрузку 1С средствами PowerQuery и получить 100500 графиков. Обработчик должен быть универсальным для любого пользователя. почти все пользователи работают через Sharepoint. Обработчик тоже будет предоставлен в виде доступа к папке группы в тимс или на OneDrive проблема: выгрузка формируется еженедельно и лежит на внешнем сервере. сама структура файла выгрузки не позволяет его сразу использовать средствами PowerQuery. решение в интернете говорит что надо пересохранить в нужном формате. Если есть файл с нужным форматом - Обработка работает.
я пошел по пути: макросом открыть и сохранить выгрузку в нужном формате в папку с обработчиком. (на внешнем сервере сохранять левые файлы нельзя) потом обрабатывать получившийся файл средствами PowerQuery. Наткнулся на то, что второй раз он уже не сохраняет файл если запускаю из синхронизируемой папки (Sharepoint). ругается и сбрасывает выполнение макроса. т.е. надо делать ограничения и проверки на наличие файла, а это тоже не работает.
Изменено: - 16.02.2023 14:22:23
Проверка наличия файла на OneDrive или внешнем сервере
потому что его там нет, а цель стоит в автоматизации. т.е. любой пользователь с доступом к расшаренной папке с обработчиком должен получить результат в виде обработки. поэтому сначала файл с общего сервера закидывается в папку пользователя, а потом обрабатывается.
это не отменяет проблемы но, возможно в моем случае проще по другому организовать автоматизацию.
Изменено: - 16.02.2023 13:48:55
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 13:06:25
Цитата
написал: надо подключить сетевой диск к ПК, чтобы ему была назначена литера(имя диска)
это должен делать каждый пользователь локально или это кодом можно прописать?
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 12:46:11
Нашел похожую проблему но не понял решение.
Проверка синхронизации файла при работе с OneDrive
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 11:20:49
При обработке файла посредством PowerQuery использую конструкцию:
Код
Content = if Text.StartsWith(fParam("Path"),"https://") then Web.Contents(fParam("Path")) else File.Contents(fParam("Path")),
Источник = Excel.Workbook(Content, null, true),
НО если файл еще не синхронизировался в папке - выдает ошибку доступа к файлу.
каким образом обойти этот момент?
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 10:15:33
Цитата
написал:
Цитата
написал: не знаю как правильно код вставить чтобы комменты остались
перед копированием кода включите русскую раскладку
Поправил
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 09:59:52
Не работает с OneDrive. файл из которого запускается макрос имеет адрес: т.е. строка 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. Наткнулся на то что второй раз он не сохраняет файл если запускаю из синхронизируемой папки.
Изменено: - 16.02.2023 10:52:48
Проверка наличия файла на OneDrive или внешнем сервере
Пользователь
Сообщений: Регистрация: 11.12.2021
16.02.2023 09:20:51
Коллеги, добрый день. автоматизирую манипуляции с выгрузкой 1С формат файла для последующего использования требует пересохранения. иначе не работает PowerQuery. но т.к. файл очень объемный нужно добавить в макрос проверку наличия файла с выгрузкой 1С на сервере и наличие пересохраненного файла у пользьзователя. Но почти все пользователи в компании сидят на OneDrive (Sharepoint) Dir - ругается чем и как сделать?
Изменено: - 16.02.2023 10:22:23
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Пользователь
Сообщений: Регистрация: 11.12.2021
12.01.2023 11:07:31
Цитата
написал: источник = Excel.CurrentWorkbook(){[Name="Запрос 1"]}[Content]
По факту это то что я использую. Запрос с именем "Результат объединения" выгружает результат на страницу в таблицу "Результат_объединения", я создаю новый запрос из данных этой таблицы. и получаю Источник = Excel.CurrentWorkbook(){[Name="Результат_объединения"]}[Content]
если подставлять название запроса вместо названия выгруженной таблицы выдает ошибку Expression.Error: Не найдена таблица Excel с именем "Результат объединения".
Тогда не понятно о чем речь:
Цитата
Вот и корень проблемы. Я же правильно понял, что речь о запросах PQ?Не делайте запрос из выгруженной на лист таблицы, а ссылайтесь на запрос в PQ. При обновлении запроса все запросы, на которые ссылается текущий, будут пересчитаны в любом случае.
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Пользователь
Сообщений: Регистрация: 11.12.2021
12.01.2023 09:46:49
Эту статью видел читал изучал. Спасибо за труд. С обновлением всего, частичного, последовательного и остальных разобрался. Еще раз спасибо.
Вопрос
Цитата
написал: Тогда как будет выглядеть строка с источником?
Был про
Цитата
написал: Не делайте запрос из выгруженной на лист таблицы, а ссылайтесь на запрос в PQ.
Как именно будет выглядеть строка на языке М с именем запроса "Запрос 1"? источник = ...?
Изменено: - 12.01.2023 09:47:41
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Пользователь
Сообщений: Регистрация: 11.12.2021
12.01.2023 08:20:06
Тогда как будет выглядеть строка с источником?
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Пользователь
Сообщений: Регистрация: 11.12.2021
12.01.2023 05:54:18
Цитата
Вот и корень проблемы. Я же правильно понял, что речь о запросах PQ? Не делайте запрос из выгруженной на лист таблицы, а ссылайтесь на запрос в PQ. При обновлении запроса все запросы, на которые ссылается текущий, будут пересчитаны в любом случае.
Разве в этом случае любой запрос ссылающийся на предыдущий приведет к повторному исполнению первого? ( на примере описания PBI ) т.е. представим что первый запрос обновляется две минуты. А второй и последующие 100 шт это несколько простых операций над результатом первого. выполнение шагов кторых занимают по паре секунд. Если ссылаться во всех из них на первый запрос, то результат обновления будет 200 минут + 200 сек. если делать промежуточную таблицу - 2 мин + 200сек на все остальные. или мое представление некорректно?
Цитата
Цитата
написал: нужна строгая последовательность выполнения запросов
не выполняется
Да не выполняется, похоже ввел всех в заблуждение. Принцип как делать уяснил, спасибо! Вместо цикла прописываем последовательнось команд для обновления каждого отдельного запроса. При решении столкнулся с ошибкой скрипта. Оказалось дело в названии запросов. Выяснил это когда вывел на страницу названия через другой код.
Изменено: - 12.01.2023 06:43:14
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Пользователь
Сообщений: Регистрация: 11.12.2021
11.01.2023 13:02:17
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,
End Sub
Изменено: - 12.01.2023 05:55:39
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Пользователь
Сообщений: Регистрация: 11.12.2021
11.01.2023 10:44:07
отключил но, не решает проблему. первый запрос обновляется сильно дольше остальных. последний запрос сделан на выгруженных результатах первого менее сложен и обновляется куда быстрее. получается что при изменении источника данных (внешнего файла с отчетом 1С) последний запрос обновляет старые данные, потом только прогружается первый тяжелый запрос и в итоге на дашборде проходят только частичные обновления. по идее нужна строгая последовательность выполнения запросов и потом обновление сводных
Изменено: - 11.01.2023 10:44:57
Кнопка обновления запросов, Нужно сделать так чтобы обновление проходило последовательно сначала запросы в определенном порядке. потом одни сводные, потом другие сводные
Пользователь
Сообщений: Регистрация: 11.12.2021
11.01.2023 09:33:34
В файле много запросов некоторые из которых очень большие и несколько этапов вычислений в том числе через сводные таблицы. Один запрос преобразует файл с данными из отчетов 1С, другой обрабатывает уже обработанное ит тд.
нужно чтобы обновление проходило последовательно сначала запросы потом одни сводные потом другие сводные. сейчас если заменить файл отчета, то только после трех нажатий обновить все запросы и таблицы обновлябтся.
Получениет серии данных из одной сводной но при разных срезах и при пересчете в исходной таблице,
Пользователь
Сообщений: Регистрация: 11.12.2021
11.01.2023 09:28:31
Задача решена функцией СЧЁТЕСЛИМН вместе с ДВССЫЛ
Power Query и создание таблиц с датами, Нужна подсказка как создать список дат концов месяца от даты до даты
Пользователь
Сообщений: Регистрация: 11.12.2021
09.01.2023 09:02:01
Коллеги, спасибо справился, написал вопрос как раз уже почитав эту статью. просто не получалось все собрать в единое целое.