Пишу макрос, который будет создавать шаблон для планирования радиорекламы. Сам медиаплан уже сделала, теперь нужно организовать итоговую таблицу. И в этом как раз заключается проблема, т.к. там необходимо посчитать кол-во выходов в календарную неделю. А период может начинаться со среды, например, а не с понедельника. Потом идет пару полных недель. И заканчиваться в чт. Гипотетически. Вот, и я не знаю как объяснить ему, чтобы он вычислял эти "половинчатые" недели и правильно подсчитывал. Учитываю, что он сам создает кол-во столбцов, исходя из заданного мною периода. (Все это понятнее на примере).
Во вложении сам макрос. Там на листе "Settings" находятся настройки макроса и кнопка запуска. А на "Total table" - пример итоговой таблицы, которую необходимо сделать посредством макроса. Остальные вкладки - информационные.
Я только начинаю осваивать VBA (это мой первый макрос) и пока не могу придумать решение данной задачи самостоятельно. Буду очень благодарна как помощи при написании кода, так и советам по алгоритму
Здравствуйте!
Пишу макрос, который будет создавать шаблон для планирования радиорекламы. Сам медиаплан уже сделала, теперь нужно организовать итоговую таблицу. И в этом как раз заключается проблема, т.к. там необходимо посчитать кол-во выходов в календарную неделю. А период может начинаться со среды, например, а не с понедельника. Потом идет пару полных недель. И заканчиваться в чт. Гипотетически. Вот, и я не знаю как объяснить ему, чтобы он вычислял эти "половинчатые" недели и правильно подсчитывал. Учитываю, что он сам создает кол-во столбцов, исходя из заданного мною периода. (Все это понятнее на примере).
Во вложении сам макрос. Там на листе "Settings" находятся настройки макроса и кнопка запуска. А на "Total table" - пример итоговой таблицы, которую необходимо сделать посредством макроса. Остальные вкладки - информационные.
Я только начинаю осваивать VBA (это мой первый макрос) и пока не могу придумать решение данной задачи самостоятельно. Буду очень благодарна как помощи при написании кода, так и советам по алгоритму Ananas
Если при создании макроса встретилась сложность, то мне помогает: - разложение мысленной модели на элементарные действия - выписывание порядка этих действий = иерархия - учитывая особенности языка - иерархию пишем снизу вверх - кодируем элементарные действия - пишем функции с нулевой сложностью: - что нужно принимаем, небольшое усилие, что нужно - возвращаем - при нестыковке ожидаемого и получаемого функциями, между ними пишем декораторы. ... Profit!
Привет!
Если код работает = код хороший.
Если при создании макроса встретилась сложность, то мне помогает: - разложение мысленной модели на элементарные действия - выписывание порядка этих действий = иерархия - учитывая особенности языка - иерархию пишем снизу вверх - кодируем элементарные действия - пишем функции с нулевой сложностью: - что нужно принимаем, небольшое усилие, что нужно - возвращаем - при нестыковке ожидаемого и получаемого функциями, между ними пишем декораторы. ... Profit!InExSu
Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
Ananas, а причем здесь "Поиск решения"? Это вообще-то надстройка такая, в Excel вшитая - Прочитайте Правила форума - Исправьте название темы согласно п.2 Правил форума, конкретнее обозначьте проблему
Ananas, а причем здесь "Поиск решения"? Это вообще-то надстройка такая, в Excel вшитая - Прочитайте Правила форума - Исправьте название темы согласно п.2 Правил форума, конкретнее обозначьте проблему_Boroda_
K-SerJC, да, мне и нужно высчитать кол-во дней. Но именно за календарную неделю. Например, за период с 16.04 по 30.04 это будет: вт.-вс.(16-21.04), пн.-вс.(22-28.04), пн.вт. (29-30.04).
K-SerJC, да, мне и нужно высчитать кол-во дней. Но именно за календарную неделю. Например, за период с 16.04 по 30.04 это будет: вт.-вс.(16-21.04), пн.-вс.(22-28.04), пн.вт. (29-30.04).Ananas
K-SerJC, да, мне и нужно высчитать кол-во дней. Но именно за календарную неделю.
добрый день! вот вам функция считает сколько недель в периоде сколько дней в первой неделе сколько в последней
код вот:
[vba]
Код
Function DayInWeek(dataStart As Date, dataStop As Date) As Variant ' возвращаем массив 1 число - кол-во недель в периоде, 2 число - кол-во дней 1й недели, 3 число кол-во дней последней Dim arr(3), Nday, tWeek, f, k, stWeek Nday = Fix(dataStop - dataStart) arr(1) = 1: arr(2) = 1: arr(3) = 1 If Nday < 2 Then DayInWeek = arr: Exit Function tWeek = Application.WorksheetFunction.WeekNum(dataStart, 2) stWeek = tWeek For f = 1 To Nday - 1 k = Application.WorksheetFunction.WeekNum(dataStart + f, 2) If k = stWeek Then arr(2) = arr(2) + 1 If tWeek <> k Then tWeek = k arr(1) = arr(1) + 1 End If Next f For f = 1 To Nday - 1 k = Application.WorksheetFunction.WeekNum(dataStop - f, 2) If k = tWeek Then arr(3) = arr(3) + 1 Else Exit For Next f DayInWeek = arr End Function
K-SerJC, да, мне и нужно высчитать кол-во дней. Но именно за календарную неделю.
добрый день! вот вам функция считает сколько недель в периоде сколько дней в первой неделе сколько в последней
код вот:
[vba]
Код
Function DayInWeek(dataStart As Date, dataStop As Date) As Variant ' возвращаем массив 1 число - кол-во недель в периоде, 2 число - кол-во дней 1й недели, 3 число кол-во дней последней Dim arr(3), Nday, tWeek, f, k, stWeek Nday = Fix(dataStop - dataStart) arr(1) = 1: arr(2) = 1: arr(3) = 1 If Nday < 2 Then DayInWeek = arr: Exit Function tWeek = Application.WorksheetFunction.WeekNum(dataStart, 2) stWeek = tWeek For f = 1 To Nday - 1 k = Application.WorksheetFunction.WeekNum(dataStart + f, 2) If k = stWeek Then arr(2) = arr(2) + 1 If tWeek <> k Then tWeek = k arr(1) = arr(1) + 1 End If Next f For f = 1 To Nday - 1 k = Application.WorksheetFunction.WeekNum(dataStop - f, 2) If k = tWeek Then arr(3) = arr(3) + 1 Else Exit For Next f DayInWeek = arr End Function
Огромное спасибо! Благодаря этой функции смогу уже смогу сделать нужную мне таблицу!
Только есть вопрос: даты в 2019 и 2020 годах считаются нормально, а в 2021 - неверно. Думаю, может, это связано со стандартами нумерации недель (где начинается первая неделя в году). Пыталась поправить с помощью ISOWEEKNUM - ничего не получилось((
K-SerJC, здравствуйте!
Огромное спасибо! Благодаря этой функции смогу уже смогу сделать нужную мне таблицу!
Только есть вопрос: даты в 2019 и 2020 годах считаются нормально, а в 2021 - неверно. Думаю, может, это связано со стандартами нумерации недель (где начинается первая неделя в году). Пыталась поправить с помощью ISOWEEKNUM - ничего не получилось((Ananas
Function DayInWeek(dataStart As Date, dataStop As Date) As Variant ' возвращаем массив 1 число - кол-во недель в периоде, 2 число - кол-во дней 1й недели, 3 число кол-во дней последней Dim arr(3), Nday, tWeek, f, k, stWeek Nday = Fix(dataStop - (dataStart - 1)) arr(1) = 1: arr(2) = 1: arr(3) = 1 If Nday < 2 Then DayInWeek = arr: Exit Function tWeek = Application.WorksheetFunction.WeekNum(dataStart, 2) stWeek = tWeek arr(2) = 0 For f = 1 To Nday k = Application.WorksheetFunction.WeekNum(dataStart + (f - 1), 2) If k = stWeek Then arr(2) = arr(2) + 1 If tWeek <> k Then tWeek = k arr(1) = arr(1) + 1 End If Next f arr(3) = 0 For f = 1 To Nday k = Application.WorksheetFunction.WeekNum(dataStop - (f - 1), 2) If k = tWeek Then arr(3) = arr(3) + 1 Else If arr(3) = 0 Then arr(3) = 7 Exit For End If Next f DayInWeek = arr End Function
Function DayInWeek(dataStart As Date, dataStop As Date) As Variant ' возвращаем массив 1 число - кол-во недель в периоде, 2 число - кол-во дней 1й недели, 3 число кол-во дней последней Dim arr(3), Nday, tWeek, f, k, stWeek Nday = Fix(dataStop - (dataStart - 1)) arr(1) = 1: arr(2) = 1: arr(3) = 1 If Nday < 2 Then DayInWeek = arr: Exit Function tWeek = Application.WorksheetFunction.WeekNum(dataStart, 2) stWeek = tWeek arr(2) = 0 For f = 1 To Nday k = Application.WorksheetFunction.WeekNum(dataStart + (f - 1), 2) If k = stWeek Then arr(2) = arr(2) + 1 If tWeek <> k Then tWeek = k arr(1) = arr(1) + 1 End If Next f arr(3) = 0 For f = 1 To Nday k = Application.WorksheetFunction.WeekNum(dataStop - (f - 1), 2) If k = tWeek Then arr(3) = arr(3) + 1 Else If arr(3) = 0 Then arr(3) = 7 Exit For End If Next f DayInWeek = arr End Function