|
|
|
Распознать отмену изменений в Validation.
|
|||
|---|---|---|---|
|
#18+
Здраствуйте, Пытаюсь настроить событие Worksheet_Change, чтобы оно выполнянло код при изменении ячейки с выпадающим списком (через validation). Нужно, чтобы оно происходило тогда, когда значение выбрано из списка. Сейчас проблема в том, что если ввести туда что-то, потом в окне с ошибкой нажать Cancel, то worksheet_change выполняется 2 раза, причем оба раза Target.Value одинаковое. Проверяю так: Private Sub Worksheet_Change(ByVal Target As Range) If Range("E7").Item(1).Address = Target.Address Then MsgBox Range("E7").Item(1).Value & vbCr & Target.Address End If End Sub Соответственно пока я правлю на неправильные значения в списке и жму Retry этот эвент не выполняется, но потом если я нажму Cancel либо выберу нормальное значение из списка то этот MsgBox выскакивает столько раз сколько я нажал retry/cancel. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2009, 09:27:50 |
|
||
|
Распознать отмену изменений в Validation.
|
|||
|---|---|---|---|
|
#18+
можно перехитрить иксель так: Private Sub Worksheet_Change(ByVal Target As Range) if Range("E7").Item(1).Value<>"" then If Range("E7").Item(1).Address = Target.Address Then MsgBox Range("E7").Item(1).Value & vbCr & Target.Address End If endif End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2009, 11:10:08 |
|
||
|
Распознать отмену изменений в Validation.
|
|||
|---|---|---|---|
|
#18+
Так суть в том, что эвент вызывается когда validation закончилось и Range("E7").Item(1).Value = выбранному из списка значению либо предыдущему значению (если было нажато cancel). Когда жмешь просто del на ячейку то worksheet_change вообще не вызывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2009, 12:15:59 |
|
||
|
Распознать отмену изменений в Validation.
|
|||
|---|---|---|---|
|
#18+
вам надо показывать сообщение только когда выбрано новое значение? можно тогда запоминать значение в переменную и потом сравнивать Dim old As String Private Sub Worksheet_Change(ByVal Target As Range) If old <> Target.Value Then If Range("E7").Item(1).Address = Target.Address Then MsgBox Range("E7").Item(1).Value & vbCr & Target.Address End If old = Target.Value End If End Sub hope this is helpfull ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2009, 15:35:25 |
|
||
|
Распознать отмену изменений в Validation.
|
|||
|---|---|---|---|
|
#18+
Поясню ещё раз что происходит :) есть код Код: plaintext 1. 2. В Е7 список предположим из 5 значений "Value1, Value2, Value3, Value4, Value5" Выбрано предположим Value3. Я жму и мне лень тыкать мышкой, печатаю Vale1, жму ентер, выдает ошибку, жму retry Исправляю на Value1, жму ентер. Выскакивает 2 MsgBoxа по очереди с одинаковым текстом: Value1 $E$7 То есть это означает, что 2 раза выполняется worksheet_change с одинаковым Target (уже после всех изменений validation). Если ошибочно ввести 2-3-4-5 раз, то код выполнится 2-3-4-5 раз. Есстественно у меня там не MsgBox должен быть, а некий код на 1-2 секунды выполнения (забрать текст из таблицы, форматнуть, скопировать в специальное место, в зависимости от нового значения забрать из большой таблицы новые данные и записать в маленькую таблицу, форматнуть опятьже). Ок, когда оно выполняется 1 раз, экран мигнул и юзер доволен, но когда оно 5 раз прыгает и мигает 10 секунд выглядит криво :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2009, 15:55:40 |
|
||
|
Распознать отмену изменений в Validation.
|
|||
|---|---|---|---|
|
#18+
nporaMep, в последнем варианте я предложила сравнивать текущее значение с предыдущему и, если значение не равно, код выполнится, если же равно не выполнится. При этом ивент будет срабатывать несколько раз при ретри и кенсел, но код не будет выполняться, т.к. значение при этом не будет меняться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2009, 16:18:44 |
|
||
|
|

start [/forum/topic.php?fid=61&fpage=204&tid=2179831]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
277ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 198ms |
| total: | 561ms |

| 0 / 0 |
