Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2012, 02:09   #1
blackarrow
Пользователь
 
Регистрация: 14.05.2011
Сообщений: 37
По умолчанию ссылки на ячейки в пользовательких функциях

Господа, есть такой вопрос. В талмуде Уокенбаха (Ексел 2010 проф. программирование на VBA) имеется такой кусок:
Use arguments, not cell references
All ranges that are used in a custom function should be passed as arguments. Consider the following function, which returns the value in A1, multiplied by 2:
Function DoubleCell()
DoubleCell = Range(“A1”) * 2
End Function
Although this function works, at times, it may return an incorrect result. Excel’s calculation engine can’t account for ranges in your code that aren’t passed as arguments. Therefore, in some cases, all precedents may not be calculated before the function’s value is returned. The DoubleCell function should be written as follows, with A1 passed as the argument:
Function DoubleCell(cell)
DoubleCell = cell * 2
End Function
Так складывается ситуация, что нужно сделать функцию именно со ссылками на ячейки с некоторыми константами (их около 100, очень не хочу вводить их аргументами). Не могу понять, Уокенбах говорит, что оно работает, даже приводит пример, но в то же время предупреждает но в отдельных случаях может не работать? Вопрос - В КАКИХ? Заранее спасибо если кто знает.
blackarrow вне форума Ответить с цитированием
Старый 06.07.2012, 08:47   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Попробуйте в новой книге ввести первую функцию, т.е. =DoubleCell() в яч. А2 и менять ячейку А1. Ячейка А2 не меняется! Потому что Excel не видит явной зависимости функции от А1, ведь у нее нет аргументов.
В случае с константами такой опасности нет, но есть другая. Выражение Range("A1") относится к активному листу. Если функция введена на несколько листов, то при пересчете книги функции на всех листах используют значение А1 активного листа (а не того, с которого вызваны).

Присвойте ячейкам с константами имена, используйте в VBA как [Имя].
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 06.07.2012, 10:50   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Ячейка А2 не меняется! Потому что Excel не видит явной зависимости функции от А1, ведь у нее нет аргументов.
Однако, для того, чтобы функция стала автоматически пересчитываемой (что устранит эту проблему), достаточно первой строкой кода функции добавить
Код:
Application.Volatile
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 06.07.2012, 11:45   #4
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

не всё что "можно", однако же "нужно".
такой замечательный способ приведёт к пересчёту функции при каждом изменении на любом листе любой открытой книги и не только - например, при изменении условий автофильтра функция тоже будет вызываться на пересчёт.

что даже при не слишком большом количестве вызовов затормозит Excel "неподеццки".
ikki_pf вне форума Ответить с цитированием
Старый 06.07.2012, 20:38   #5
blackarrow
Пользователь
 
Регистрация: 14.05.2011
Сообщений: 37
По умолчанию

2 Казанский
Спасибо. Собственно, мне было известно, что функция пересчитывается только при изменении аргумента. Для моей задачи это вполне подходит и учтено в решении. Сбило с толку описание с неопределенностями "at times", "may return"... Как будто описывается какой-то плавающий плохо воспроизводимый баг. Почему бы не сказать просто и четко - пересчет только по изменению аргументов. Опционально - через application.volatile.

В данной ситуации, думаю, можно сделать вывод, что формулировка "Excel’s calculation engine can’t account for ranges in your code that aren’t passed as arguments" просто не точно отражает суть. Точным будет вариант "Excel’s calculation engine can’t account for changes in ranges in your code that aren’t passed as arguments". В русской версии это изложено, кстати, еще хуже - "иногда перед возвратом функцией значения не вычисляются все связанные величины".
blackarrow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel2007 не вставляет ссылки на ячейки из другой книги ABCSamara Microsoft Office Excel 8 07.06.2012 16:56
замена названия ссылки в ячейки bize Microsoft Office Excel 6 14.01.2012 15:11
зависимость ссылки от ячейки ramzan_s Microsoft Office Excel 5 24.07.2011 02:02
Использование параметров ячейки во вновь созданной ссылки на данную ячейку offza Microsoft Office Excel 2 20.07.2011 13:07
Ссылки на ячейки через несколько строк Marcellus Microsoft Office Excel 6 20.08.2008 08:53