n или u в столбец А не должно ставиться, если в желтых ячейках меняем значения на те же самые
Малость подправил Ваш код
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Column < 2 Or Target.Column > 10 Then Exit Sub If Target.Row < 6 Then Exit Sub Application.EnableEvents = 0 Dim X X = Target.Value Application.Undo If Target <> X Then Select Case Range("B3").Value Case 4, 2 Cells(Target.Row, 1) = "u" Case Else Cells(Target.Row, 1) = IIf(Cells(Target.Row, 3) = Range("IdUser").Value, "u", "n") 'update End Select Target = X End If Application.EnableEvents = -1 End Sub
[/vba]
Остальное не понял.
Цитата
n или u в столбец А не должно ставиться, если в желтых ячейках меняем значения на те же самые
Малость подправил Ваш код
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Column < 2 Or Target.Column > 10 Then Exit Sub If Target.Row < 6 Then Exit Sub Application.EnableEvents = 0 Dim X X = Target.Value Application.Undo If Target <> X Then Select Case Range("B3").Value Case 4, 2 Cells(Target.Row, 1) = "u" Case Else Cells(Target.Row, 1) = IIf(Cells(Target.Row, 3) = Range("IdUser").Value, "u", "n") 'update End Select Target = X End If Application.EnableEvents = -1 End Sub
По поводу сравнения нового значения ячейки с предыдущим можно предложить использовать событие SelectionChange для запоминания старого значения в переменную уровня модуля листа: [vba]
Код
Dim oldValue
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Count > 1 Then Exit Sub oldValue = Target End Sub
[/vba] Разумеется, будет срабатывать не всегда. Если нарочито оставаться в одной ячейке и менять ее значение, подтверждая ввод щелчком мышки по "галочке" в строке формул, то работать не будет. Но в 95% случаев обычного пользовательского поведения, когда ввод подтверждается клавишей Enter и табличный курсор перемещается на другую ячейку, работать будет.
Накручивать же что-то более монстроидное, типа держать копию данных на другом скрытом листе и при изменении сравнивать значения одноименных ячеек - по-моему, "перебор", экономически неоправданное занятие...
P.S. Wasilich, гениально! Снимаю шляпу! Надо запомнить приёмчик с Undo'й
По поводу сравнения нового значения ячейки с предыдущим можно предложить использовать событие SelectionChange для запоминания старого значения в переменную уровня модуля листа: [vba]
Код
Dim oldValue
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Count > 1 Then Exit Sub oldValue = Target End Sub
[/vba] Разумеется, будет срабатывать не всегда. Если нарочито оставаться в одной ячейке и менять ее значение, подтверждая ввод щелчком мышки по "галочке" в строке формул, то работать не будет. Но в 95% случаев обычного пользовательского поведения, когда ввод подтверждается клавишей Enter и табличный курсор перемещается на другую ячейку, работать будет.
Накручивать же что-то более монстроидное, типа держать копию данных на другом скрытом листе и при изменении сравнивать значения одноименных ячеек - по-моему, "перебор", экономически неоправданное занятие...
P.S. Wasilich, гениально! Снимаю шляпу! Надо запомнить приёмчик с Undo'й Gustav
Поправил код. Смотрите, столбик IdUsers - это ID пользователя, которому принадлежит строка (кто ее создал). Ячейка B3 - это тот же самый ID, текущего пользователя, какого-то одного конкретного в данный момент времени. Это небольшой отрывок кода просто, который пытаюсь доковырять до желаемого.
Вот когда любой юзер (сейчас 4 стоит в B3) - вводит значение в пустые ячейки внизу, для которых в столбике C нет никакого уровня доступа ранее заданного, то пометить в столбике A как n. Для 4 и 2 юзера они сейчас как u помечаются. Нужно для них n, только новые строки.
Например, если в B3 сейчас набрать 1 и попробовать что-то дописать для ячейки допустим E23, то в столбик А верно поставится n, признак новой строки, для которой нужно будет вручную натыкать слева с столбе C уровень доступа. Так же и для юзеров 4 и 2 (которые во втором селект кейсе прописаны в коде, должно быть). Только этот один момент, все остальное как есть так и есть.
С новым кодом пропала функциональность старого перестали ставиться n или u в столбик A в зависимости от действий над ячейками (например обновление ячеек). Как бы сохранить все, как было, кроме того чтобы поправить выделенное выше жирным и если значение не изменилось фактически, то макрос бы ничего не ставил. Как сейчас, только маленькие правки(
Поправил код. Смотрите, столбик IdUsers - это ID пользователя, которому принадлежит строка (кто ее создал). Ячейка B3 - это тот же самый ID, текущего пользователя, какого-то одного конкретного в данный момент времени. Это небольшой отрывок кода просто, который пытаюсь доковырять до желаемого.
Вот когда любой юзер (сейчас 4 стоит в B3) - вводит значение в пустые ячейки внизу, для которых в столбике C нет никакого уровня доступа ранее заданного, то пометить в столбике A как n. Для 4 и 2 юзера они сейчас как u помечаются. Нужно для них n, только новые строки.
Например, если в B3 сейчас набрать 1 и попробовать что-то дописать для ячейки допустим E23, то в столбик А верно поставится n, признак новой строки, для которой нужно будет вручную натыкать слева с столбе C уровень доступа. Так же и для юзеров 4 и 2 (которые во втором селект кейсе прописаны в коде, должно быть). Только этот один момент, все остальное как есть так и есть.
С новым кодом пропала функциональность старого перестали ставиться n или u в столбик A в зависимости от действий над ячейками (например обновление ячеек). Как бы сохранить все, как было, кроме того чтобы поправить выделенное выше жирным и если значение не изменилось фактически, то макрос бы ничего не ставил. Как сейчас, только маленькие правки(w00t
Переприкладываю файлик, извините, поставил верное значение в Range( Если еще короче сформулировать, то селектейсы должны работать как есть, кроме того что для уровня доступа 4 и 2 (которые прописаны в коде) в любой новой строке, в которой отсутствует значение в столбе C - ставить в столб А значение n, а не u.
И если любое значение уже имеющееся меняется на то же самое значение, то в столб А бы не ставилось ни n ни u (а сейчас они на любое изменение реагируют, даже если asd заменить на asd или пусто на пусто. Вот если бы пусто на asd или asd на fdf поменять - тогда пусть отрабатывали как отрабатывают).
Переприкладываю файлик, извините, поставил верное значение в Range( Если еще короче сформулировать, то селектейсы должны работать как есть, кроме того что для уровня доступа 4 и 2 (которые прописаны в коде) в любой новой строке, в которой отсутствует значение в столбе C - ставить в столб А значение n, а не u.
И если любое значение уже имеющееся меняется на то же самое значение, то в столб А бы не ставилось ни n ни u (а сейчас они на любое изменение реагируют, даже если asd заменить на asd или пусто на пусто. Вот если бы пусто на asd или asd на fdf поменять - тогда пусть отрабатывали как отрабатывают).w00t
Ночное косоглазие у меня, прошу прощения) Да, 1/2 вопроса отпала.
Актуально только, что если Case 4, 2, то при пустом значении в столбе С рядом, ставилось бы 'n' вместо 'u'. Для отличных от 4 и 2 ставятся верно n в строки, в которых в столе C пусто.
Ночное косоглазие у меня, прошу прощения) Да, 1/2 вопроса отпала.
Актуально только, что если Case 4, 2, то при пустом значении в столбе С рядом, ставилось бы 'n' вместо 'u'. Для отличных от 4 и 2 ставятся верно n в строки, в которых в столе C пусто.w00t
Wasilich, я тут попутно еще поковырял, и вроде сделал, поправив одну строку. Привычка думать еще формулами, в vba так себе, потому логично функция стала больше на формулу похожа.
У Вас похоже, только из общей конструкции выпадает, наверное из-за моего кривого пояснения. Вроде как теперь верно отрабатывает, прикладываю. Спасибо большое за ответы по треду, были полезными.
Wasilich, я тут попутно еще поковырял, и вроде сделал, поправив одну строку. Привычка думать еще формулами, в vba так себе, потому логично функция стала больше на формулу похожа.
У Вас похоже, только из общей конструкции выпадает, наверное из-за моего кривого пояснения. Вроде как теперь верно отрабатывает, прикладываю. Спасибо большое за ответы по треду, были полезными.w00t
Прошу извинить, что вновь акутализировал эту ветку. Решение простое и гениальное. Чем короче и проще, тем лучше.
Но, если мы вводим в какую-то ячейку в чистом экселе данные и нажимаем ввод - то выделение смещается вниз на ячейку. А здесь получается, мы заменили значение тем же самым. И при нажатии ввода, происходит "дергание" и выделение остается на текущей ячейке.
Как можно этого избежать? Просто возможен как массовый копипаст прежних значений теми же самыми, так и поячеечный. Визуально немного не очень выглядит.
Прошу извинить, что вновь акутализировал эту ветку. Решение простое и гениальное. Чем короче и проще, тем лучше.
Но, если мы вводим в какую-то ячейку в чистом экселе данные и нажимаем ввод - то выделение смещается вниз на ячейку. А здесь получается, мы заменили значение тем же самым. И при нажатии ввода, происходит "дергание" и выделение остается на текущей ячейке.
Как можно этого избежать? Просто возможен как массовый копипаст прежних значений теми же самыми, так и поячеечный. Визуально немного не очень выглядит.w00t