Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

Фиксация дат в других ячейках при определенных условиях

Автор shish235, 01.06.2023, 23:39

« назад - далее »

shish235

Приветствую форумчане. Всем доброго времени суток!
Есть такая проблема(предупреждаю объясняю я мягко говоря плохо, но может кто догадается).
Есть столбец(B) в ячейки которого пользователи вносят значения вручную от 1 до 8 включительно, в разные дни, но регулярно и главное по порядку(по возрастанию).
Есть столбец(С) который автоматически при изменение значений в ячейках столбца(B) фиксирует дату последнего изменения.
Есть столбцы (D.E.F.G.H.I.J.K) и вот в них необходимо фиксировать первую дату определенного значения.
То есть если В2=1 то в D2 зафиксирована дата в которую B2 стало = 1.
Потом пользователь меняет значение в B2 c "1" на "2" и что должно произойти:
Ячейка D2 должна не измениться(остаться дата когда в ячейке была единица), а в ячейке E2 должна появиться дата когда в ячейке B2 появилась "2" и т.д.

То есть необходимо в отдельных ячейках фиксировать дату изменения в одной ячейке(в какой день было 1, в какой день было 2, в какой день было 3 и вплоть до 8 включительно)
Подскажите пожалуйста, может кто знает как это реализовать, чтобы я не делал не выходит, увы...status1-8.xlsx

Serge 007

Здравствуйте

Средствами Excel это не реализовать, только на VBA
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

Serge 007

Вариант макросом (в модуль листа):
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
    If Target.Column = 2 Then Target.Offset(0, Target + 1) = Target.Offset(0, 1)
End Sub
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

shish235

Спасибо огромное, низкий поклон.

Единственное можете подсказать как скорректировать код так, если столбец где пользователи меняют статус это столбец P(columns 16), а столбцы где должны фиксироваться даты это столбец W(columns23) и далее вплоть до столбца AD(columns 30)

Serge 007

Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

shish235


shish235

#6
Цитата: Serge 007 от 02.06.2023, 10:37А сами даты в каком столбце?

Спасибо еще раз.

Вот это решение мне помогло:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim rg As Range, c As Range
 Set rg = Intersect(Columns(16), Target): If rg Is Nothing Then Exit Sub
 For Each c In rg
   If c >= 1 And c <= 8 Then Cells(c.Row, 22 + c) = Date
 Next
End Sub

Пока буду пользоваться им.

Serge 007

Цитата: shish235 от 02.06.2023, 12:34это решение мне помогло:
Непонятно зачем в данном случае нужен цикл (это долго), но на малых объемах разница по скорости видна не будет

Мой вариант (одной строкой кода): Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 16 Then Target.Offset(0, Target + 6) = Target.Offset(0, 1)
End Sub
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

Serge 007

И ещё момент: Если пользователь в ДРУГОЙ день повторно выберет уже использованный статус, то должна остаться до этого записанная в ячейке дата или её должна заменить новая, соответствующая ДРУГОМУ дню?
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

shish235

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

А если подробнее то:
Если пользователь сделал это случайно, то должна остаться старая дата, если это намеренное исправление то нужна новая дата.
В таком случае самый  простой вариант будет правка руками.

Кстати у вашего кода есть один не значительный минус, обнаружил его когда тестировал.

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

Но это все мелочи.

Ваш код работает.
И спасибо, что откликнулись.

Serge 007

Цитата: shish235 от 02.06.2023, 13:29у вашего кода есть один не значительный минус
Если удалить полностью значение в ячейке куда мы вносим цифру статуса, то формула справа которая фиксирует дату текущего статуса слетает(полностью пропадает из своей ячейки)
Вы ошибаетесь

1. Формула с датой никуда не "слетает", она остается в ячейке. А то что её "не видно", так это Вы сами прописали в ней=ЕСЛИ(B2>0;ТДАТА();"") , т.е. если в ячейке статуса значение меньше или равно нуля, то сделать визуально пустой ("") ячейку с датой

2. Код никакого отношения к формуле с датой не имеет. Если Вы БЕЗ моего кода в файле удалите значение в ячейке статуса, то результат будет точно такой же как и с кодом - визуально пустая ячейка с датой
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

shish235

#11
1.Попробуйте сначала в ячейке B2 ввести вручную значение 1, затем к примеру 2.
2.Потом через кнопку delete удалите значение в ячейке B2
3.Повторите п.1 заново.
4.Все это время наблюдайте за ячейкой C2
5.Начиная с п.3 ячейка С2 будет оставаться пустой.

Serge 007

Не сразу понял о чем Вы  :-\

Вот итоговый код без "незначительного минуса":
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Or Target = 0 Then Exit Sub
    If Target.Column = 16 Then Target.Offset(0, Target + 6) = Target.Offset(0, 1)
End Sub
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390