Excel - фоновое выполнение

Alena727

Есть код на VBA, который подставляет значение в ячейку листа, пересчитывает другой лист с зависимыми данными и делает дальше много всего разного. Что-то типа:
Worksheets("Sheets1").Range("I").Value = textboxI.value
Worksheets("Sheets2").Calculate
Worksheets("Sheets3").Range("J").Value =Worksheets("Sheets2").Range("K").Value

Возникла такая проблема, что иногда код идет дальше не успевая пересчитать лист.
То есть на лист Sheets3 попадает старое значение ячейки К, что меня естественно совершенно не устраивает. Что делать?
Я пробовал следующие извраты:
1) Засунуть пересчет листа в отдельный макрос
2) Сделать Application.Wait
Не помогло.
На одном из форумов прочитал магическую фразу "Нужно было фоновое обновление запроса для листа таблицы отключить". Но как это сделать не нашёл.
Кто-нибудь сталкивался с таким?

saveliev_a

Мб,
Application.ScreenUpdating = False

Anna74

т.е. пересчёт листа и выполнение кода VBA идут параллельно - безотносительно к настройкам Excel и VBA самый кондовый способ засунуть на лист какой-нибудь флаг и проверять его значение в VBA в цикле, в надежде, что обновив флаг во время Calculate он обновил до этого нужную тебе ячейку, но для этого надо знать в каком порядке лист персчитывается

Anna74

наконец-то добрался до Excel
в VBA во View - Object Browser глянь справку на Application.CalculationState

Alena727

Спасибо, помогло!
Если что, делал так:


Worksheets("Sheets1").Range("I").Value = textboxI.value
' Эта строчка не нужна Worksheets("Sheets2").Calculate
Application.Calculate
While (Aplication.CalculationState <> xlDone)
Wend
Worksheets("Sheets3").Range("J").Value =Worksheets("Sheets2").Range("K").Value

Сперва пробовал пересчитывать только один лист, затем - два, но эксель все время торчал в состоянии xlPending. В итоге грубо и долго, но зато наверняка :D

Mixaz

по моему сыграло то, что вместо:
Worksheets("Sheets2").Calculate
написал:
Application.Calculate
Оставить комментарий
Имя или ник:
Комментарий: