2015-04-27 3 views
2

Я запускаю макрос, который открывает файл, ссылающийся на тот, с которым я работаю, вставляет соответствующие элементы в виде значений в отдельный лист и выводит книгу из этого листа.Delay Macro Run, Excessive Countifs

Причина, по которой я делаю это, состоит в том, что существует несколько тысяч countif, averageifs и интенсивный процессор.

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

Я подозреваю, что правильный ход действий - отложить прогон до тех пор, пока лист не закончит вычисление. Любая помощь будет оценена по достоинству.

EDIT: Я пробовал всевозможные приложения. Калькуляции и ничего не работают. Обычно ссылки и элементы вычисляются, если я открываю их вручную и позволяю процессору выполнять свою работу. Единственными пунктами, которые вычисляются, являются те, которые содержат «COUNTA» где-то в нем. Возможно ли, что методы расчета приложений не работают с Countifs и т. П.?

+0

В качестве быстрого теста вы попытались отключить автокалькуляцию электронной таблицы в начале макроса и включить его в конце (или выключить его, прежде чем закрыть исходные данные)? 'Application.Calculation = xlCalculateManual'. Также попробуйте отключить обновление экрана - это может помочь. 'Application.ScreenUpdating = False' – BruceWayne

+0

Можете ли вы опубликовать свой код, чтобы мы могли точно видеть, что происходит. @ user3578951 предложение, вероятно, правильный ответ, но может потребоваться тонкая настройка на основе того, как вы это делаете. – Degustaf

+0

@ user3578951 - Поскольку я интерпретирую этот вопрос ... OP указал копии кода до того, как лист завершил вычисление, как бы отключение вычисления устранить проблему? – Davesexcel

ответ

0

Не должно быть так сложно - объект Worksheet имеет свойство Calculate, которое запускается после его вычисления. Вы можете добавить настраиваемое свойство на рабочий лист, который предоставляет флаг, который вы устанавливаете после его вычисления. В коде рабочего листа, который имеет расчет затрат времени ...

Option Explicit 
Private can_copy As Boolean 

Public Property Get CopyOK() 
    CopyOK = can_copy 
End Property 

Private Sub Worksheet_Calculate() 
    can_copy = True 
End Sub 

Private Sub Worksheet_Activate() 
    can_copy = False 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 
    can_copy = False 
End Sub 

'For volitile functions. 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    can_copy = False 
End Sub 

... и в вызывающем коде:

Dim book As Workbook 

Set book = Application.Workbooks.Open("C:\foobar.xlsm") 
Do While Not book.Worksheets("Sheet1").CopyOK 
    DoEvents 
Loop 

'Do your thing... 

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

+0

Это не сработало для меня. Я не знаю почему. Он попросил обновить ссылки (я пробовал «да» и «нет»), и теперь он дает мне ошибки значения на всем листе. – Archaimot

0

Итак, я нашел способ для этого работы:

Do Until Application.CalculationState = xlDone 
     Application.Calculate 
     While Application.CalculationState <> xlDone 
      MsgBox Application.CalculationState 
      DoEvents 
     Wend 
    Loop 

Это было решение, которое я вроде применяется с Сиддхарт Мамаевом: Wait until Application.Calculate has finished

Спасибо всем за помощь!