Vba excel обновить формулы в excel

I have a problem in refreshing the cell’s calculation.

In other words, I have many columns where i have a formula or macro in each one of them.

But the problem is that i should absolutely activate the option » automatic calculation» in the excel options or i should save then the new results appear.

Now, I would insert something in the macro that can refresh me the results instantaneously.

Thanks

R3uK's user avatar

R3uK

14.4k7 gold badges43 silver badges77 bronze badges

asked Aug 12, 2015 at 7:58

Souma's user avatar

1

You could simply press :

F9 to calculate the whole active workbook

Shift + F9 to calculate the active sheet


Anyway, here are the different options with .Calculate :

Sub Souma()

'Use this to calculate all the open workbooks
Application.Calculate

'Use this to calculate the whole sheet, called "Sheet1"
ThisWorkbook.Worksheets("Sheet1").Calculate


'Use this to calculate the cell A1 on the sheet called "Sheet1"
ThisWorkbook.Worksheets("Sheet1").Range("A1").Calculate
'Use this to calculate the range A1 to D10 on the sheet called "Sheet1"
ThisWorkbook.Worksheets("Sheet1").Range("A1:D10").Calculate
'Use this to calculate the column A on the sheet called "Sheet1"
ThisWorkbook.Worksheets("Sheet1").Columns(1).Calculate
'Use this to calculate the row 1 on the sheet called "Sheet1"
ThisWorkbook.Worksheets("Sheet1").Rows(1).Calculate

End Sub

answered Aug 12, 2015 at 8:20

R3uK's user avatar

R3uKR3uK

14.4k7 gold badges43 silver badges77 bronze badges

4

Copy and paste the code below to your VBA project:

Private Sub Workbook_Open()
Application.Calculation = xlCalculationAutomatic
End Sub

This code should automatically run after you open the Excel file, enabling automatic calculation in all opened files.

answered Aug 17, 2015 at 20:01

Paulo's user avatar

PauloPaulo

1001 silver badge12 bronze badges

 

Иван Фильченков

Пользователь

Сообщений: 208
Регистрация: 27.12.2012

#1

23.07.2016 10:39:24

Доброго всем времени суток.
Прошу помощи в решение проблемки.
Есть макрос, он подставляет значение и выводит на печать определенные листы, выполняет это в цикличности.
Т.е. вставил значение — отправил на печать, следущее вставил — отправил на печать.
Но файл большой и он не успевает обновить все формулы (пересчитать)
Как прописать в макросе после подстановки значения пересчет формул?
Макрос прилагаю

Код
Sub АОСР()

    Dim c As Range, el
    Application.ScreenUpdating = False
    With Sheets("ФормаСети")
        For Each c In .Range(.Range("F57"), .[F57].End(xlDown)).Cells
            Sheets("ФОРМА").Range("DF123") = c.Value
            Sheets(Array("1ГидИз1", "2Гео", "3ГидИз2", "3ГидИз2", "4Тран", "5РазрТрКол", "6ПеОснКол", "7ПеОснКан", "8МонтТруб", "9БетЗам", "10ОбЗасПеТр", "11БетЛот", "12ШтукКол", "13МонтКол", "14ОбрЗасПеКол", "15МонГол", "16ОбрЗасГрТр", "17ОбрЗасГрКол")).Select
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
                ThisWorkbook.Path & Application.PathSeparator & c.Value & ".pdf", Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
        Next
    End With
    Application.ScreenUpdating = True
End Sub
 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#2

23.07.2016 10:51:22

Если стоит автомат. пересчёт, то перед печатью добавьте строку:

Код
doevents

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Извините я полный профан в макросах, это перед какой строчкой?

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

Попробуйте между 7 и 8 строками.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 
 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#7

23.07.2016 11:16:27

Если формулы только на листе «ФОРМА»:

Скрытый текст

Если формулы на листе «ФОРМА» и на тех листах, которые Вы выделяете:

Скрытый текст

P.S. Я из цикла убрал выделение листов, чтобы каждый раз листы не выделялись, т.к. достаточно выделить один раз.
Коды не тестировал, поэтому возможны опечатки или ошибки.

 

спасибо, сейчас попробую
не не изменяет, не пересчитывает (((

Изменено: Иван Фильченков23.07.2016 11:33:58

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#9

23.07.2016 11:45:45

Пересчет на всех листах активной книги и на всех листах всех других открытых книг:

Код
Sub АОСР()
    Dim c As Range, el
    Application.ScreenUpdating = False
    Sheets(Array("1ГидИз1", "2Гео", "3ГидИз2", "3ГидИз2", "4Тран", "5РазрТрКол", "6ПеОснКол", "7ПеОснКан", "8МонтТруб", "9БетЗам", "10ОбЗасПеТр", "11БетЛот", "12ШтукКол", "13МонтКол", "14ОбрЗасПеКол", "15МонГол", "16ОбрЗасГрТр", "17ОбрЗасГрКол")).Select
    With Sheets("ФормаСети")
        For Each c In .Range(.Range("F57"), .[F57].End(xlDown)).Cells
            Sheets("ФОРМА").Range("DF123") = c.Value
            Application.Calculate
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
                ThisWorkbook.Path & Application.PathSeparator & c.Value & ".pdf", Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
        Next
    End With
    Application.ScreenUpdating = True
End Sub
 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

Попробуйте после пересчёта добавить рекомендуемую мной ранее команду.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

не пересчитывает, пересчитывает только после первой подстановке (((

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

Иван Фильченков, сделайте файл-пример и приложите к теме, чтобы не гадать больше. И озвучьте что у Вас за офис (год, разрядность) и ОС.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#13

23.07.2016 12:11:46

Может быть убрать ScreenUpdating. В этом коде нет обновления формул (то есть это Ваш первоначальный код, только я вынес из цикла выделение листов):

Код
Sub АОСР()
    Dim c As Range, el
    Sheets(Array("1ГидИз1", "2Гео", "3ГидИз2", "3ГидИз2", "4Тран", "5РазрТрКол", "6ПеОснКол", "7ПеОснКан", "8МонтТруб", "9БетЗам", "10ОбЗасПеТр", "11БетЛот", "12ШтукКол", "13МонтКол", "14ОбрЗасПеКол", "15МонГол", "16ОбрЗасГрТр", "17ОбрЗасГрКол")).Select
    With Sheets("ФормаСети")
        For Each c In .Range(.Range("F57"), .[F57].End(xlDown)).Cells
            Sheets("ФОРМА").Range("DF123") = c.Value
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
                ThisWorkbook.Path & Application.PathSeparator & c.Value & ".pdf", Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
        Next
    End With
End Sub

Изменено: Karataev23.07.2016 12:13:02

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Иван Фильченков, Calculate пробовали?

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

Юрий М, да я предлагал Calculate в постах 7 и 9.

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#16

23.07.2016 12:15:16

Цитата
Иван Фильченков написал:
пересчитывает только после первой подстановке (((

а в каком коде пересчитывает? В Вашем исходном или в том, который я предложил? Или при использовании DoEvents?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#17

23.07.2016 12:19:56

Цитата
Karataev написал:
Юрий М, да я предлагал Calculate в постах 7 и 9

Я вижу, но мой вопрос автору темы )

 

Раньше был мой исходный код и он пересчитывался. Сейчас файл большой 20 метров и много связей как и листов и он перестал все пересчитывать.
Офис 13

 

Да делал, пересчета после подстановки нет (

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

Иван Фильченков, а код из поста 13 пробовали? Только у Вас должен быть включен автоматический пересчет формул: вкладка «Формулы» — Параметры вычислений — Автоматически.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#21

23.07.2016 12:35:21

Цитата
Karataev написал: у Вас должен быть включен автоматический пересчет формул

Думаю, что автор проверил это первым делом.

 

Я конечно чайник, но действительно сразу проверил

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

Иван Фильченков, ну так что, Вы тестировали код из поста 13?

 

Попробовал, результат тот же, не пересчитывает ((

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#25

23.07.2016 14:30:42

Может быть какие-нибудь косвенные действия делать, чтобы обновились формулы. Попробуйте такой способ:

Скрытый текст

 

Попробовал, не обновляет.
Странно то что мой исходный файл раньше работал и все обновлялось. Что же может быть такое?? ((

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#27

23.07.2016 14:49:57

А так? Макрос сохраняет файл после каждого изменения ячейки «DF123»:

Скрытый текст

 

Извини за дурацкий вопрос, я в макросах совсем ни как, но он где должен быть записан, сейчас он у меня торчит в Module4. Это может как то сказаться на его работоспособности?
Последний тоже код не обновляет ((

Изменено: Иван Фильченков23.07.2016 15:20:04

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

Вставьте его туда, где у Вас был Ваш код.

 

Karataev

Пользователь

Сообщений: 2306
Регистрация: 23.10.2014

#30

23.07.2016 15:01:14

А вручную, когда Вы изменяете ячейку «DF123», формулы обновляются сейчас?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Dim excelNimi As String
Dim Massiv_price(100) As Single
Dim Massiv_type() As Variant
 
Private Sub CommandButton1_Click()
'сохранение типов устройств в массив
Massiv_type = ActiveSheet.Range(Cells(2, 1), Cells(100, 1)).Value
 
'сохранение цен на устройства в другой массив
For i = 2 To 100
    If ActiveSheet.Cells(i, 4).Value <> 0 Then
    Massiv_price(i) = ActiveSheet.Cells(i, 4).Value
    End If
Next
 
'поэтапное открытие файлов в папке и внесение в них изменений (уже и не помню кого благодарить за эту часть кода):
    Dim sFolder As String, sFiles As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & "*.xlsx")
    Do While sFiles <> ""
        Workbooks.Open sFolder & sFiles
Application.Volatile True
ThisWorkbook.ActiveSheet.Columns("J:K").Calculate
 
    'Столбец стоимость yhteensä-sarake:
    ActiveSheet.Cells(7, 10).Value = "yhteensä"
    'Столбец цена hinta-sarake:
    ActiveSheet.Cells(7, 9).Value = "á hinta"
   
 
'Поиск таких же типов и присвоение им цены:
For i = 8 To 100
    For j = 1 To 99
            If ActiveSheet.Cells(i, 5).Value = "" Then
            'выход из цикла поиска совпадений, если все типы в столбце перебраны:
            GoTo NextOsaluettelo
            End If
                'Если совпадение по типу найдено:
                If ActiveSheet.Cells(i, 5).Value = Massiv_type(j, 1) Then
                'вставить соответствующую типу цену, округлив ее до двух знаков после запятой:
                ActiveSheet.Cells(i, 9).Value = WorksheetFunction.Round(Massiv_price(j + 1), 2)
                'поменять типы ячеек в столбцах количесвто (No. of units), цена (á hinta) и стоимость (yhteensä):
                ActiveSheet.Cells(i, 10).NumberFormat = "General"
                ActiveSheet.Cells(i, 9).NumberFormat = "General"
                ActiveSheet.Cells(i, 8).NumberFormat = "General"
                'посчитать стоимость:
                ActiveSheet.Cells(i, 10).Value = "=H" & i & "*I" & i
                End If
    Next
Next
 
NextOsaluettelo:
ActiveSheet.Cells(i + 1, 8).Value = "Kilvet"
ActiveSheet.Cells(i, 10).NumberFormat = "General"
ActiveSheet.Cells(i + 1, 10).NumberFormat = "General"
ActiveSheet.Cells(i + 1, 10).Value = "5"
 
'расчет суммы стоимости всего изделия:
ActiveSheet.Cells(i + 3, 8).Value = "Materiaalit yht."
ActiveSheet.Cells(i + 3, 10).Select
ActiveSheet.Cells(i + 3, 10).NumberFormat = "General"
ActiveSheet.Cells(i + 3, 10) = "=SUMMA(J8:J" & i + 1 & ")"  'ЗДЕСЬ ЭТА НЕОБНОВЛЯЮЩАЯСЯ ФОРМУЛА!
ActiveSheet.Cells(i + 3, 10).Calculate
ActiveSheet.Cells(i + 3, 10).NumberFormat = "#,##0.00 $"
 
Application.Calculation = xlCalculationManual
Application.Calculation = xlCalculationAutomatic
ActiveSheet.EnableCalculation = True
ThisWorkbook.ActiveSheet.Columns("J:K").Calculate
ActiveWorkbook.RefreshAll
 
       sFiles = Dir
    Loop
    Application.ScreenUpdating = True
End Sub

Пересчет отдельных формул в рабочей книге

Подробности
Создано 04 Февраль 2018
Содержание
Решение задачи
Константы:
Процедура пересчета диапазонов:

Типичная проблема при работе с большими или очень большими файлами Excel — это слишком сильное замедление при выполнении любых расчетов. Стандартной рекомендацией при этом является переключение Excel на ручной режим пересчета (ленат Формулы Параметры вычислений). Но зачастую рабочая книга построена таким образом, что хотелось бы видеть автоматическое обновление каких-то оперативных данных и сумм непосредственно при вводе. Нажимать все время F9, во-первых, неудобно, во-вторых, расчет каких-то итоговых таблиц вообще можно отложить на неопределенный срок — занимать время на их пересчет совсем не требуется. Иногда помогает пересчет не всей рабочей книги, а только активного листа — Shift+F9. Но и это не всегда удобно, и зависит от степени сложности связей между листами.

Кардинальным способом решения проблемы является пересчет итоговых таблиц по определенному событию, все остальное время там будут храниться только значения. Шаблон расчетных формул можно хранить в скрытом диапазоне. Т.е. рабочий файл можно оставить в автоматическом режиме расчетов для ввода каких-то данных. А для расчета итоговых таблиц необходимо будет вызывать макрос VBA. Очевидно, что для эффективности данного пересчитываемые таблицы должны иметь большое количество однотипных формул.

Решение задачи

Макрос делает следуеющее:

  1. Проходит по всем ячейкам столбца «Признак»
  2. Если «Признак»=1, то во все «Столбцы» таблицы вставлются формулы из строки «Формула»
  3. После заполнения всех формул пересчитывается рабочий лист
  4. После завершения расчета все вставленные формулы заменяются на значения
  5. Во вложении пример решения подобной задачи.

Пример реализации макроса на VBA во вложении к статье.

Константы:

Для простоты в примере все ссылки на столбцы и строки заданы через константы — см.проект VBA. В реальном проекте лучше заменить константы на переменные, ссылающиеся на именованные диапазоны рабочей книги.

Const colBegFormula As Long = 2
Const colEndFormula As Long = 9
Const colFlag As Long = 11
Const rowBegData As Long = 5
Const rowEndData As Long = 18
Const rowFormulas As Long = 19

Процедура пересчета диапазонов:

Private Sub RecalcFormulas(rngData As Excel.Range, rngFlags As Excel.Range, rngFormulas As Excel.Range)
    Dim calcMode As Excel.XlCalculation
    Dim wsh As Excel.Worksheet
    Dim rngRowData As Excel.Range
    Dim idx As Long, curRow As Long
    
On Error GoTo Err_
    calcMode = SaveCalcMode()
    Set wsh = rngData.Worksheet
    
    ' fill formulas
    For idx = 1 To rngData.Rows.Count
        curRow = rngData.Rows(idx).Row
        If (rngFlags.Cells(idx) = 1) Then
            Set rngRowData = wsh.Range(wsh.Cells(curRow, rngFormulas.Columns(1).Column), _
                        wsh.Cells(curRow, rngFormulas.Columns(rngFormulas.Columns.Count).Column))
            rngFormulas.Copy
            rngRowData.PasteSpecial xlPasteFormulas
        End If
    Next
    
    wsh.Calculate 'Application.Calculate
    
    ' fill values
    For idx = 1 To rngData.Rows.Count
        curRow = rngData.Rows(idx).Row
        If (rngFlags.Cells(idx) = 1) Then
            Set rngRowData = wsh.Range(wsh.Cells(curRow, rngFormulas.Columns(1).Column), _
                        wsh.Cells(curRow, rngFormulas.Columns(rngFormulas.Columns.Count).Column))
            rngRowData.Copy
            rngRowData.PasteSpecial xlPasteValues
        End If
    Next
    
    RestoreCalcMode calcMode
    Exit Sub
Err_:
    MsgBox Err.Description
    RestoreCalcMode calcMode
End Sub

Для сложных файлов лучше пересчитывать не только активный лист (см.строку wsh.Calculate), а все открытые рабочие книги — замените строку на Application.Calculate

Процедуры SaveCalcMode и RestoreCalcMode необходимы для корректного возврата текущего режима расчета Excel (автоматический или ручной). Туда же можно добавить скрытие визуализации выполнения макроса через задание параметра Application.ScreenUpdating = False (скрывает обновление экрана) и Application.ScreenUpdating = True (восстанавливает обновление экрана).

Смотри также

» Класс сохранения настроек Excel

В данной статье описывается небольшой, но очень удобный класс для сохранения и автоматического восстановления таких параметров…

» Основные принципы оптимизации работы в электронных таблицах

Знание специальных приемов работы в электронных таблицах Excel позволяет в разы сократить время разработки моделей, повысить…

» Надстройки Excel

Те, кто программирует на VBA для Excel, в определенный момент задумываются над распространением своих приложений в качестве независимых…

» Автоматизация в Excel

Создание программного кода для автоматизации определенных процедур открывает практически безграничные возможности по развитию и…

» Доступ к данным Excel через ADO

Данный пример демонстрирует работу с файлами Excel через интерфейс доступа к данным ADO (ActiveX Data Objects). Объекты ADO входят в состав Windows,…

Пересчет формулы в конкретной ячейке

ASWP

Дата: Суббота, 16.02.2019, 18:18 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 183


Репутация:

24

±

Замечаний:
0% ±


Excel 2007

Не обновляется автоматически формула, как это сделать при помощи vba?

Код

=СУММПРОИЗВ((C13=Таблица2[Дата])*(E13<Таблица2[Время конец])*(G13>Таблица2[Время начала]))

Тем более, что нужно уточнение — пересчитать одну формулу, несколько, весь лист, все открытые файлы Excel?
И зачем перед копированием пересчитывать?

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


я знаю что ничего не знаю, но другие не знают и этого

Сообщение отредактировал ASWPСуббота, 16.02.2019, 18:22

 

Ответить

_Boroda_

Дата: Суббота, 16.02.2019, 18:45 |
Сообщение № 2

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Странно. При каких «определенных» условиях?
Попробуйте так
[vba]

Код

range(«A1»).FormulaLocal=range(«A1»).FormulaLocal

[/vba]
Или так
[vba][/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

ASWP

Дата: Суббота, 16.02.2019, 18:57 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 183


Репутация:

24

±

Замечаний:
0% ±


Excel 2007

При каких «определенных» условиях?

При «одновременном» добавлении данных в таблицу. Спасибо, первый вариант подошел, вроде бы работает.


я знаю что ничего не знаю, но другие не знают и этого

Сообщение отредактировал ASWPСуббота, 16.02.2019, 18:57

 

Ответить

Like this post? Please share to your friends:
  • Vba excel обновить форму
  • Vba excel обновить все сводные таблицы
  • Vba excel обновить все данные
  • Vba excel область ячеек
  • Vba excel нумерация строк кода