Страницы: 1
RSS
Пересчет формул перед перевдением их в значения
 
Здравствуйте!

На одном из этапов рабочего процесса возник вопрос - Как заставить Excel автоматически переводить формулы в значения в файле с несколькими листами.
Решен он был довольно просто следующим макросом.
Код
Private Sub Workbook_Open()

    For Each ws In ActiveWorkbook.Worksheets
        ws.UsedRange.Value = ws.UsedRange.Value
    Next ws

End Sub

Однако в файле присутствует формула ВПР которая ссылается на несуществующие значения в третьем листе (они генерятся сервером) и получается что книга при скачивании имеет в себе столбец заполненный #Н/Д, при том что значения уже сгенерированы и вставлены сервером в нужный столбец. А потом "специально обученный человек" обновляет формулы и загружает файл дальше в систему.

Узнал на этом форуме что есть такое свойство Application.Calculation = xlAutomatic , однако никак не могу взять в толк как правильно его применить, так чтобы в скачанном файле с уже существующими значениями алгоритм сначала пересчитывал формулы, а уже потом менял их на значения.

Может быть подскажете как правильно применить автопересчет формул или придется писать аналог ВПР через макрос?

 
Код
Private Sub Workbook_Open()
Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        ws.Calculate
        ws.UsedRange.Value = ws.UsedRange.Value
    Next ws
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Sanja, Почему не просто Application.calculate перед циклом?
По вопросам из тем форума, личку не читаю.
 
БМВ,  простите, что вмешиваюсь, но исходя из моих скудных познаний - "Application.calculate" не начнет ли работать во всех открытых книгах? Тогда же наверное нужно еще и "ThisWorkbook"?
 
_Igor_61, Да вопрос скорее о том, что есть ли смысл последовательного пересчета листов.
По вопросам из тем форума, личку не читаю.
 
Sanja, большое спасибо! Помогло.

БМВ написал: ...есть ли смысл последовательного пересчета листов.[/QUOTE]
Могу сказать что есть смысл пересчета листов в не по порядку, а 2го,3го,1го (Есть такая необходимость в тех процессе), но в голову приходит только какая то ересь про массивы из обучалки микрософта (Sheets(Array("Sheet4", "Sheet5")).Move before:=Sheets(1)). Есть ли способ обратится непосредственно к какому либо листу отдельно?
 
Цитата
RobbyWhite написал: Есть ли способ обратится непосредственно к какому либо листу отдельно?
В чем проблема? Например
Код
Worksheets("Какой_либо_лист").Range("A1").Value = 100
Согласие есть продукт при полном непротивлении сторон
 
Цитата
RobbyWhite написал:
Могу сказать что есть смысл пересчета листов в не по порядку, а 2го,3го,1го (Есть такая необходимость в тех процессе),
- это на границе с бредом, точнее может быть применимо когда это помогает ускорить расчет за счет того что данные пересчитываются в той последовательности, которая предусматривается "конвейером".  Если нет итераций  или завязок на время, или рандом, то при операции простого преобразования результатов вычислений формул в значения , просто замена не приводящая к изменению результата. достаточно отключить событийность и вставлять текущие результаты спокойно.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх