1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
|||||||||||
1 | |||||||||||
Excel: Вызов функций Application из тела функции08.05.2014, 09:54. Показов 8563. Ответов 20
Метки нет (Все метки)
Такая проблема. Работаю в эксель книге. Нужно открыть конкретную другую книгу, выполнить в ней поиск и взять нужные значения.
Мне нужно, чтобы сие действие выполнялось внутри функции (она производит расчет, и ей нужны данные из того второго файла-справочника). Запихиваю тот же код в функцию.
Работаю в экселе 2013, опыт показал, что в 2003 то же самое, попытка даже просто создать книгу, или закрыть эксель ни к чему не приводит. В Sub - все работает. Гуглила на тему функций и процедур - не нашла упоминаний, что нельзя так делать. Объясните в чем дело? Для себя пока что написала макрос, что копирует справочник в текущую книгу, и брать значения буду из него, возможно, что так даже лучше, но вопрос остался открытым.
0
|
08.05.2014, 09:54 | |
Ответы с готовыми решениями:
20
Вызов процедур и функций пользователя из тела класса VBA InternetExplorer.Application вызов объекта/функции Создать объект Excel.Application: var Obj=Server.CreateObject('Excel.Application'); Вызов пользовательских функций, как встроенных в Excel |
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
||||||
08.05.2014, 10:20 | 2 | |||||
marqueemarmot, функция "не имеет права" менять что-либо в объектах Excel, в т.ч. открывать/закрывать книги, создавать/удалять листы, даже форматировать ячейки.
Однако, можно открыть как COM-объект:
1
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
|
08.05.2014, 10:25 [ТС] | 3 |
Казанский, спасибо.
думала об этом, но не нашла информации... (а есть линк, где это написано, мсдн, или хотя б книжка какая?) Вообще-то не очень логично, конечно... как раз думала о том, чтобы другая функция в зависимости от некоторых результатов внутри себя (не возвращаемого значения) окрашивала ячейку, в которой я ее вызываю, или хотя бы хинт делала.. это реально как-то сделать?
0
|
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
08.05.2014, 10:50 | 4 |
marqueemarmot, почитайте Вытянуть данные из закрытых книг в Excel
Красить ячейку можно условным форматированием.
1
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
|
08.05.2014, 10:58 [ТС] | 5 |
не выйдет, поскольку окрашивать хочу не по результатам, возвращаемым функцией. Объясняю. Логика такая, считаем некое A=F(x,y). При этом есть некая функция B(x,y), которая определяет насколько достоверно пользоваться функцией A=F(x,y). Вот и хотелось бы, когда достоверность низкая, чтобы он окрашивал результат. Можно конечно в соседнем столбце отдельно определять достоверность и в соответствии с ней окрашивать, но это очень неудобно, потому, что даже А - это лишь промежуточные вычисления, и загромождать лист не хочется. Опять же возможно, я и приду к тому, что все расчеты делать на другом листе, копируя туда инфу, и хранить там все промежуточные расчеты, а на исходный лист выводить уже только нужну информацию... но это крайне неудобно
0
|
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
08.05.2014, 13:16 | 6 |
marqueemarmot, пользовательскую функцию можно использовать в условном форматировании.
И почему бы все расчеты не делать в VBA, а на лист только результаты выводить?
0
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
|
09.05.2014, 12:45 [ТС] | 7 |
ну, многое проще уже встроенными функциями Экселя, скажем линейную и квадратичную аппроксимацию. А так вобщем-то на лист и вывожу только то, что нужно. Просто работа исследовательская и часть "условно промежуточных" данных важна для анализа.
0
|
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
09.05.2014, 13:03 | 8 |
Сообщение было отмечено marqueemarmot как решение
Решение
Встроенные функции можно и нужно использовать в VBA!
Причем это можно делать двумя способами: функция как метод объекта Application (или объекта Application.Worksheetfuncion), или вызывая интерпретатор формул Evaluate. В этой теме используются оба способа, и даже еще один - [A1:K50] это неявный вызов evaluate("A1:K50"): Удалить 20% максимальных чисел в столбце Excel 2007
0
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
|||||||||||
12.05.2014, 10:08 [ТС] | 9 | ||||||||||
Опять проблема - есть функция:
Добавлено через 2 минуты П.С. не по теме, а можно как-то пообщаться по аське, или в скайпе/вк?
0
|
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|||||||||||
12.05.2014, 10:34 | 10 | ||||||||||
Сообщение было отмечено marqueemarmot как решение
Решение
marqueemarmot, чтобы работать с листом, вовсе не нужно его активировать (функции это тоже "запрещено").
В Excel2000 еще метод Range.Find в функции не работал, в 2003 уже работал. Хотя вместо него вполне можно использовать ПОИСКПОЗ. Так немного быстрее будет - меньше обращений к ячейкам:
0
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
|
12.05.2014, 11:11 [ТС] | 11 |
почти дошла до этого
VBA всегда присваивает новой переменной значение 0/Flalse? я смотрю, комментировано первое присваивание
0
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
||||||
12.05.2014, 14:02 [ТС] | 12 | |||||
По поводу идеи про условное форматирование. Описала функцию:
Имею такие вычисления - во вложении. Задача - подсвечивать значение, вычисляемое zrkA, если значение DensCritCmp от тех же параметров больше 0.5. Попробовала вставить в условное форматирование как формулу, переправил мне формулу (ссылки в ней) на не пойми куда: было RC[-4] стало RC[16380]
0
|
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
12.05.2014, 14:40 | 13 |
Да.
Сообщение от F1 - Dim Statement
Наверно, ко всей строке УФ применили. В этом случае Excel меняет ссылки как для первой (или последней?) ячейки строки и закольцовывает диапазон, т.е. вместо 0 столбца становится 16384, вместо -1 столбца 16383 и т.д. Попробуйте назначить УФ для ограниченного диапазона ячеек так, чтобы ссылки не уходили за край листа.
0
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
||||||
13.05.2014, 09:03 [ТС] | 14 | |||||
И еще, в продолжение той же темы. Есть макрос, который обсчитывает данные текущего листа, в итоге я его зацикливаю по всем листам книги (около 300). Он использует встроенный экселевский расчет аппроксимаций, в данном случае линейный (условно, потому как подразумевается степенная зависимость, перевожу ее к линейному виду через логарифмирование) и обрабатываю. Мне нужно еще добавить квадратичное, что не бог весть какая задача, Вопрос в другом. Может быть есть предложения, как переписать более эффективно данный код...
Алгоритмически я прологарифмированные данные переношу вниз листа, там обрабатываю ИНДЕКС и ЛИНЕЙН, отбрасываю выпадающие точки и снова рассчитываю коэффициенты аппроксимации. При этом приходится сохранять полученные значения на листе. Вопрос больше именно про эффективность, быть может, можно обойтись без копирования диапазона ячеек вниз листа для расчета,а создания некоего диапазона/массива данных, с которым уже работать. Если есть идеи, буду благодарна. Не по теме: Надеюсь не достала :) Знаю, много вопросов, в том числе и дурацких, но совсем никого нет рядом знающего, гугл тонкостей сходу не дает, при этом нет времени циклиться на полноценном решении проблем, приходится затыкать дыры и идти дальше, что потом сильно мешает Добавлено через 13 часов 5 минут собственнокод
1
|
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
13.05.2014, 10:53 | 15 |
Нет, напротив! Приятно видеть, что кто-то применяет программирование к науке, а не к деланию денег из воздуха (игра на бирже, реклама, SEO...).
А собственноданные будут, на который можно попробовать?
0
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
|
13.05.2014, 11:16 [ТС] | 16 |
кидаю почищенный файл. не стала убирать другие макросы обработки, по ним тож могут возникнуть вопросы позже мне сейчас нужно воспринять культуру обращения с данными - как и куда считать, обработать, и вернуть обратно или на новое место. Потому что по большей части записываю конкретное действие макросом, потом переправляю так, чтобы работал универсально. Понимаю, что при этом топором золотую цепочку кую )) Не по теме: Приятно, когда у человека есть желание делиться навыками (сама преподаю), и приятно, когда есть адекватные ученики, ЖЕЛАЮЩИЕ учиться, а не просто получить оценки/выгоду... По алгоритмике: открываем файл, на пятом листе - с данными. Запускаем макрос TdepNowThis (он запускает указанный выше макрос для текущего листа).
0
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
||||||||||||||||
14.05.2014, 14:52 [ТС] | 17 | |||||||||||||||
Казанский, нужна помощь. Туплю. было так:
сделала:
0
|
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
14.05.2014, 14:58 | 18 |
Посмотрите этот пример. Пройдите программу по шагам (F8), наблюдайте за переменными в окне Locals (View - Locals window).
Функция ЛИНЕЙН возвращает массив. Чтобы выгрузить массив на лист, не нужно извлекать отдельные элементы функций ИНДЕКС, лучше сразу.
0
|
1 / 1 / 0
Регистрация: 08.05.2014
Сообщений: 19
|
||||||||||||||||||||||||||
15.05.2014, 13:03 [ТС] | 19 | |||||||||||||||||||||||||
Я в принципе поняла это, парясь по мсдну. Спасибо. Завтра буду уже ваять обработку...
Добавлено через 19 часов 3 минуты
Добавлено через 1 час 53 минуты Итак. то, что получилось для расчета линейной и квадратичной регресии:
0
|
15151 / 6424 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
19.05.2014, 09:44 | 20 |
В файле показал, как это делать, двумя способами.
У меня в 2000 и в 2007 работает и то, и другое.
Разница в следующем: если при вычислении функции возникает ошибка, WorksheetFunction.Func вызывает ошибку VBA, а Application.Func возвращает Variant/Error. Поэтому в первом случае необходимо предусмотреть обработчик ошибок, а во втором случае после вызова надо проверять If IsError(...) Then
0
|
19.05.2014, 09:44 | |
19.05.2014, 09:44 | |
Помогаю со студенческими работами здесь
20
Вызов функции из другой функции и обратно. Общие переменные функций Вызов функций в функции Ошибка "Присваивание имени функции вне тела этой функции" при наличии двух одноименных функций в одном контексте Вызов функций зная название класса и функции Вызов функции до ее определения или область видимости функций в FireFox Вызов функции, точка с запятой, фигурные скобки, внутри которых другие вызовы функций Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |