Проблема с Worksheet_Calculate

Программирование на Visual Basic for Applications
Estilla
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 27.09.2006 (Ср) 21:07
Откуда: Москва

Проблема с Worksheet_Calculate

Сообщение Estilla » 20.03.2008 (Чт) 1:18

Кто-нить знает как побороть такую проблему:
В листе есть код с событием Worksheet_Calculate
Проблема в том, что событие срабатывает когда происходи калькуляция в любом листе книги, а не только в том где расположен код.
Что характерно, появилось такое недавно, раньше такой проблемы не было.
p.s. Excel 2007 с последними обновлениями.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 20.03.2008 (Чт) 12:49

Почти уверен, что на том листе, к которому привязано событие, теперь есть формула, в вычислении которой участвует ячейка с другого листа, а раньше таковой не было.
Быть... или не быть. Вот. В чём вопрос?

Estilla
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 27.09.2006 (Ср) 21:07
Откуда: Москва

Сообщение Estilla » 20.03.2008 (Чт) 23:08

uhm писал(а):Почти уверен, что на том листе, к которому привязано событие, теперь есть формула, в вычислении которой участвует ячейка с другого листа, а раньше таковой не было.

Да нет. Я создавал пустой лист. Изменял там ячейку и результат тот же. :(

p.s. или вы имеете в виду, что наличие в листе(с событием Calculate) формулы ссылающееся на какой либо лист, вызывает описываемый мной эффект на _любом листе?

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.03.2008 (Пт) 11:25

Нет, только то, что я написал. Событие Calculate генерируется пересчетом любой формулы, но именно на листе, к которому событие привязано. Наличие в формулах на листе хотя бы одной волатильной функции (см. Application.Volatile) приводит к тому, что Calculate будет вызываться при любом изменении любой ячейки, но опять-таки только на том же листе. Если событие происходит при изменении ячейки, не влияющей на данный лист, это похоже на баг.
Быть... или не быть. Вот. В чём вопрос?

Estilla
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 27.09.2006 (Ср) 21:07
Откуда: Москва

Сообщение Estilla » 21.03.2008 (Пт) 12:20

uhm писал(а):Если событие происходит при изменении ячейки, не влияющей на данный лист, это похоже на баг.

именно так.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.03.2008 (Пт) 12:37

Дальнейшие варианты:

1) Забить :)

2) Вывесить сюда книгу с этой ошибкой (меня уже гложет любопытство :) )

3) Попытаться сделать книгу "с нуля", отслеживая, в какой момент появится ошибка (если появится вообще)
Быть... или не быть. Вот. В чём вопрос?

Estilla
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 27.09.2006 (Ср) 21:07
Откуда: Москва

Сообщение Estilla » 21.03.2008 (Пт) 12:53

uhm писал(а):Дальнейшие варианты:
3) Попытаться сделать книгу "с нуля", отслеживая, в какой момент появится ошибка (если появится вообще)


да, этим я и решил заняться. Спасибо.
Только не книгу, а этот "зловредный" лист, поскольку создавая новый лист с таким же событием, он не вел себя аналогично "зловредному".
Как выясню, обещаю рассказать из-за чего такое произошло.

Estilla
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 27.09.2006 (Ср) 21:07
Откуда: Москва

Сообщение Estilla » 27.03.2008 (Чт) 21:33

uhm писал(а):Дальнейшие варианты:
2) Вывесить сюда книгу с этой ошибкой (меня уже гложет любопытство :) )


Ну вот, как и обещал:
1. Открываем новую книгу
2. К примеру в листе 1 в любой ячейке пишем формулу с функцей ДВССЫЛ
3. В модуле листа 1 пишем код с событием Calculate
4. В любом другом листе изменяем любую ячейку и получам ответ от Calculate

пример во вложении. (Лист1 там называется ДВССЫЛ)
Вложения
bug.zip
баг
(10.52 Кб) Скачиваний: 130

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 30.03.2008 (Вс) 3:36

Нвсколько мне известно, это не баг, а фича. Такое поведение свойственно ДВССЫЛ, было как минимум в Office2003, и на мой взгляд вполне логично (хотя и неудобно):
1) ДВССЫЛ может ссылаться на любой диапазон на любом листе
2) диапазон в данной функции обозначается не ссылкой, а текстом
3) как по твоему твоя формула узнает об изменениях произошедших на другом листе кроме как пересчитав на всякий случай при любом событии на уровне книги способном вызвать пересчет?
4) кстати, точно также ведут себя все летучие функции Excel: СЛЧИС(), ТДАТА(), СЕГОДНЯ(), СМЕЩ(), ЯЧЕЙКА(), ИНФОРМ()
5) еще информация

uhm писал(а):Событие Calculate генерируется пересчетом любой формулы, ..., но опять-таки только на том же листе.

uhm, ты уверен, что правильно поставил эксперимент? Попробуй с любой встроенной летучей (волатильной) функцией. У меня на разных машинах в Office2003 и Office2007, на русском (MUI), английском и испанском (MUI), поведение одинаковое - срабатывает при изменении на любом листе.
Привет,
KL

Estilla
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 27.09.2006 (Ср) 21:07
Откуда: Москва

Сообщение Estilla » 30.03.2008 (Вс) 18:30

KL писал(а):Нвсколько мне известно, это не баг, а фича. [/url]


Ясно, очередной для меня камушек. Спасибо за подробные разъяснения. Пойду в обход.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 112

    TopList