Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
1
Excel

Нужно определить количество определенных рабочих дней недели и или их комбинаций в интервале дат

15.08.2018, 11:14. Показов 7971. Ответов 43
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Не смог найти подходящую тему. Задача состоит в том, что-бы посчитать количество рабочих дней недели и их комбинации (понедельник; понедельник, среда, пятница; и т.д.) в интервале дат. При этом нужно учитывать праздничные дни. Нашел только как их по отдельности искать.
Вложения
Тип файла: xlsx Рабочие дни.xlsx (8.5 Кб, 34 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2018, 11:14
Ответы с готовыми решениями:

Подсчитать количество определенных дней недели в списке
На рабочем листе создайте список значений дат в формате с указанием дней недели. С помощью формулы...

Получить количество дней в интервале двух дат
Допустим: Дата заезда в номер = 23.11.2012 формат date, вводится с textboxa Дата выезда из номера...

Вычислить количество лет, месяцев и дней в интервале двух дат
ребята помогите.. нужно написать программу что бы вводилась дата рождения и дата смерти, после...

Нужно рассчитать количество рабочих дней
Здравствуйте! Исходные данные: имеется табличка вида дата (содержит дату), признак...

43
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
20.08.2018, 18:01  [ТС] 21
Author24 — интернет-сервис помощи студентам
Вот с выбором дат начала и конца периода все просто: (bDate As Date, eDate As Date). И все протягивается, берется откуда надо и все хорошо. А " str As String", так просто в аргументы не запихнуть, чуда не происходит. "days() As String" где-то рядом должен быть и эта строчка "days = Split(str, ",")" (я так понимаю тут про то, что дни через запятую пишутся). С этим тоже непонятно что делать тогда.
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
20.08.2018, 18:20 22
Цитата Сообщение от PiLLyulk Посмотреть сообщение
А " str As String", так просто в аргументы не запихнуть, чуда не происходит.
Я не волшебник, я тока учусь!
(ц)ученик феи Золушки.


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub main()
Dim myStr As String
myStr = Cells(5, 12)
 
Call Часы(bDate, eDate, myStr)
 
End Sub
 
Function Часы(bDate As Date, eDate As Date, str As String)
Dim days() As String
...
days = Split(str, ",")
... 
End Function
Кстати, а зачем Вам функция, которая не возвращает абсолютно никакого значения? Для этого же процедуры есть.
1
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
21.08.2018, 11:13  [ТС] 23
Loya, Спасибо Вам! Все заработало! Чудо произошло)

Цитата Сообщение от Loya Посмотреть сообщение
Кстати, а зачем Вам функция, которая не возвращает абсолютно никакого значения? Для этого же процедуры есть.
Я думал, что это хорошее решение. А как процедура работает?
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
21.08.2018, 13:14 24
Цитата Сообщение от PiLLyulk Посмотреть сообщение
А как процедура работает?
Так же, как и функция, которая ничего не возвращает. Просто зачем использовать функцию, если не собираетесь возвращать какое либо значение? Разницы в целом нет, но процедура в Вашем случае читабельнее. Почитайте про процедуры и функции в visual basic чтоб лучше понимать, как их следует использовать.
0
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
22.08.2018, 09:41  [ТС] 25
Loya, мне функция была удобна тем, что можно протянуть это все на нижние ячейки и все аргументы попадут из нужных ячеек. А можно сделать что-бы все заполнялось сразу после запуска процедуры? Вы это имели ввиду?
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
22.08.2018, 10:08 26
Цитата Сообщение от PiLLyulk Посмотреть сообщение
мне функция была удобна тем, что можно протянуть это все на нижние ячейки и все аргументы попадут из нужных ячеек
В процедуру тоже же можно передавать аргументы.
0
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
22.08.2018, 10:57  [ТС] 27
Loya, не получается теперь эту функцию в процедуру переделать обратно. А как в процедуру добавить аргументы? Точнее не понимаю как их указать на всю таблицу. Для функции они прописываются после названия функции. Потом в формуле через точку с запятой, при протягивании попадают нужные снизу. Для процедуры, получается, нужно прописывать столбец весь?
Я прикрепил файлик с тем, чего добиться хочу, в итоге. Хотелось бы, конечно, наиболее простым и эффективным способом это сделать.
А он не прикрепился(
0
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,138
Записей в блоге: 4
22.08.2018, 11:14 28
попробуйте сначала зазиповать вложение(допускается до 10 мб)
1
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
22.08.2018, 11:17  [ТС] 29
shanemac51, спасибо! Зазипованный прикрепился.
Вложения
Тип файла: zip Пример.zip (27.3 Кб, 3 просмотров)
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
22.08.2018, 12:33 30
Я не вижу в файле, где у Вас вызывается выполнение макроса и передаются аргументы. Что бы переделать функцию в процедуру достаточно слово Functuion изменить на слово Sub. В принципе не критично, можно оставить, как есть - функции, работать будет, просто может вызвать лёгкое удивление у читающего Ваш код.
0
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
22.08.2018, 12:37  [ТС] 31
Loya,
Цитата Сообщение от Loya Посмотреть сообщение
Что бы переделать функцию в процедуру достаточно слово Functuion изменить на слово Sub.
так я делал. Почему-то чуда не произошло, он вообще не захотел работать в таком виде.
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
22.08.2018, 14:24 32
Тогда два варианта, или забейте и оставьте, как есть, или подскажите мне (можно скриншотами), как Вы запускаете макрос с передачей аргументов, потому что я так и не нашла где это.
0
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
22.08.2018, 15:24  [ТС] 33
Loya, если это функция, то пример 1, если процедура, то пример 2. Просто кнопку, обведенную кружочком нажимаю и ничего не происходит.
Миниатюры
Нужно определить количество определенных рабочих дней недели и или их комбинаций в интервале дат   Нужно определить количество определенных рабочих дней недели и или их комбинаций в интервале дат  
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
22.08.2018, 15:30 34
Всё, теперь поняла. Тогда да, оставляйте функции. Я уже и забыла, что так можно макросы вызывать.
1
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
23.08.2018, 11:11  [ТС] 35
Loya, здравствуйте.

Тут появилась потребность в 2-х разных списках праздничных дат: (1 с каникулами, 2 без каникул).
Это через If then лучше делать? Как можно не втыкая еще 1 столбец это устроить это? Цвет ячейки или, может в ячейку с номерами дней недели через запятую добавить букву д\н спереди?

Добавлено через 1 час 5 минут
Loya, я Вас, наверное, уже достал, но не могу понять как "startWeekend =" сделать актуальным для нескольких вкладок.
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
23.08.2018, 11:28 36
А почему ещё одну колонку не хотите? Наглядно же. Но если прям совсем не хочется, то да, можно букву впереди, тогда код немного переписать нужно будет.
Visual Basic
1
2
3
4
5
days = Split(str, ",") 'разделяем полученные дни по запятым
 
For i = 1 To UBound(days) 'перебираем циклом запрошенные дни 
    Call showResult(days(i), arrWorkDays(i + 1)) 'вызываем функцию, которая покажет день недели и количество этих дней
Next i
Этот код нужно будет перенести в начало (перед кодом, в котором проверяем праздники), соответственно цикл уже не с 0-ого элемента массива, а с первого, потому что в 0-ом будет Ваша д или н. Ну и да, при проверке праздников используем If ... Then и нулевой элемент массива. Что-то вроде:
Visual Basic
1
2
3
4
5
6
7
8
If days(0)="д" Then
...
ElseIf days(0)="н" Then
...
Else
MsgBox("Неверный параметр!")
Exit sub
End If
Добавлено через 6 минут
Цитата Сообщение от PiLLyulk Посмотреть сообщение
Loya, я Вас, наверное, уже достал
всё нормально, я тут тоже бывает к людям пристаю, только в другом разделе, как правило.
Цитата Сообщение от PiLLyulk Посмотреть сообщение
не могу понять как "startWeekend =" сделать актуальным для нескольких вкладок
Не поняла вопроса, если можно, то лучше на примере. startWeekend у нас с Вами вроде как переменная для ячейки, с которой начинается перечисление праздников. Для каких вкладок нужно сделать её актуальной?
0
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
23.08.2018, 11:31  [ТС] 37
Цитата Сообщение от Loya Посмотреть сообщение
Не поняла вопроса, если можно, то лучше на примере. startWeekend у нас с Вами вроде как переменная для ячейки, с которой начинается перечисление праздников. Для каких вкладок нужно сделать её актуальной?
Да, неправильно выразился. Имел ввиду актуальной для нескольких листов. Хочется просто что-бы этот список лежал где-то на одном листе и к нему можно было обратиться с разных.
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
23.08.2018, 12:01 38
А, да это легко, нужно просто лист указать:
Visual Basic
1
2
3
4
5
6
    For j = startWeekend To lastRow 'пробегаемся по праздникам
        If Sheets("ПраздничныйЛист").Cells(j, 1) = d Then
            flagWeekday = True 'если нашли, то устанавливаем флаг
            Exit For 'выходим из цикла т.к. нету смысла искать дальше
        End If
    Next j
0
0 / 0 / 0
Регистрация: 15.08.2018
Сообщений: 30
15.09.2018, 11:57  [ТС] 39
Loya, Здравствуйте!

Хотел таким образом, по простому отделаться, но ничего не вышло.
Visual Basic
1
2
3
4
5
6
7
If days(0) = "н" Then
  startWeekend = 1
    ElseIf days(0) = "д" Then
    startWeekend = 15
    Else
     MsgBox ("Неверное значение!")
  End If
А на эту строчку он очень ругается:
Visual Basic
1
2
 Call showResult(days(i), arrWorkDays(i + 1)) 'вызываем функцию, которая покажет день недели и количество этих дней
Next i
Как с ним бороться?
0
70 / 57 / 24
Регистрация: 06.12.2015
Сообщений: 306
17.09.2018, 11:56 40
PiLLyulk, приложите лучше файл, сложно без описания ошибки понять на что конкретно он ругается.
0
17.09.2018, 11:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2018, 11:56
Помогаю со студенческими работами здесь

Даны две даты определить сколько между ними определенных дней недели
Даны две даты определить сколько между ними определенных дней недели то есть понедельников,или...

Определить количество рабочих дней в месяце
всем привет как с помощью VBA вернуть кол-во рабочих дней месяца для даты 01.01.2017 ? :)

Описать множество рабочих дней недели
Описать множество рабочих дней недели.

Определить количество рабочих (будних) дней в конкретном месяце и года
Помогите составить программу, которая определяет количество рабочих (будних) дней в конкретном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru