Строка VBA в формулу

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

Function Evalue(ByVal str As String)
Application.Volatile
Evalue = Evaluate([str])
End Function

У меня есть массив со всеми формулами, которые я использую как строку. В зависимости от случая я использую ИНДЕКС/ПОИСКПОЗ, чтобы выбрать хорошую формулу, а затем Evalue, чтобы оценить ее.

Если строковая формула находится в 1 блоке, например SUM(A1:A20), она работает отлично. Но если она находится в нескольких блоках, например

SUM(A1:A20)-SUM(B1:B20) он возвращает ошибку #NAME, если я помещаю строку в массив между ' ' или " ", он возвращает ошибку #VALUE.


person user2118020    schedule 02.12.2013    source источник
comment
Как насчет (SUM(A1:A20)-SUM(B1:B20))?   -  person    schedule 02.12.2013
comment
Все еще #NAME ошибка...   -  person user2118020    schedule 02.12.2013
comment
О верно. вероятно, снимите [] с str при вызове Evaluate. Проверка сейчас...   -  person    schedule 02.12.2013
comment
Сделал это все еще #NAME Ошибка... очень плохо для меня   -  person user2118020    schedule 02.12.2013
comment
Это в модуле или на листе? Если функция находится в модуле, она не будет знать, на какой лист вы ссылаетесь. я бы попробовал Evaluate("=SUM(Sheet1!A1:A20)-SUM(Sheet1!B1:B20)")   -  person John Alexiou    schedule 02.12.2013
comment
Нет, это на листе   -  person user2118020    schedule 02.12.2013
comment
@ ja72 Примечание: я поместил ту же функцию в модуль и просто вызвал ее из листа, не указывая, на каком листе A1 и т. д. (с 1 исправлением)   -  person    schedule 02.12.2013


Ответы (1)


** snip ** Исходный код работает так же хорошо, как написано.

Ячейка, которую я тестировал, выглядела так:

=Evalue("SUM(A1:A3)-SUM(B1:B3)")

Вот проблема с безопасностью:

По-видимому, когда вы впервые открываете и сохраняете книгу, хранения кода в модуле достаточно, чтобы сделать его доступным для запуска из ячеек листа. Однако в следующий раз, когда вы откроете тот же рабочий лист (даже если на нем включены макросы), восстановить работу будет намного сложнее. Судя по всему, исходный код работает нормально, как написано. Однако Excel подсказывает, что он существует, а затем сообщает об ошибке #NAME, когда вы пытаетесь его использовать. Здесь есть ветка с дополнительной информацией:

http://social.msdn.microsoft.com/Forums/en-US/0a79b7d8-178e-4cf5-8bc3-782a58b55a8b/vbaexcel-function-defined-by-user-gives-error-personalxlsb-weird?forum=isvvba

Судя по всему, для выполнения простейшей операции требуется установка «надстройки». (Или вы можете использовать свой файл personal.xlsb)

person Community    schedule 02.12.2013
comment
=Evalue("SUM(A1:A3)-SUM(B1:B3)") эта формула с " " дает ошибку #VALUE вместо ошибки #NAME. Если я запускаю =SUM(A1:A3)-SUM(B1:B3), все работает нормально - person user2118020; 02.12.2013
comment
@user2118020 user2118020 Похоже, проблема с разрешениями, см. правки выше. - person ; 02.12.2013