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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2013, 15:29   #1
RISagitov
Форумчанин
 
Регистрация: 19.05.2012
Сообщений: 237
По умолчанию Как сделать так, чтоб vba функция вызываемая из ячейки запускалась всего один раз?

... а не каждый раз при открытии книги (и наступлении других событий)

ps дело в том, что функция слишком долго выполняется
и если она вызывается из многих ячеек, то ждать приходится слишком долго (например при открытии документа или при изменении данных)
RISagitov вне форума Ответить с цитированием
Старый 07.03.2013, 16:04   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

1. Разделить этапы выполнения функции на при открытии, при изменении и т.д. - оптимизировать процесс выполнения.

2. Завести глобальную переменную, которая регулирует срабатывание макроса. Для открытия, например, можно хранить где-то дату последнего срабатывания (в какой-либо скрытой ячейке) и если текущая дата не совпадает с ней, то запускать обработку.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 07.03.2013, 16:34   #3
RISagitov
Форумчанин
 
Регистрация: 19.05.2012
Сообщений: 237
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
2. Завести глобальную переменную, которая регулирует срабатывание макроса. Для открытия, например, можно хранить где-то дату последнего срабатывания (в какой-либо скрытой ячейке) и если текущая дата не совпадает с ней, то запускать обработку.
можно и так, но не все так просто

одна и та же функция vba вызывается сотни раз из сотен разных ячеек на рабочем листе

например одна ячейка вызывает функцию с параметрами неделя №7, год 2013

вторая ячейка для восьмой недели, и тд
RISagitov вне форума Ответить с цитированием
Старый 07.03.2013, 16:39   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

оптимизируйте алгоритм - логику запуска и работы функции (общий вопрос - общий ответ)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 07.03.2013, 17:50   #5
RISagitov
Форумчанин
 
Регистрация: 19.05.2012
Сообщений: 237
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
оптимизируйте алгоритм - логику запуска и работы функции (общий вопрос - общий ответ)
оптимизировать алгоритм который обрабатывает столько строк, которые даже после оптимизации едва влезают (по высоте) в excel 2007 листы?

..причем обрабатывает многократным поиском по нескольким полям


в действительности не хватает всего лишь одной галочки запрещающей пересчитывать уже подсчитанные значения

Последний раз редактировалось RISagitov; 07.03.2013 в 17:57.
RISagitov вне форума Ответить с цитированием
Старый 07.03.2013, 18:09   #6
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 906
По умолчанию

RISagitov, вот так можно отключать пересчёт формул:
  1. с помощью программы "Excel 2010":
    Файл - Параметры - Формулы - Параметры вычислений - кружок вручную;
  2. с помощью VBA:
    Код:
    Application.Calculation = xlCalculationManual
Скрипт вне форума Ответить с цитированием
Старый 07.03.2013, 18:19   #7
RISagitov
Форумчанин
 
Регистрация: 19.05.2012
Сообщений: 237
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
RISagitov, вот так можно отключать пересчёт формул:
  1. с помощью программы "Excel 2010":
    Файл - Параметры - Формулы - Параметры вычислений - кружок вручную;
  2. с помощью VBA:
    Код:
    Application.Calculation = xlCalculationManual
спасибо, то что нужно
RISagitov вне форума Ответить с цитированием
Старый 07.03.2013, 18:33   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Думал не получится... Но получилось, правда не совсем как заказывали - срабатывает один раз за сеанс.
Код:
Public dic As New dictionary

Function test(r As Range, rr As Range)
    Dim t$
    t = Application.ThisCell.Parent.Name & "|" & Application.ThisCell.Address
    If dic.Exists(t) Then
        test = dic.Item(t)
    Else
        test = r + rr
        dic.Item(t) = test
    End If
End Function
Подключить scripting.runtime.
Но вообще лучше бы свой код написали чтоб не тормозило - на 90% уверен что написан неоптимально.

P.S. Если будут аналогичные формулы в разных одинаковых книгах - то не знаю...
Тогда добавить в критерий ещё и полное имя книги, а объявление переменной перенести в personal.xls. Возможно... Не тестил.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 07.03.2013 в 18:43.
Hugo121 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать чтоб запускалась нужная форма проекта Federer Помощь студентам 6 07.11.2012 08:39
Как сделать так чтоб разграниченные ячейки не считались заполненными Zlodeyatel Microsoft Office Excel 4 24.09.2012 23:25
как сделать так что бы первая операция вызывалась лишь один раз? phasha Помощь студентам 8 24.10.2011 13:53
Как сделать так,чтобы программа запускалась с включением компьютера? InseR Общие вопросы Delphi 24 12.02.2008 18:55
Как сделать, чтобы программа запускалась один раз, т.е. повторно запустить нельзя??? Kamikadze_666 Безопасность, Шифрование 7 31.07.2007 08:34