Страницы: 1
RSS
Подстановка макросом отпусков (из графика отпусков) в график работы
 

Всем доброго времени суток! Никогда такого не было и вот опять :)

Адаптирую под свои цели (расстановка отпусков в графике работы) макрос, когда-то написанный уважаемым Юрием М и позаимствованный мной на этом форуме.

Макрос отрабатывает без ошибок, но безрезультатно (почти). По сути макрос должен брать исходные данные из листа «Отпуска» и, в случае истины, помещать значение 23:31 (мой аналог ОТ) в соответствующие даты сотрудникам на листе «Месяц». В примере желтым цветом обозначил, как это должно быть.

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

Буду рад принять любую помощь. Если что, в примере есть лишние пронумерованные листы, на всякий случай, для соблюдения структуры книги (как я понял, макрос на структуру тоже завязан).

Изменено: khama - 12.09.2018 07:30:08
 
Приятно слышать:
Цитата
khama написал:
уважаемым Юрием М
Вдвойне приятно:
Цитата
khama написал:
Макрос отрабатывает без ошибок, но безрезультатно
:D  
 
Юрий М, :)
В том проекте, для которого Вы его писали, он работает без ошибок. Проблемы возникли при моей адаптации макроса к моим условиям.  
 
Сейчас новый напишу, если успею до окончания дежурства.
 
Готово.
 
Юрий М,большое спасибо за помощь!
Не могли бы Вы еще объяснить мне, какие значения в этом коде обозначают номера столбцов с датами отпуска на листе "Отпуска"? А то смотрю в код и вижу фигу :)
Первоначальный макрос мне удалось таки починить. Теперь хочу сравнить их по быстродействию, а номера столбцов в продуктиве изменились :(
 
Код
            For j = 4 To LastColumn Step 2 'Перебор столбцов с 4-го по последний с шагом 2 (исправлена ошибка)
                DateBegin = .Cells(i, j) 'Переменная j - номер первого столбца каждой пары дат
                DateEnd = .Cells(i, j + 1)
Обратите внимание! Исправил ошибку: было LastRow, а нужно LastColumn. Исправьте и у себя.
 
Замечательно! Спасибо большое, Ваш код работает отлично и в разы быстрее первого
 
Юрий М, что-то всё таки некорректно работает на продуктиве. Даты периодов у меня с 3 по 10 столбец, и я LastColumn заменил на 10.
В примере эта конструкция хорошо работает на трех сотрудниках. Но в продуктиве их под сотню и ставятся не те периоды отпуска не тем сотрудникам. Продуктив выложить не могу, он слишком толстый. В чём может быть проблема?
Код
Sub Proverka_Otpuskov()
Dim LastRow As Long, DateBegin As Date, DateEnd As Date, k As Long
Dim iRow As Long, i As Long, j As Long, Rng As Range
    With Sheets("Отпуска")
        LastRow = .Cells(Rows.Count, 2).End(xlUp).Row
        For i = 5 To LastRow
        If i = 104 Then Stop
            Set Rng = Columns(6).Find(what:=.Cells(i, 2), LookIn:=xlValues, LookAt:=xlWhole)
            If Not Rng Is Nothing Then
                iRow = Rng.Row
                Range(Cells(iRow, 8), Cells(iRow, 38)).ClearContents
            End If
            For j = 3 To 10 Step 2
                DateBegin = .Cells(i, j)
                DateEnd = .Cells(i, j + 1)
                For k = 8 To 38
                    If Cells(10, k) >= DateBegin Then
                        If Cells(10, k) <= DateEnd Then Cells(iRow, k) = "23:31"
                    End If
                Next
            Next
        Next
    End With
End Sub
Изменено: khama - 14.09.2018 10:59:04
 
Юрий М,а Ваш ранний макрос, в котором я устранил допущенную мною же ошибку, работает отлично. Пока им спасаюсь, но он очень долго работает  :)  
 
Без Вашего "продуктива" ничего определённого сказать не могу. Создайте пример не с сотней, а с десятком сотрудников (и с макросом) и покажите его.
Минутку! А Вы эту строчку не закомментировали?
Код
If i = 104 Then Stop


 
Нет. А надо?  :oops:
В вашем примере она была закомментирована и я решил, что ее использование на мое усмотрение. 104 это последняя строка с данными в списке.
 
Я эту строку использовал исключительно для отладки и забыл её удалить.
Файл будет?
 
Прошу прощения, к сожалению, быстро не смогу его сваять. Будет чуть позже
 
Юрий М, необходимость в проверке Вами кода в файле отпала. Вы совершенно верно указали на эту строку. Убрал её и вопросы отпали, макрос корректно отрабатывает. Спасибо Вам ещё раз!
 
Странно, вчера написал здесь сообщение, а сегодня его нет...

Обнаружилась такая беда - если человека, которому назначены даты начала и окончания отпуска на листе Отпуска, не включить в график работы на листе Месяц, то при работе макроса отпуск этого человека подставляется в график работы другому человеку. Каким образом можно устранить этот нежданный бонус?
 
khama,Предположу, что перенеся всего 1 строчку кода, эта проблема решится, проверьте.
 
Александр П., верно. Вы рискнули предположить и выиграли приз зрительских симпатий!  ;)  Благодарю Вас
Страницы: 1
Наверх