Excel VBA присваивает значение именованному диапазону из пользовательской функции не работает ошибка 1004

У меня есть функция в модуле. Функция определяется следующим образом:

Public Function CourseSetup(ByVal SROfferId As Integer) as string

Когда функция вызывается, следующая строка не работает:

Worksheets("CourseEvaluation").Range("CourseName").value = "1234" 

выходит из строя с ошибкой 1004.

Эта же строка в подпрограмме (макросе) работает. CourseName - это одна ячейка с именем ранжированного. Получение значения для вышеуказанного диапазона работает.

В ближайшем окне:

?Worksheets("CourseEvaluation").Range("CourseName").value 

возвращает текущее значение в диапазоне.


person Moshe Yalovsky    schedule 18.04.2013    source источник
comment
Вы вызываете эту функцию из формулы рабочего листа?   -  person David Zemens    schedule 19.04.2013
comment
Да, введя = CourseSetup (+ srof)   -  person Moshe Yalovsky    schedule 19.04.2013


Ответы (3)


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

Это сохраняет зависимости в формулах, предотвращает ошибки циклических ссылок и т. Д.

Как правило используйте подпрограммы для управления объектами и формулы для возврата значений (будь то ссылка на ячейку или переменная).

Единственным исключением является то, что UDF, вызываемая из внутри подпрограммы, может манипулировать объектами рабочего листа, но это, вероятно, не лучшая привычка для начала. Ограничьте свои функции возвратом значений в переменные / ячейки и используйте подпрограммы для управления объектами.

Дополнительная литература:

Как заставить функции Excel влиять на «другие» ячейки

http://www.excelforum.com/excel-programming-vba-macros/477157-changing-cell-values-from-within-udf.html

http://www.ozgrid.com/Excel/free-training/ExcelVBA1/excelvba1lesson21.htm

person David Zemens    schedule 19.04.2013
comment
Я видел такое поведение, но мне нужно ваше подтверждение! Это имеет смысл с точки зрения безопасности. Спасибо - person Moshe Yalovsky; 19.04.2013

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

person Charles Williams    schedule 19.04.2013
comment
Я видел такое поведение, но мне нужно было подтверждение. Спасибо! - person Moshe Yalovsky; 19.04.2013

Я столкнулся с этой проблемой несколько дней назад и нашел ответ. преобразование в подпрограмму из функции решило проблему. Однако, если я вызвал функцию в непосредственном окне, она работала так, как хотелось. подумал, что это было странно.

person user2015833    schedule 09.08.2018