Коллеги, здравствуйте. В Power Query - сильно новичок, занимаюсь этим инструментом сильно эпизодически. Это я про то, что если ответы будут сильно умные - я их просто не пойму, поэтому попроще, пожалуйста, ладно? Вопрос вот в чем: Есть набор дат. Есть дата отсчета (например, 16.03.2023). Эти даты могут принадлежать текущей неделе, могут отстоять от даты отсчета на минус одну неделю, минус 2 недели и т.д. Стоит задача - силами Power Query определить первую рабочую дату для каждой недели и последнюю рабочую дату для каждой недели и как-то их отметить. Как отметить недели (минус первая, минус вторая и т.д.) я худо-бедно разобрался. Как вывести номер дня недели для даты - тоже. А вот как дальше - у меня затык. Помогите, пожалуйста. В примере расписал подробно. Получившийся у меня запрос:
Скрытый текст
Код
let
//забираем данные и слегка их трансформируем
Source = Table.TransformColumnTypes(Excel.CurrentWorkbook(){[Name="tb_Date"]}[Content], {{"Date", type date}}),
My_date = #date(2023,3,16),//это я так немудрено задал дату отсчета, зачем только? Пока сам не понял.
//тут я логическими конструкциями вывожу к "минус какой" неделе относится конкретная дата
What_Week = Table.AddColumn(Source,"What_Week", each
if Date.IsInPreviousNWeeks([Date],3) and not(Date.IsInPreviousNWeeks([Date],2)) and not(Date.IsInPreviousNWeeks([Date],1)) then -3
else if Date.IsInPreviousNWeeks([Date],3) and Date.IsInPreviousNWeeks([Date],2) and not(Date.IsInPreviousNWeeks([Date],1)) then -2
else if Date.IsInPreviousNWeeks([Date],3) and Date.IsInPreviousNWeeks([Date],2) and Date.IsInPreviousNWeeks([Date],1) then -1
else null),
WeekDay = Table.AddColumn(What_Week,"Week_Day", each Date.DayOfWeek([Date],Day.Monday))
in
WeekDay
// А ВОТ ДАЛЬШЕ КАК? КАК ОТМЕТИТЬ ПЕРВЫЙ И ПОСЛЕДНИЙ РАБОЧИЙ ДЕНЬ КОНКЕТНОЙ НЕДЕЛИ?
Здравствуйте, уважаемые коллеги. Прошу пояснить по следующему вопросу - почему, когда я пишу в коде вывод информационного сообщения через MsgBox, например
редактор не требует использовать аргументы в скобках, более того активно против них протестует, но если я захочу отслеживать нажатие кнопок (например)
Код
i = MsgBox("Mamma mia!", vbAbortRetryIgnore + vbCritical, "Important!")
то при отсутствии скобок идет несусветная ругань. Единственное, что хоть как-то может относиться к указанной теме в справке по функции нарыл вот что:
Код
Для указания более одного именованного аргумента необходимо использовать функцию MsgBox в выражении.
Но понятнее от этого не стало. В первом случае не возвращается значение, в этом разница? Т.е. скобки это некий признак, что с ними это функция - и возвращает значение, а без - просто специфическое средство самовыражения?
Здравствуйте, уважаемые! Осваиваю Power Query, опыта в нем - с гулькин этот... как его... нос, во! Вопрос в чем - есть данные в CSV (выгрузка биржевых данных) строк так на 3000. Стоит задача присобачить 2 скользящие средние. Периоды скользящих средних задаются в таблице параметров (tb_parametrs). Добавляю скользящие средние через подсмотренный прием с использованием индекса, List.Average, List.Range. НО ЧЕГО ТАК ДОЛГО-ТО?! На обновление запроса из 3000 строк данных уходит порядка 50-60 секунд. Формулами на листе такой объем при вычислении скользящих средних через СМЕЩ и т.д. делается мгновенно почти. А тут так тупит. Процессор при выполнении запроса грузится максимум до 40%, память до 50%. Подскажите, в чем может быть затык, или это для Power Query нормальная скорость?
Спасибо за внимание. Текст запроса - под спойлером.
Скрытый текст
Код
let
MA_fast_step=Excel.CurrentWorkbook(){[Name="tb_parameters"]}[Content]{0}[MA_fast],
MA_slow_step=Excel.CurrentWorkbook(){[Name="tb_parameters"]}[Content]{0}[MA_slow],
Источник = Csv.Document(File.Contents("ТутПолныйПутьКФайлу\FEES_090101_210630.txt"),[Delimiter=",", Columns=7, Encoding=1251, QuoteStyle=QuoteStyle.None]),
Заголовки = Table.PromoteHeaders(Источник, [PromoteAllScalars=true]),
УдалениеСтолбцов = Table.RemoveColumns(Заголовки,{"<TIME>", "<VOL>"}),
ИзменениеТипаЧисло = Table.TransformColumnTypes(УдалениеСтолбцов, {{"<OPEN>", type number}, {"<HIGH>", type number}, {"<LOW>", type number}, {"<CLOSE>", type number}}, "en-US"),
#"Измененный тип с языком" = Table.TransformColumnTypes(ИзменениеТипаЧисло, {{"<DATE>", type date}}, "ru-RU"),
#"Сортированные строки" = Table.Sort(#"Измененный тип с языком",{{"<DATE>", Order.Ascending}}),
Индекс = Table.AddIndexColumn(#"Сортированные строки", "Индекс", 0, 1),
//скользящие средние вычисляю через подсмотренные конструкции
//each try
// List.Average(List.Range())
//otherwise
table_MA_slow = Table.AddColumn(Индекс, "MAslow",
each try
List.Average(
List.Range(Индекс[#"<CLOSE>"],[Индекс]-MA_slow_step,
MA_slow_step)
)
otherwise
null),
table_MA_fast = Table.AddColumn(table_MA_slow, "MAfast",
each try
List.Average(
List.Range(Индекс[#"<CLOSE>"],[Индекс]-MA_fast_step,
MA_fast_step)
)
otherwise
null),
table_change_type = Table.TransformColumnTypes(table_MA_fast,{{"MAslow", type number}, {"MAfast", type number}})
in
table_change_type
Коллеги, здравствуйте. Вопрос касается работы с Power Query, опыта в этом - очень мало. Столкнулся со следующим - обрабатываю исходные данные в PQ, загружаю результаты запросов в модель, делаю на основании их сводную - опа! а вычисляемый объект/вычисляемое поле в меню сводной недоступны. Собственно вопрос - почему? Правильно ли я понимаю, что надо вычисляемые поля в собственно запросе PQ делать, а уж потом использовать в сводной? Возможно (очень!) что вопрос - тупой - но это чисто по незнанию, не принимайте близко к сердцу, направьте на живительные источники знания, плиз. Спасибо за внимание.
Коллеги, здравствуйте. Подскажите, пожалуйста, по такому вопросу: Есть на диске текстовый файл, зовут его 1.txt, расположен он в C:\1 Хочется прочитать в текстовую переменную ВСЕ содержимое файла. Рисую процедуру:
Код
Sub Test()
Dim objFileSys As Object, sS As String
Set objFileSys = CreateObject("Scripting.FileSystemObject")
sS = objFileSys.OpenTextFile("C:\1\1.txt").ReadAll
End Sub
В 1.txt заношу незатейливый текст: "мама мыла раму Раму мыла мама" Запускаю процедуру пошагово - в переменной sS вижу нужный текст, ура!
Далее вставляю довольно большой кусок текста в файл (около 300 строк от 1 до 170 знаков в строке) запускаю процедуру пошагово - в переменной sS сиротливая строка "ая" Что это? Ограничение на количество знаков в переменной? Вроде там миллионы допускаются...
В общем вопрос - как забрать в переменную все содержимое текстового файла? Построчно читать и добавлять к переменной? Или все-таки есть более простой способ? Подскажите, пожалуйста. Спасибо за внимание.
Уважаемые коллеги, здравствуйте. Подскажите, пожалуйста, по регулярным выражениям - с их помощью вообще возможно определить - содержит ли обрабатываемая строка только числа, или еще там что-то есть? Например, в файле в ячейках есть значения. Например, 44, =48, =А1*13, =22/46, и т.д. Можно ли регулярными выражениями определить те ячейки, в которых содержатся такие значения: "=ЧИСЛО"? (в приведенном примере должно найти ячейку с "=48"). Пока у меня получилось только через If и проверку InStr и IsNumeric. А через регулярные выражения это можно?
Коллеги, здравствуйте. Возник такой вопрос: при разработке сложной формулы массива столкнулся с необходимостью изменения порядка исходных элементов массива - изначально стоит по убыванию, а в формулу массива надо запихнуть эти элементы по возрастанию и использовать в таком виде, в ПОИСКПОЗ, например. Казалось бы - ранг в помощь, но чего-то ранг у меня не работает в массиве. Может, еще как-то можно? Задача в прилагаемом файле в С1 вывести элемент из списка в столбце А не превышающий, либо равный заданному значению в В1. Спасибо за внимание.
Здравствуйте. Подскажите, пожалуйста, по решению такой задачи: имеем таблицу, сгруппированную по строкам. Допустим, как в примере - 2 уровня группировки. Собственно, вопрос - как средствами VBA отразить информацию об уровне группировки (вывести в MsgBox, допустим), для конкретной строки (например, для активной ячейки). Пытался через EntireRow - не нашел свойства. Из хелпа Group - метод для сводных таблиц. Подскажите, в какую сторону копнуть? Спасибо за внимание.
Доброго времени суток, уважаемые! Голову уже сломал - какую инструкцию в VBA применить, чтобы понять, является ли проверяемая ячейка частью определенного диапазона. Например, на листе проверяю все ячейки в используемом диапазоне, и, если они попадают в диапазон А5:В5, то надо эти ячейки закрасить красным. Соответственно пишу: Dim objR as range For each objR in Worksheets(1).UsedRange.Cells If objR (ВОТ КАКОЙ ТУТ ОПЕРАТОР ДОЛЖЕН БЫТЬ, чтоб выдал принадлежит ячейка диапазону или нет?!!!!) Worksheets(1).Range("A5:B5").Cells Then objR.Interior.Color ну и т.д.
Используемый диапазон на листе заранее неизвестен. Файл пример приложу по хотению общества (хотя какой там пример? Кусок неудавшегося кода?) Спасибо за внимание.
Доброго времени суток, уважаемые! Изучая профильную литературу не могу для себя прояснить следующий вопрос: При разработке проекта как лучше делать - держать все потребные в проекте процедуры в одном модуле, или увеличить количество модулей (например, одна процедура на 1 модуль). Вообще, влияет ли расположение процедур (в одном модуле все, в отдельных модулях) на скорость работы, например? Или это определяется только предпочтениями (субъективным удобством) разработчика? Спасибо за внимание.
Доброго времени суток, уважаемые! Давеча понял, что пора освежить свои "знания" по составлению формул. Открыл, значит, учебник... сижу, решаю... И произошел у меня мозговой затык. Задача: В столбце А произвольные числа. Требуется найти наибольшее число из заполненного диапазона, которое встречается 2 раза или более. Ну, думаю, это мы щас.... в соседнем столбце нарисовал формулу, которая отбирает из исходного диапазона только те числа, которые встречаются 2 раза или более, а в третьем столбце - соответственно формулу, котора определяет макс.значение из отобранного диапазона (Макс, или Наибольшее - не суть.) А вот, собственно, вопрос - а можно ли найти это число из задачки одной формулой? И под-вопрос/просьба - подскажите направление (мол, формула массивов нужна или еще как намекните - КАК?) Файл прилагается. Спасибо за внимание.
Доброго времени суток, уважаемые! Подскажите, как средствами VBA найти номер первой строки, содержащей отфильтрованные данные, после применения фильтра. В частности, как программно найти в примере, после фильтрации по третьему значению, первую строку, содержащую в ячейке столбца А значение "3" (см.пример)
Доброго времени суток, уважаемые! Помогите, пожалуйста, с синтаксисом формулы. Требования к ней - см.пример. Или носом ткните, что ли, в какой стороне искать. Спасибо.
З.Ы. В поиске уже был, но увы... :О( Или я просто сегодня такой ... невменяемый...
Доброго времени суток, уважаемые! Воспаленное сознание родило следующий макрос, приводящий написание "м2" в более "красивый" вид (цифры приподняты). Макрос действует в выделенном диапазоне. Ищет в выделении значения "м2" "м3" (значения для поиска можно добавлять) и для цифр в этих строках изменяет шрифт на superscript. Вопросы в следующем: 1. Может, кому пригодится? 2. Гуру-мастера - может посмотрите код - вдруг я велосипед изобрел? Файл-пример прилагаю (код процедуры в единственном модуле проекта). Текст процедуры: Sub Надстрочный_символ_м2_м3() 'хочется, чтобы в текстовой строке, содержащейся в ячейке, все "м2" и "м3" заменялись на более "красивый вариант" 'с "приподнятым" шрифтом для цифр Dim MyRange As Range 'переменная для объекта Selection Dim MyCell As Range 'переменная для объекта Cell, которые будем перебирать в выделенном диапазоне Dim intI As Integer 'переменная для определения номера позиции вхождений "м2" или "м3" в проверяемой строке Dim strChecking As String 'переменная для хранения строки, которую будем курочить Dim arrInNumber() As Integer 'массив неизвестной пока размерности для хранения значений позиций вхождения искомой строки 'в проверяемой Dim arrInStr(2) As String 'массив, в который заносим строки, которые надо искать/заменять/изменять Dim intJ As Integer 'переменная для определения размерности массива Dim intK As Integer 'переменная для определения размерности массива arrInStr
'присваиваем элементам массива значения для поиска arrInStr(1) = "м2" arrInStr(2) = "м3" Set MyRange = Selection 'устанавливаем переменной объект (выделенный диапазон)
'ПОГНАЛИ! Для каждой ячейки в выделенном фрагменте: For Each MyCell In MyRange MyCell.Activate 'как выяснилось, без активации ячейки никак - все действия по изменению шрифта происходят в активной 'ячейке strChecking = CStr(MyCell.Value) For intK = LBound(arrInStr()) To UBound(arrInStr()) intI = 1 intJ = 1 'проверяем, есть ли в строке элемент arrInStr() вообще, т.е. то, что надо поменять If InStr(intI, strChecking, arrInStr(intK)) > 0 Then 'пока вхождение элемента массива arrInStr(), определенное для разных стартовых позиций поиска будет давать значение >0 'запускаем цикл, который находит номер позиции вхождения и присваивает его соответсвующему элементу массива arrInNumber() Do 'изменяем размерность массива при увеличении количествва найденных вхождений ReDim Preserve arrInNumber(intJ) 'присваиваем соотвествующему элементу массива номер найденного вхождения arrInNumber(intJ) = InStr(intI, strChecking, arrInStr(intK)) 'изменяем начальную позицию для поиска в строке вхождения intI = InStr(intI, strChecking, arrInStr(intK)) + 1 'увеличиваем размерность массива arrInNumber() intJ = intJ + 1 'условие проверяем в конце цикла, т.к. начальной проверкой через if мы уже убедились, что такое вхождение есть 'хотя бы в одном экземпляре Loop While InStr(intI, strChecking, arrInStr(intK)) > 0
'для каждого найденного вхождения в строке (т.е. для всех элементов массива) For intI = LBound(arrInNumber()) To UBound(arrInNumber()) 'изменяем шрифт для цифр в "м2" ActiveCell.Characters(Start:=arrInNumber(intI) + 1, Length:=1).Font.Superscript = True Next intI
Доброго времени суток, уважаемые! Будьте добры, пролейте свет знания на следующий мой вопрос: В коде пишу инструкцию:
Set MyRange = Worksheets("MyList").Range("D4:J4")
И все замечательно. Хорошо, но что делать, если я правой границы Range не знаю? Лезу в хелп, читаю, рожаю такую конструкцию:
Set MyRange = Worksheets("MyList").Range("D4", Range("D4").End(xlToRight)).Select
И начинается ошибка при отладке. Ошибка пропадает, если предварительно активизировать рабочий лист с именем "MyList" Аналогично если определять Range через Cells, например (i- переменная для номер столбца, ищется в коде заранее, определена как Integer, не может быть больше 100):
Set MyRange = Worksheets ("MyList").Range(Cells(4,4), Cells(4, i)) - тоже самое, необходимо сначала активизировать лист.
Собственно, вопрос: почему в первом случае "установка" объекта проходила на ура без всякой активации листа в коде, а во втором необходима лишняя пляска с бубном (строка кода, активизирующая лист)?
Извините за может быть "простейший" вопрос - но книжки/справочника под рукой нет, в хелпе не вижу в упор подобного. В хелпе не описано отличие обращения к Range через Range("A1") от Range(cells(1,1). Спасибо за внимание.