Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
PQ/PBI узнать откуда выполняется обновление, из десктопа или из службы pbi/ репортсервера
 
Добрый день!
Есть опубликованный в https://app.powerbi.com/ дашборд, в дашборде есть ЗапросХ. Дашборд регулярно дорабатывается в десктопе (и соответственно обновляется). Необходимо чтоб ЗапросХ выполнялся/обновлялся только если обновление происходит с сервера.
Есть какие нибудь варианты при выполнении запроса в PQ определить, запрос выполняется из десктопа или с сервера pbi?

Изначально мне решение показалось очень простым, типа взять какую нибудь папку, которая точно есть на компе, но нет на сервере pbi (например "c:/users"), и если она существует, значит обновление происходит из десктопа, если нет - с сервера.
Т.е. если try ( Folder.Files("c:/users") ) [HasError] - значит запрос с сервера и можно обновлять ЗапросХ, если же [HasError] = false - значит из десктопа и ничего не обновляй.
Но проблема в том, что при публикации дашборда необходимо подключить все источники данных, поэтому при подключении "c:/users" она как бы в любом случае будет существовать, поэтому этот вариант оказался неработоспособен.

Вторая попытка - запулить через web.page() JS скрипт, который бы возвращал computerName, и исходя из этого имени уже определять откуда идет выполнение запроса. Но это тоже не сработало, т.к. из веба невозможно получить computerName.

Прошу поделиться идеями как еще это можно было бы решить (определить откуда происходит запрос на выполнение запроса, из десктопа или с сервера)?
DAX наложение на таблицу условия ALL/ALLSELECTED в зависимости от выбранного параметра
 
Вопрос такой:
допустим есть какая-то таблица и слайсер, который переключается в положения 1, 2 и 3.
В зависимости от выбора на слайсере надо сделать (далее цифра соответствует выбору на слайсере):
1 - просто посчитать сумму:
Код
 CALCULATE( SUM( какое-то числовое поле таблицы) ) 


2 - посчитать сумму, убрав контекст с одного столбца:
Код
 CALCULATE(
SUM( какое-то числовое поле таблицы),
ALL('Таблица'[Столбец1])
)


3 - посчитать сумму, убрав контекст со всей таблицы:
Код
 CALCULATE(
SUM( какое-то числовое поле таблицы),
ALL('Таблица')
)


Можно ли, в целях НЕповторения кода, реализовать наложение условия ALL на таблицу в зависимости выбора на слайсере? Типа: если выбрано то-то, то наложи на таблицу ALL по столбцу 1, а если выбрано се-то, то наложи ALL на всю таблицу.
Подготовил пример, там есть "Мера1". В первом варианте она считается "длинно" (с повторениями кода), во втором варианте (закомментирован тамже в мере ниже) как бы хотелось сократить ее написание.

Простые условия фильтрации таблицы в зависимости от параметра, типа "если в параметре выбрано 1, то наложи условие, что 'Таблица'[Столбец1]="красный", а если нет, то что 'Таблица'[Столбец1]="зеленый" ", работают.
Но когда дело касается наложения ALL/ ALLSELECTED, то компилятор ругается.

Возможно нифига непонятно из того что я написал, но в примере думаю будет возможно понять о чем речь.
Надо там раскомментировать variable "short solution" и соответственно его вернуть в Result.
Изменено: VasiliY_Seryugin - 13.03.2023 14:29:59
DAX Сводные данные (SUMMARIZE) из табличного выражения
 
Всем привет.
Есть исходная Таблица1 в модели данных.
Я создаю новую Таблицу2, которая считается в 2 этапа:
VAR Tbl1 - создается табличное выражение через обработку Таблицы1 функцией SUMMARIZE, допустим оно содержит поля "ID клиента", "Дата платежа", "Дни задержки по платежу"
VAR Tbl2 - хочу сделать в том же коде создания Таблицы2 SUMMARIZE от Tbl1, где уже агрегировать данные только по "ID клиента" из Tbl1 (без строк с датами платежа), и в качестве расчетного поля также посчитать сумму по полю Tbl1 "Дни задержки по платежу".
Т.е. делаю:
VAR Tbl2=
SUMMARIZE(
   Tbl1,
   [ID клиента],
   "Сумма дней задержек оплат клиента", {тут д.б. формула суммы дней задержек оплат за все даты платежа по клиенту}
)

Не могу это сделать, т.к. чтоб посчитать сумму "Дней задержки по платежу" из Tbl1, не могу использовать CALCULATE (SUM ... (не работает с полями табличных выражений), а вариант через SUMX(Tbl1,[Дни задержки по платежу]) возвращает мне соответственно сумму всех дней задержки по платежу по всем ID клиента, а не по контексту конкретного ID.
Заворачивание SUMX в CALCULATE, чтоб попытаться передать контекст текущей расчитываемой строки сводной таблицы, тоже не работает (  CALCULATE(SUMX(Tbl1,[Дни задержки по платежу]) ), также возвращает сумму всех дней для всех клиентов, а не для текущего ID.

Итого вопрос: если у меня есть табличное выражение, как можно в том же коде сделать из него свод и сагрегировать (просуммировать) одно из его полей для каждой сводимой строки?
Создание подпапок для полей сводной таблицы/ модели данных
 
Всем привет!
Можно ли в экселе/ Power Pivot для полей сводной таблицы создать свои подпапки/ подкатегории.
Например у меня есть сводная таблица на основе модели данных, справа в экселе я вижу все поля сводной таблицы (либо в том порядке, в котором они загружены, либо их можно отсортировать по алфавиту, эксель 2019 такое умеет).
Допустим я вижу такой список полей:
- наименование клиента
- инн клиента
- регион клиента
- номер договора
- дата договора
- сумма договора

Если таких полей много, то с ними соответственно не очень удобно работать, хотелось бы их объединить в смысловые группы (например как в PBI, где можно создавать подпапки внутри таблицы и перетаскивать туда меры).
Можно ли как то сделать такие подпапки в полях сводной таблицы, чтоб я видел в списке полей сводной таблицы что-то типа:
Клиент>
   - наименование клиента
   - инн клиента
   - регион клиента
Договор>
   - номер договора
   - дата договора
Прочие поля>
   - сумма договора

?

Перерыл весь Power Pivot, не нашел такой возможности.
DAX Создание расчетной таблицы через Summarize с переменным условием
 
По DAXу отдельного форума не нашел, смотрю все в эксель пишут, поэтому и я сюда же напишу.
Напишу скорее всего непонятно, но во вложенных примерах все видно и понятно.
Есть 2 несвязанных таблицы. В первой таблице (Заявки) столбцы "Номер заявки" и 3 столбца с датами: дата поступления заявки, дата подписания заявки и дата передачи в лизинг.
Создаю вычисляемую таблицу SlicerTable, с помощью которой можно было бы делать аналог связанных выпадающих списков: типа говоришь "хочу данные по дате поступления заявки", и тебе в срезе показываются только годы, которые есть в столбце "дата поступления заявки". Говоришь "хочу данные по дате подписания договора", и тебе в срезе только годы, которые есть в столбце "дата подписания договора", и т.д.
Сделал SliserTable, вывел 2 среза на лист, все работает.

Дальше есть таблица "Регионы". В ней есть поле с годом. Хочу, чтоб при выборе года в созданном срезе по годам у меня выводились на лист данные из "Регионы" только по выбранному году (напомню, что связи между таблицами нет. Можно конечно сделать костыль через дополнительную таблицу с уникальными годами, но я хочу понять как это без костыля сделать).
Создаю сводную вычисляемую таблицу из таблицы "Регионы", где говорю, что выведи мне регионы, кол-во заявок и сумму для этих регионов, но с условием, что год должен быть равен выбранному году на ранее выведенном срезе по годам. И вот эта операция не работает. Т.е. если я просто создаю сводную таблицу и в условие какой год показывать вбиваю статичную цифру (например, 2020), то сводная строится и все ок. Если же я ей в условие говорю что постройся только по году, равному году в срезе (SELECTEDVALUE), то таблица выводится пустой.
Во вложении эксель и pbix, там все должно быть понятно.

Вопросы:
1. Видимо существует какое-то правило, что в вычисляемой таблице условиями вычисления не могут быть переменные?
2. Как можно это обойти, не строя костыльную таблицу для связывания SlicerTable и "Регионы" по годам?
Selenium работа с Chrome
 
Всем привет!
Скачал селениум, установил, скачал новый chromedriver, заменил в папке селениума родной Chromedriver.exe на вновь скачанный.
Библиотека Selenium в Reference.Tools появилась, установил, пытаюсь работать. Определение переменной как new webdriver/ new chromedriver понимает, не ругается.
Но при .start "Chrome" или .Get "http://блабла"  выдает ошибку Session not created, и чето там про версию Хрома.
Я так понимаю, что для моей версии Хрома нужен другой драйвер. Посмотрел свою версию браузера: Версия 88.0.4324.150 (Официальная сборка), (64 бит).
Залезаю на сайт Гугла с драйверами, нет драйвера для такой версии. Есть для 88.0.4324.96, его как раз и скачал, и с ним как раз и не работает.
Кто нибудь сталкивался? Чего сделать, чтоб заработало? Какой драйвер и где взять? Или дело вообще не в драйвере?
Поиск минимальной даты в ячейках текстового формата через VBA
 
Всем привет! Думаю простой вопрос для знатоков.
Есть лист, на нем есть Range с датами, записанными в текстовом формате. Нужно через VBA в этом Range найти минимальное значение даты.
При этом не нужно менять формат самих ячеек на листе и записывать формулу на лист (через формулу массива, записываемую на листе, я знаю как это сделать, но хочу понять как это делать, ничего не меняя на листе и не записывая на него).
Как это сделать циклом (в т.ч. массивом + циклом) я тоже знаю. Но мне кажется что есть способ просто записать формулу, которая будет работать как формула массива, через WorksheetFunction, и никаких циклов не понадобится. Итого вопрос звучит примерно так: во вложении пример с попытками записать формулы типа "формул массива" через WorksheetFunction. Как их записать правильно?
VBA делать пока код в цикле выдает ошибку (делать до первой неошибочной попытки)
 
Есть цикл, который пытается подставить в базу (аналитический Куб) сегодняшнюю дату и выгрузить на нее определенные данные. Если сегодняшней даты в Кубе нет, то он должен подставлять сегодняшнюю дату -1, если и ее нет, то еще -1 и т.д. до первого успеха.
Как выглядит (записывается) команда в начале цикла Do While (или Do until), чтоб он выполнял цикл, пока операция подстановки не даст НЕ ошибку?

Что-то типа Do while not iserror [операция кода] Loop

Вариант выше не работает. У самого знания матчасти недостаточно чтоб корректно написать.

Текст кода ниже. Все кроме "Do while Not IsError" работает.

Код
Sub Macron1()

Dim i As Long
Dim segodnya, Dt As Date
Dim DtText As String
Dim Pvt As Object

Set Pvt = ThisWorkbook.Worksheets(1).PivotTables("СводнаяТаблица1")
segodnya = Format(Now, "YYYY-MM-DD")

i = 0

Do While Not IsError
    Dt = Format(segodnya - i, "YYYY-MM-DD")
    DtText = Dt

    On Error Resume Next
    Pvt.PivotFields( _
        "[Дата отчета].[Дата отчета].[Дата отчета]").VisibleItemsList = Array( _
        "[Дата отчета].[Дата отчета].&[" & DtText & "T00:00:00]")
    i = i + 1
Loop

End Sub
Как умножить все значения диапазона на 1 внутри формулы?
 
Есть база (КУБ OLAP), из которой выгружаются даты договоров (столбец А) и суммы договоров (столбец В). Даты в столбец А выгружается в текстовом формате (база такая).
Нужно найти, допустим, сумму всех договоров, заключенных после 30.06.2019.
Как можно не создавая дополнительный столбец (где дата будет умножаться на 1 или обрабатываться через --), и не изменяя формата столбца А с выгруженными датами, изменить формат столбца с датами (диапазона) в самой формуле?
Т.е. нужно решение по типу СУММЕСЛИ(диапазон*1;">30.06.2019";диапазон суммирования) . Пример во вложении.
Количество значений в диапазоне, не встречающихся в другом диапазоне
 
Вопрос такой: компания заключает договоры с контрагентами. Нужно посчитать кол-во пришедших новых контрагентов в каждый год.
Есть таблица с годом заключения договора и ID контрагентов, с которыми в этот год заключили договоры. ID уже отDISTINCTчены до уникальных значений.
Задача найти кол-во новых ID в каждый конкретный год, не встречающихся в таблице в предыдущие этому году года.

Вопрос решил, но через создание дополнительного столбца, что не есть хорошо. Хотелось бы без него. И это точно возможно, очевидно через СМЕЩ (я даже заготовки для нее приготовил в столбцах H-J, но что то сам не смог пока осилить).
Просьба помочь с решением. Вариант решения записать в ячейку L4.
Также просьба объяснить, почему формула в столбце D не работает на подсчет новых контрагентов (по аналогии как работает в столбце C).

Пример во вложении.
Обращение к Workbooks.worksheets.range из другой книги
 
Ребят, владею VBA на уровне макрорекордера, поэтому даже элементарных вещей не могу сам осилить.
Поискал через поисковик похожие запросы, но понятного мне ответа не нашел.
Вопрос такой: почему VBA ругается, когда я хочу совершить действие с диапазоном, находящимся в другой книге (в данном случае очистить диапазон), через такое обращение (указание книги, листа и диапазона):
Код
Workbooks("Книга1").worksheets("Лист1").range("A1:B2", Cells.End(xlDown)).ClearContents


Если вначале активировать Книгу1, то ругаться не будет:
Код
workbooks("Книга1").activate
worksheets("Лист1").range("A1:B2", Cells.End(xlDown)).ClearContents


Но ведь как то же можно эту простую команду записать одной строкой, не активируя предварительно книгу, а сразу к ней обращаясь для дальнейших действий?
Как это сделать?


Во вложении пример.
Откройте пример, создайте новую книгу и скопируйте туда кнопки 1 и 2.
При запуске из новой книги Кнопка1 НЕ будет работать (при запуске из родной книги работает).
Кнопка2 работает из любой книги, т.к. в ней стоит предварительная активация нужной книги.
Кнопка3 создана для удобства, чтоб можно было очищенный диапазон восстановить для новых тестов.

Хочу понять, как обратиться к книге "Пример" из другой книги одной строкой, предварительно не используя "Пример".Activate
Извлечь ИНН из текста
 
Задача такая: имею столбец с совершенно криворукими названиями клиентов, которые записаны черти как, абсолютно не системно и не однотипно, но в какой то части их названия присутствует ИНН, который собственно нужно извлечь.
Задача упрощается тем, что слава богу кто-то все-таки догадался перед числовым номером ИНН писать сами буквы "ИНН", поэтому начальную позицию забора текста вычислить не сложно. Но после самого номера ИНН-на еще может продолжаться текст, и ИНН после своего окончания отделен от этого текста либо запятой, либо пробелом, либо открывающей или закрывающей скобкой.
И вот конечную позицию ИНН-на собственно нужно определить позицией первой встречающейся запятой, пробела или открывающей/закрывающей скобки в строке, в которой все до начала самого номера ИНН-на уже откинуто. Как то никогда не доводилось использовать комбинацию =ПОИСК(ИЛИ(искомый текст1; искомый текст2)...     Сейчас к своему удивлению выяснил, что такая комбинация не работает.
Можно конечно это решить через ЕСЛИОШИБКА(ПОИСК(",";текст где ищем);ЕСЛИОШИБКА(ПОИСК(" ";текст где ищем);ЕСЛИОШИБКА(ПОИСК("(";текст где ищем);ЕСЛИОШИБКА(ПОИСК(")";текст где ищем)...     Но это в данном случае у меня всего 4 варианта окончания номера ИНН. А если их будет 100? Не вариант 100 раз писать ЕСЛИОШИБКА (да и длины ячейки не хватит).

Код
ПОДСТАВИТЬ(текст;ИЛИ(",";" ";"(";")");"*")
тоже не работает.

Как можно емко определить номер позиции одного из четырех искомых символов, который первым встретится в тексте ячейки?
Пропуск операции в коде VBA, если она занимает более заданного времени
 
Добрый день!
Есть макрос, который выполняет некоторые операции (забор данных из КУБов OLAP), потом переносит эти данные в плоскую динамическую таблицу, а затем обновляет таблицу в другой книге Excel с SQL запросом к базе (SQLOLEDB), и после обновления запроса также добавляет полученные данные в динамическую таблицу.
Проблема в том, что база, к которой делается SQL запрос, в некоторые моменты дня очень долго отдает данные, в связи с чем иногда весь макрос отрабатывает за 30 мин., а иногда за 3-4 часа.
Возможно ли сделать какое то условие в коде, что если этап обновления SQL запроса превышает, скажем, 15 мин, то пропустить этот шаг?
Написать тайм1 и тайм2 и сделать IF Time2-Time1>15 минут соответственно нельзя (по крайней мере с тем объемом знаний, каким я располагаю), потому что эта проверка IF будет следовать в коде уже после операции обновления SQL запроса,  соответственно она становится бессмысленной.
Есть какие идеи на этот счет?

Либо устроит вариант, чтоб во время обновления SQL запроса выводилась форма, которая оставалась бы активной, и пользователь сам при понимании, что запрос сильно подзавис, мог бы нажатием на соответствующую кнопку останавливать обновление SQL запроса и заставлять макрос переходить к следующему шагу кода.


Пример текущего кода:
Код
Sub Макрос
'всякие различные действия ...

Workbooks.Open Filename:= _
        "\\Путь\Таблица_с_SQL_запросом.xlsb"   'открываем файл с SQL подключением для его обновления
Windows("Таблица_с_SQL_запросом.xlsb").Activate
Sheets("1").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False  'обновляем SQL запрос. Вот этот этап иногда затягивается на неприличное время, и если оно превышает, допустим, 15 мин., то этот этап надо пропустить

'всякие различные последующие действия...

End Sub
[ Закрыто] ЕСЛИНОЛЬ
 
Есть формула типа: =ЕСЛИ("супердлинное условие"=0;"не найдено";"супердлинное условие")
Можно как то дважды в формуле супердлинное условие не писать?
Т.е. есть ли что-то типа ЕСЛИОШИБКА для такого случая?
Вроде: =ЕСЛИНОЛЬ("супердлинное условие";"не найдено")
Протяжка дат на основании первой выставленной даты
 
Всем привет!
Задача в целом не сложная и ее я уже решил, но интересует вопрос оптимизации, наверняка это можно сделать какой то более короткой, простой и человеческой формулой, чем моя.
Суть вопроса: Предположим, что нам надо создать график платежей (например, по кредиту). График платежей ежемесячный. В расчетном файле есть базовая ячейка, куда вставляется дата, и исходя из этой даты далее формируется график платежей с датой платежа на каждый последующий месяц. Но есть нюансы:
1. Если день базовой даты = 31, то далее ячейки заполняются по условию, что дата каждого следующего платежа приходится на последний день каждого последующего месяца;
2. Если день базовой даты <> 31 числу, то далее ячейки заполняются тем же числом для каждого последующего месяца, что и день в базовой дате (кроме соответственно случая, когда день в базовой дате =31, 30 или 29, тогда для всех месяцев кроме февраля подставляется день из базовой даты, а в февраль подставляется последний день февраля для соответствующего года (исходя из того високосный он или нет).

Пример с решением во вложении.
Хочется увидеть более короткую формулу, которая решает эту задачу.
Поиск значения, по которому имеется максимальная сумма в другом столбце
 
Всем привет!
Имею очень простую на первый взгляд задачу, но уже более половины дня потратил, а решения самостоятельно так и не придумал.
Пытался искать ответ, но понял, что даже сформулировать нормально для поисковика эту задачу не могу.
Задача элементарно решается через сводную таблицу, но мне крайне интересно, как ее решить просто одной формулой.

Задача такая: имею 2 столбца, в первом столбце (А) в строках указаны годы (каждый год может энное кол-во раз повторяться в строках), во втором столбце (В) - сумма продаж в этот год.
Нужно одной формулой в одной ячейке определить год, в который совершилось наибольшее кол-во продаж.
Вроде все очень просто, но либо я в упор не вижу элементарного решения, либо оно действительно не совсем элементарное.

Максимальную сумму продаж по уникальному году могу найти через
Код
={МАКС(СУММЕСЛИ(Таблица1[Год продажи];Таблица1[Год продажи];Таблица1[Сумма продаж]))}


Но уже часа 4 не могу понять, как сделать так, чтоб выдавало, а в каком собственно году случилась эта максимальная сумма продаж.

Пример во вложении.
Отображение времени работы макроса на UserForm
 
Всем привет! Я только знакомлюсь с VBA, поэтому возможно кому то мой вопрос покажется очень примитивным, но тем не менее я его задам.
Есть отчет в Excel, суть которого заключается в том, что на одном листе книги в сводной таблице (КУБ OLAP) я (или любой другой пользователь) выбираю значение поля "Дата", называю это значение именем переменной, и затем макрос на остальных листах книги во все КУБы OLAP подставляет в поле "Дата" значение заданной переменной. При этом информация для каждого КУБа выгружается довольно долго, например 10 мин. Возникла необходимость в индикации процесса, чтоб юзер мог понимать, что отчет не завис и сейчас находится примерно на такой-то стадии отработки.
Я погуглил, нашел как сделать простейший прогрессбар  через Юзерформ. Label1 у меня - это линия индикации выполнения задачи, Label2 - надпись, где отображается % выполнения. Сделал, все работает. Код опубликую в сообщении ниже.
Но проблема в том, что после того, как UserForm отобразился, начинает грузиться первый КУБ, который грузится 10 мин., и все эти 10 мин. пользователь видит стоящую на месте полосу загрузки и надпись "Выполнено 5%". У меня возникла задача сделать так, чтоб хоть что то происходило на UserForm в это время. Даже не обязательно чтоб ползла полоса загрузки, а просто хотяб чтоб время шло. Я добавил на Userform отображение времени, но время также замирает на время загрузки КУБа.
Выбор значения для соответствующей даты по диапазону, в котором находится искомая дата
 
Всем привет!
У меня такая ситуация: есть размер ставки рефинансирования и диапазоны дат, в которые ставка рефинансирования имела соответствующее значение.
Так же есть отдельные даты календаря. Мне нужно узнать для каждой из этих конкретных дат, каково было значение ставки рефинансирования в эту дату.
Пример во вложении. Столбец для искомых значений выделен желтым.
 
Страницы: 1
Наверх