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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2012, 21:40   #1
Jarik
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 53
По умолчанию Остановка и перезапуск макроса в цикле

добрый день.

Работая с одной из библиотек фунцкий столкнулся со следующей проблемой.

Допустим есть некоторая библиотечная функция
Код:
Function A(x)
при этом ее вычисление занимает некоторое значимое время (около секунды)

проблема в следующем.
есть sheet "DATA" со столбцом аргуметов x (столбец А) и столбцом функций A(x) (столбец B)
Мне необходимо несколько раз поменять аргументы и сохранить соответствующие значения функции A на отдельный лист "RESULT".
В коде это выглядило бы так

Код:
Sub SaveValues()

    With Sheets("DATA")
        'n - nuber of experiments
        For i = 1 To n
            For j = 1 To 100
                .Cells(j, 1) = Rnd()
            Next j
        Next i
        
        .Cells(1, 2).Resize(100, 1).Copy
        Sheets("RESULT").Cells(1, j).PasteSpecial xlPasteValues
    End With
End Sub
Однако при выполнении кода функция A не успевает вычислиться при каждой итерации цикла и чоответственно я сохраняю только значения "#N/A"
как с этим можно бороться?

P.S. вызов функции из VBA не предлагать - не работает.
P.S.S К сожалению не могу выслать пример, т.к. функция A работает только вместе со спецефическим приложением у меня на работе.

Заранее спасибо!
Jarik вне форума Ответить с цитированием
Старый 20.02.2012, 23:33   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Попробуйте так:
Код:
Sub SaveValues()
Application.Calculation = xlCalculationManual
With Sheets("DATA")
    n = 3 'n - nuber of experiments
    For i = 1 To n
        For j = 1 To 100
            .Cells(j, 1) = Rnd()
        Next j
        Application.Calculate
        .Cells(1, 2).Resize(100, 1).Copy
        Sheets("RESULT").Cells(1, i).PasteSpecial xlPasteValues 'сменил j на i
    Next i  'конец цикла тут!
End With
Application.Calculation = xlCalculationAutomatic
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 20.02.2012 в 23:37.
Казанский вне форума Ответить с цитированием
Старый 20.02.2012, 23:37   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

На самом деле, цикл по j не нужен, достаточно в A1:A100 записать формулу =СЛЧИС(), она будет обновляться при пересчете:
Код:
Sub SaveValues()
Application.Calculation = xlCalculationManual
With Sheets("DATA")
    n = 3 'n - nuber of experiments
    For i = 1 To n
        Application.Calculate
        .Cells(1, 2).Resize(100, 1).Copy
        Sheets("RESULT").Cells(1, i).PasteSpecial xlPasteValues 'сменил j на i
    Next i  'конец цикла тут!
End With
Application.Calculation = xlCalculationAutomatic
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перезапуск интернета sashaxD Работа с сетью в Delphi 0 24.09.2011 18:04
Перезапуск программы Михаил Юрьевич Общие вопросы Delphi 25 18.07.2011 10:29
Перезапуск программы Михаил Юрьевич Общие вопросы Delphi 3 07.01.2011 23:52
Перезапуск потока RNT Общие вопросы C/C++ 3 14.08.2009 14:54