Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Изменение ячейки из диапазона - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Изменение ячейки из диапазона (Макросы/Sub)
Изменение ячейки из диапазона
w00t Дата: Среда, 09.03.2016, 23:04 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 126
Репутация: 3 ±
Замечаний: 0% ±

Все-таки решил попробовать спросить.

Пример кода, который используется в книге, с описанием того, что непросто сделать.
К сообщению приложен файл: WB1.xlsm(18Kb)
 
Ответить
СообщениеВсе-таки решил попробовать спросить.

Пример кода, который используется в книге, с описанием того, что непросто сделать.

Автор - w00t
Дата добавления - 09.03.2016 в 23:04
Wasilich Дата: Среда, 09.03.2016, 23:46 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 877
Репутация: 222 ±
Замечаний: 0% ±

2003
Цитата
n или u в столбец А не должно ставиться, если в желтых ячейках меняем значения на те же самые
Малость подправил Ваш код
Остальное не понял.
 
Ответить
Сообщение
Цитата
n или u в столбец А не должно ставиться, если в желтых ячейках меняем значения на те же самые
Малость подправил Ваш код
Остальное не понял.

Автор - Wasilich
Дата добавления - 09.03.2016 в 23:46
Gustav Дата: Среда, 09.03.2016, 23:47 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1211
Репутация: 484 ±
Замечаний: 0% ±

начинал с Excel 4.0...
По поводу сравнения нового значения ячейки с предыдущим можно предложить использовать событие 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'й :)


Мой tip box - яд 41001663842605

Сообщение отредактировал Gustav - Четверг, 10.03.2016, 00:08
 
Ответить
СообщениеПо поводу сравнения нового значения ячейки с предыдущим можно предложить использовать событие 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
Дата добавления - 09.03.2016 в 23:47
Wasilich Дата: Четверг, 10.03.2016, 00:26 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 877
Репутация: 222 ±
Замечаний: 0% ±

2003
[offtop]
Wasilich, гениально! Снимаю шляпу!
Спасибо Константин, приятно, но шляпу оденьте, я это тоже где то когда то слямзил, просто применил к этому случаю. :) [/offtop]
 
Ответить
Сообщение[offtop]
Wasilich, гениально! Снимаю шляпу!
Спасибо Константин, приятно, но шляпу оденьте, я это тоже где то когда то слямзил, просто применил к этому случаю. :) [/offtop]

Автор - Wasilich
Дата добавления - 10.03.2016 в 00:26
w00t Дата: Четверг, 10.03.2016, 00:28 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 126
Репутация: 3 ±
Замечаний: 0% ±

Остальное не понял.

Поправил код. Смотрите, столбик IdUsers - это ID пользователя, которому принадлежит строка (кто ее создал). Ячейка B3 - это тот же самый ID, текущего пользователя, какого-то одного конкретного в данный момент времени. Это небольшой отрывок кода просто, который пытаюсь доковырять до желаемого.

Вот когда любой юзер (сейчас 4 стоит в B3) - вводит значение в пустые ячейки внизу, для которых в столбике C нет никакого уровня доступа ранее заданного, то пометить в столбике A как n. Для 4 и 2 юзера они сейчас как u помечаются. Нужно для них n, только новые строки.

Например, если в B3 сейчас набрать 1 и попробовать что-то дописать для ячейки допустим E23, то в столбик А верно поставится n, признак новой строки, для которой нужно будет вручную натыкать слева с столбе C уровень доступа. Так же и для юзеров 4 и 2 (которые во втором селект кейсе прописаны в коде, должно быть). Только этот один момент, все остальное как есть так и есть.

С новым кодом пропала функциональность старого перестали ставиться n или u в столбик A в зависимости от действий над ячейками (например обновление ячеек). Как бы сохранить все, как было, кроме того чтобы поправить выделенное выше жирным и если значение не изменилось фактически, то макрос бы ничего не ставил. Как сейчас, только маленькие правки(
К сообщению приложен файл: WB2.xlsm(17Kb)


Сообщение отредактировал w00t - Четверг, 10.03.2016, 00:34
 
Ответить
Сообщение
Остальное не понял.

Поправил код. Смотрите, столбик IdUsers - это ID пользователя, которому принадлежит строка (кто ее создал). Ячейка B3 - это тот же самый ID, текущего пользователя, какого-то одного конкретного в данный момент времени. Это небольшой отрывок кода просто, который пытаюсь доковырять до желаемого.

Вот когда любой юзер (сейчас 4 стоит в B3) - вводит значение в пустые ячейки внизу, для которых в столбике C нет никакого уровня доступа ранее заданного, то пометить в столбике A как n. Для 4 и 2 юзера они сейчас как u помечаются. Нужно для них n, только новые строки.

Например, если в B3 сейчас набрать 1 и попробовать что-то дописать для ячейки допустим E23, то в столбик А верно поставится n, признак новой строки, для которой нужно будет вручную натыкать слева с столбе C уровень доступа. Так же и для юзеров 4 и 2 (которые во втором селект кейсе прописаны в коде, должно быть). Только этот один момент, все остальное как есть так и есть.

С новым кодом пропала функциональность старого перестали ставиться n или u в столбик A в зависимости от действий над ячейками (например обновление ячеек). Как бы сохранить все, как было, кроме того чтобы поправить выделенное выше жирным и если значение не изменилось фактически, то макрос бы ничего не ставил. Как сейчас, только маленькие правки(

Автор - w00t
Дата добавления - 10.03.2016 в 00:28
w00t Дата: Четверг, 10.03.2016, 00:37 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 126
Репутация: 3 ±
Замечаний: 0% ±

Переприкладываю файлик, извините, поставил верное значение в Range(
Если еще короче сформулировать, то селектейсы должны работать как есть, кроме того что для уровня доступа 4 и 2 (которые прописаны в коде) в любой новой строке, в которой отсутствует значение в столбе C - ставить в столб А значение n, а не u.

И если любое значение уже имеющееся меняется на то же самое значение, то в столб А бы не ставилось ни n ни u (а сейчас они на любое изменение реагируют, даже если asd заменить на asd или пусто на пусто. Вот если бы пусто на asd или asd на fdf поменять - тогда пусть отрабатывали как отрабатывают).
К сообщению приложен файл: 6306483.xlsm(17Kb)


Сообщение отредактировал w00t - Четверг, 10.03.2016, 00:53
 
Ответить
СообщениеПереприкладываю файлик, извините, поставил верное значение в Range(
Если еще короче сформулировать, то селектейсы должны работать как есть, кроме того что для уровня доступа 4 и 2 (которые прописаны в коде) в любой новой строке, в которой отсутствует значение в столбе C - ставить в столб А значение n, а не u.

И если любое значение уже имеющееся меняется на то же самое значение, то в столб А бы не ставилось ни n ни u (а сейчас они на любое изменение реагируют, даже если asd заменить на asd или пусто на пусто. Вот если бы пусто на asd или asd на fdf поменять - тогда пусть отрабатывали как отрабатывают).

Автор - w00t
Дата добавления - 10.03.2016 в 00:37
Wasilich Дата: Четверг, 10.03.2016, 00:57 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 877
Репутация: 222 ±
Замечаний: 0% ±

2003
С новым кодом пропала функциональность старого перестали ставиться n или u в столбик A
А менять или вводить данные в D,E,F, пробовал? У меня ставится U. Если ничего не менять, ничего не ставится, в соответствии с:
Ну и если значение не изменилось фактически, то макрос бы ничего не ставил.

А пример не открывается!!!
 
Ответить
Сообщение
С новым кодом пропала функциональность старого перестали ставиться n или u в столбик A
А менять или вводить данные в D,E,F, пробовал? У меня ставится U. Если ничего не менять, ничего не ставится, в соответствии с:
Ну и если значение не изменилось фактически, то макрос бы ничего не ставил.

А пример не открывается!!!

Автор - Wasilich
Дата добавления - 10.03.2016 в 00:57
w00t Дата: Четверг, 10.03.2016, 01:04 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 126
Репутация: 3 ±
Замечаний: 0% ±

А пример не открывается

Ночное косоглазие у меня, прошу прощения) Да, 1/2 вопроса отпала.

Актуально только, что если Case 4, 2, то при пустом значении в столбе С рядом, ставилось бы 'n' вместо 'u'. Для отличных от 4 и 2 ставятся верно n в строки, в которых в столе C пусто.
К сообщению приложен файл: _6306483-2.xlsm(19Kb)
 
Ответить
Сообщение
А пример не открывается

Ночное косоглазие у меня, прошу прощения) Да, 1/2 вопроса отпала.

Актуально только, что если Case 4, 2, то при пустом значении в столбе С рядом, ставилось бы 'n' вместо 'u'. Для отличных от 4 и 2 ставятся верно n в строки, в которых в столе C пусто.

Автор - w00t
Дата добавления - 10.03.2016 в 01:04
Wasilich Дата: Четверг, 10.03.2016, 01:35 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 877
Репутация: 222 ±
Замечаний: 0% ±

2003
Что бы понять, попытался разложить по своему. Даже если не так то все равно на этом все, мозги дымят. Отказываются работать. %) :)
К сообщению приложен файл: w00t2.xls(44Kb)
 
Ответить
СообщениеЧто бы понять, попытался разложить по своему. Даже если не так то все равно на этом все, мозги дымят. Отказываются работать. %) :)

Автор - Wasilich
Дата добавления - 10.03.2016 в 01:35
w00t Дата: Четверг, 10.03.2016, 01:49 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 126
Репутация: 3 ±
Замечаний: 0% ±

Wasilich, я тут попутно еще поковырял, и вроде сделал, поправив одну строку. Привычка думать еще формулами, в vba так себе, потому логично функция стала больше на формулу похожа.

[vba]
Код
Cells(Target.Row, 1) = IIf(Cells(Target.Row, 3) <> "", "u", "n")
[/vba]

У Вас похоже, только из общей конструкции выпадает, наверное из-за моего кривого пояснения. Вроде как теперь верно отрабатывает, прикладываю. Спасибо большое за ответы по треду, были полезными.
К сообщению приложен файл: 3599363.xlsm(19Kb)


Сообщение отредактировал Manyasha - Четверг, 10.03.2016, 10:56
 
Ответить
СообщениеWasilich, я тут попутно еще поковырял, и вроде сделал, поправив одну строку. Привычка думать еще формулами, в vba так себе, потому логично функция стала больше на формулу похожа.

[vba]
Код
Cells(Target.Row, 1) = IIf(Cells(Target.Row, 3) <> "", "u", "n")
[/vba]

У Вас похоже, только из общей конструкции выпадает, наверное из-за моего кривого пояснения. Вроде как теперь верно отрабатывает, прикладываю. Спасибо большое за ответы по треду, были полезными.

Автор - w00t
Дата добавления - 10.03.2016 в 01:49
w00t Дата: Суббота, 12.03.2016, 00:07 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 126
Репутация: 3 ±
Замечаний: 0% ±

Dim X
X = Target.Value
Application.Undo

Прошу извинить, что вновь акутализировал эту ветку.
Решение простое и гениальное. Чем короче и проще, тем лучше.

Но, если мы вводим в какую-то ячейку в чистом экселе данные и нажимаем ввод - то выделение смещается вниз на ячейку.
А здесь получается, мы заменили значение тем же самым. И при нажатии ввода, происходит "дергание" и выделение остается на текущей ячейке.

Как можно этого избежать? Просто возможен как массовый копипаст прежних значений теми же самыми, так и поячеечный. Визуально немного не очень выглядит.
 
Ответить
Сообщение
Dim X
X = Target.Value
Application.Undo

Прошу извинить, что вновь акутализировал эту ветку.
Решение простое и гениальное. Чем короче и проще, тем лучше.

Но, если мы вводим в какую-то ячейку в чистом экселе данные и нажимаем ввод - то выделение смещается вниз на ячейку.
А здесь получается, мы заменили значение тем же самым. И при нажатии ввода, происходит "дергание" и выделение остается на текущей ячейке.

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

Автор - w00t
Дата добавления - 12.03.2016 в 00:07
Wasilich Дата: Суббота, 12.03.2016, 09:08 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 877
Репутация: 222 ±
Замечаний: 0% ±

2003
w00t, мой вариант решения задачи, Вас не обязывает к его применению.
Запросите у форумчан другое решение. Я же здесь не один. :)
 
Ответить
Сообщениеw00t, мой вариант решения задачи, Вас не обязывает к его применению.
Запросите у форумчан другое решение. Я же здесь не один. :)

Автор - Wasilich
Дата добавления - 12.03.2016 в 09:08
KuklP Дата: Суббота, 12.03.2016, 10:09 | Сообщение № 13
Группа: Проверенные
Ранг: Старожил
Сообщений: 2006
Репутация: 436 ±
Замечаний: 20% ±

[vba]
Код
Target = x: Target(2).Select
[/vba]


Ну, с НДС и мы чего-то стoим! kuklp@mail.ru
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение[vba]
Код
Target = x: Target(2).Select
[/vba]

Автор - KuklP
Дата добавления - 12.03.2016 в 10:09
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Изменение ячейки из диапазона (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!