Пересчет ячеек excel vba

is it possible to recalculate only a cell or a range in VBA ? What I like to use for a sheet is the following, but how to do it on a cell only ? Or range ?

'    ActiveSheet.EnableCalculation = False
'    ActiveSheet.EnableCalculation = True

ashleedawg's user avatar

ashleedawg

20k8 gold badges73 silver badges104 bronze badges

asked Dec 1, 2011 at 13:16

BuZz's user avatar

There is a calculate method you can call on ranges:

Range("A1").Calculate

Try it out by putting =Now() in A1 and running Calculate and watch it update the seconds :)
You can for a recalc of all the cells in a sheet by using:

Sheets(1).Calculate

See also: Microsoft MSDN, Excel Recalculation, 16 July 2012.

gerdami's user avatar

answered Dec 1, 2011 at 13:21

Gaijinhunter's user avatar

GaijinhunterGaijinhunter

14.5k4 gold badges50 silver badges57 bronze badges

2

Calculate: All open workbooks

Application.Calculate

Calculate: A specific worksheet

Worksheets(1).Calculate

or

Worksheets("sheetname").Calculate

Calculate: A specified row

Worksheets(1).Rows(2).Calculate

or

Worksheets("sheetname").Range("A1").EntireRow.Calculate

Recalculate in Excel

Select the cells you would like to recalculate and press:

Press F9

answered Apr 21, 2019 at 9:23

Unicco's user avatar

UniccoUnicco

2,3791 gold badge25 silver badges30 bronze badges

Try this:

Range("A1").Formula = Range("A1").Formula

or

Cells(1, 1).Formula = Cells(1, 1).Formula 

It works for me.

sɐunıɔןɐqɐp's user avatar

sɐunıɔןɐqɐp

3,17715 gold badges36 silver badges39 bronze badges

answered Jan 26, 2021 at 11:59

Pituś's user avatar

PituśPituś

11 bronze badge

0

 

Добрый день.  
Имеется код (Из раздела Приемы)  

  Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
       If Not Intersect(Target, Range(«A2:A100»)) Is Nothing Then  
           With Target(1, 2)  
               .Value = Now  
               .EntireColumn.AutoFit  
           End With  
       End If  
End Sub  

  При изменение ячейки A2:A100 в B2:B100 вносится дата изменения, а как быть, если ячейка ссылается на другую. Предположим A2=$C$3, A3=$C$3 и при изменение ячейки C3 измения не будут происходить.  
Спасибо

 

Hugo

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

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

Есть такая мысль — взять эти значения в публичный массив (при загрузке книги), и потом при изменении в диапазоне и связанных (precedents) ячейках сравнивать предыдущий и текущий массивы. По результату действовать, обновить предыдщий массив.

 

{quote}{login=Hugo}{date=08.06.2011 06:09}{thema=}{post}Есть такая мысль — взять эти значения в публичный массив (при загрузке книги), и потом при изменении в диапазоне и связанных (precedents) ячейках сравнивать предыдущий и текущий массивы. По результату действовать, обновить предыдщий массив.{/post}{/quote}  
А как будет в виде кода?  
Не силен в VBA (практически 0). Пытаюсь на примерах что-то соорудить (в частности на показанном выше)  
Спасибо

 

Hugo

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

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

Что-то вроде… Код в трёх местах :)

 
 

Немного не выходит, может я не так объяснил.  
Вся строчка ссылается на 1 число и при смени 1 числа надо чтобы был пересчет (вносило в той же строке напротив дату). Во вложение я показал как хочется чтобы было.  
Спасибо

 

Hugo

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

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

Да, не сумели творчески переработать месиджбокс…  

  Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
   Dim b, i&  
   If Not Intersect(Target, Range(«A2:A100»)) Is Nothing Or Not Intersect(Target, Range(«A2:A100»).Precedents) Is Nothing Then  
       b = Sheets(1).[a2:a100].Value
       For i = 1 To UBound(b)  
           If a(i, 1) <> b(i, 1) Then  
               With Cells(i + 1, 2)  
                   .Value = Now  
                   .EntireColumn.AutoFit  
               End With  
               End If  
           Next  
       a = b  
       End If  
End Sub  

  И ещё — этот код не отслеживает изменение формул, а только значения. Т.е. если вместо =C3 будет написано =C3+D3, но результат не изменится — то код не прореагирует.  
И зря Вы в примере все формулы забили на одну ячейку…

 

nerv

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

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

{quote}{login=Hugo}{date=08.06.2011 09:51}{thema=}{post}Да, не сумели творчески переработать месиджбокс…  

  Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
   Dim b, i&  
   If Not Intersect(Target, Range(«A2:A100»)) Is Nothing Or Not Intersect(Target, Range(«A2:A100»).Precedents) Is Nothing Then  
       b = Sheets(1).[a2:a100].Value
       For i = 1 To UBound(b)  
           If a(i, 1) <> b(i, 1) Then  
               With Cells(i + 1, 2)  
                   .Value = Now  
                   .EntireColumn.AutoFit  
               End With  
               End If  
           Next  
       a = b  
       End If  
End Sub  

  И ещё — этот код не отслеживает изменение формул, а только значения. Т.е. если вместо =C3 будет написано =C3+D3, но результат не изменится — то код не прореагирует.  
И зря Вы в примере все формулы забили на одну ячейку…{/post}{/quote}  

  люди добрыяяя) подскажите, переменная Variant в данном случае  

  b = Sheets(1).[a2:a100].Value

  может указывать только на значения? Или, к примеру, на цвет ячейки?

 

Юрий М

Модератор

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

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

На мой взгляд только значения. Но я не добрый.

 

nerv

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

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

{quote}{login=Юрий М}{date=08.06.2011 10:54}{thema=}{post}На мой взгляд только значения. Но я не добрый.{/post}{/quote}  

  Благодарю! Вы на себя наговариваете ; )  

  Да, Вы абсолютно правы. «Переменная Variant может принимать значения любого из простых типов». Объект к коим не относиться. А цвет — это свойство объекта…

 

Большое спасибо за помощь, но попытался приблизить данный пример к своей задачи, но так и не вышло.  
Необходимо сделать в VBA формулу C8:C13 и чтобы при изменении ячейки A3 (Соответственно для каждой строки меняется значение в строке D8:D13) делался пересчет C8:C13 в VBA.  
Надеюсь понятно объяснил.  

  Еще вопрос, возможно ли вместо b = Sheets(1).[D8:D13].Value вписать вместо [D8:D13] — Range(«название региона») и вместо Sheets(«Sheet1») ?
Еще вписал значение: Set rng1 = Range(«rng1») — это правильно?  

  Спасибо

 

Вот пиии … Ошибся темой. Как удалить? Извините.

 

Hugo

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

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

Разве ошиблись?  
Почти правильно:  

    Private Sub Worksheet_Change(ByVal Target As Range)  

     If Target.Cells.Count > 1 Then Exit Sub  
   Dim b, i&  

               If Not Intersect(Target, [rng1]) Is Nothing Or Not Intersect(Target, [rng1].Precedents) Is Nothing Then
       b = Sheets(1).[D8:D13].Value
       For i = 1 To UBound(b)  
           If a(i, 1) <> b(i, 1) Then  
               With Cells(i + 1, 2)  

                                     .Value = «?????»  

                                     End With  
               End If  
           Next  
       a = b  
       End If  
End Sub  

  Вот только я не понял, куда вопросы планировалось ставить?  
В строке Cells(i + 1, 2) значение i+2 нужно вписать относительно того, какой диапазон берётся в массивы. В первом примере брался с А2, поэтому было +1, тут вероятно нужно With Cells(i + 7, 5)

 

Hugo

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

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

Работает даже так, ещё короче код с именованным диапазоном:  

    Private Sub Workbook_Open()  
a = [rng1].Value
End Sub  

  Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
   Dim b, i&  

     If Not Intersect(Target, [rng1]) Is Nothing Or Not Intersect(Target, [rng1].Precedents) Is Nothing Then
       b = [rng1].Value
       For i = 1 To UBound(b)  
           If a(i, 1) <> b(i, 1) Then  
               With Cells(i + 7, 5)  

                     .Value = «?????»  

                 End With  
           End If  
       Next  
       a = b  
   End If  
End Sub

 

Вместо вопросов должна быть формула из ячейки C8 т.е. должно быть умножение ячеек «=B8*D8» в ячейки C8, в ячейки C9 — «=B9*D9» и это все должно меняться при изменение диапазона D9:D13.

 

А нельзя вместо Cells(i + 7, 5) сделать как было в первом примере через    
With Target(1, 2)  
     .Value = Now  
     .EntireColumn.AutoFit  
End With    
Не нравится, что необходимо отсчитывать количество ячеек, а если в будущем что-то поменяется, то будет необходимость опять пересчитывать. Или можно как-то привязвать к определенному региону?  
Спасибо

 

Hugo

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

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

Ну тут у Вас Targetом будут и [rng1].Precedents, так что к таргету привязываться нельзя.
Но эато в этом конкретном случае можно так:  

                 With [rng1].Offset(, 1)
                   .Value = «?????»  
               End With  

  Раз уж все вопросы одинаковы.  
А вот насчёт формул не понял — Вы хотите формулы менять, или занести?

 

Guest

Гость

#18

09.06.2011 01:27:12

буду завтра пробовать что предложили. на счет формул: мне их надо не вность, а просто сделать умножение. в примере я показал что на что надо умножить для каждой ячейки. предположим: range(«b8»)*range(«d9»). данное умножение надо сделать в коде VBA. естественно будет как-то по другому (через cells может-не силен пока что, надо почитать чего). соответственно вместо вопросительных знаков должно быть умножение ячеек. надеюсь так более понятно?

Как принудительно произвести пересчет значений в ячейках?

Юрий_Нд

Дата: Пятница, 15.06.2018, 18:24 |
Сообщение № 1

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

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

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


Excel 2013

Доброго дня всем.
На листе 4 ведется расчет в ячейке с помощью моей пользовательской ВБА-функции по данным на листе 2.
Проблема в том, что пересчет всех значений ячеек на листе 4 не производится ни с помощью клавиш Control F9, ни с помощью F9.
Пересчет можно произвести только если в ячейке полностью стереть значение, то есть мою пользовательскую функцию, а потом вставить в ячейку ту же самую функцию. Причём пересчёт производится исключительно в одной этой конкретной ячейке.
Ещё значение в ячейке можно обновить только если сделать «протяжку этой функции сверху».

Сообщение отредактировал Юрий_НдПятница, 15.06.2018, 18:28

 

Ответить

_Boroda_

Дата: Пятница, 15.06.2018, 18:29 |
Сообщение № 2

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

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

Сообщений: 16618


Репутация:

6465

±

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


2003; 2007; 2010; 2013 RUS

В код функции добавьте [vba][/vba]
А пересчет отдельных ячеек можно сделать так
[vba]

Код

Range(«A2:F15»).Calculate

[/vba]
* И почто файл с функцией не показываете?


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

 

Ответить

Юрий_Нд

Дата: Пятница, 15.06.2018, 19:57 |
Сообщение № 3

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

Ранг: Обитатель

Сообщений: 441


Репутация:

19

±

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


Excel 2013

* И почто файл с функцией не показываете?

Прошу прощения, но я думал, что для полного счастья не хватает самой малости. И эту малость Вы мне подсказали. Всё просто и гениально, или просто гениально.
Спасибо.

P. S. Не знаю можно ли на такой вопрос ответить однозначно, но всё-таки, может быть мне «этот Application.Volatile натыкать» везде, во все функции и процедуры?

 

Ответить

_Boroda_

Дата: Пятница, 15.06.2018, 20:01 |
Сообщение № 4

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

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

Сообщений: 16618


Репутация:

6465

±

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


2003; 2007; 2010; 2013 RUS

В процедуры — никакого влияния не окажет
В функции — если они используются на листе, то в зависимости от того, как нужно для них автообновление и насколько они ресурсоемки, если не на листе, а просто вспомогательная функция для какого-то макроса — то не нужно

https://msdn.microsoft.com/ru-ru….d-excel


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

 

Ответить

I am using all the solutions that appear in:

How to refresh ALL cell through VBA

Getting Excel to refresh data on sheet from within VBA

ActiveSheet.EnableCalculation = False  
ActiveSheet.EnableCalculation = True

or

Application.Calculate

or

Application.CalculateFull

None of them works in Excel 2010. When I go to the cell and right click refresh it works. How can I refresh within VBA?

Sheets("Name_of_sheet").Range("D424").Refresh raises an

exception 438

Questions:

  1. How can I make the script support Excel 2003, 2007, 2010?
  2. How can I choose the source file to refresh from using VBA?

EDIT:

  1. I want to simulate a right mouse click and choose refresh in the menu in worksheet 3. That is the entire story.

  2. I work on an Excel file created 10 years ago. When opening in Excel 2010, I can go to a cell and right click on it and choose refresh and then choose the .txt file to refresh from. I am trying to do it automatically within VBA.

Community's user avatar

asked Nov 22, 2012 at 13:39

0x90's user avatar

6

You could try using Application.Calculation

Application.Calculation = xlCalculationManual
Application.Calculation = xlCalculationAutomatic

answered Nov 22, 2012 at 13:42

Anirudh Ramanathan's user avatar

4

For an individual cell you can use:

Range("D13").Calculate

OR

Cells(13, "D").Calculate

0x90's user avatar

0x90

38.9k36 gold badges163 silver badges244 bronze badges

answered Nov 22, 2012 at 13:46

InContext's user avatar

InContextInContext

2,46112 silver badges24 bronze badges

1

I finally used mouse events and keystrokes to do it:

Sheets("worksheet34").Select
Range("D15").Select
Application.WindowState = xlMaximized
SetCursorPos 200, 600 'set mouse position at 200, 600
Call mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0) 'click left mouse
Application.SendKeys ("R")

answered Nov 29, 2012 at 5:52

0x90's user avatar

0x900x90

38.9k36 gold badges163 silver badges244 bronze badges

2

just a reminder;

be careful when using

Application.Calculation = xlCalculationManual
Application.Calculation = xlCalculationAutomatic

this sets the entire excel application to calculate formula’s either automatically or manually. If you use

Application.Calculation = xlCalculationManual

you’ll notice your automatic formulas no longer work.

cheers

answered Feb 16, 2016 at 17:53

LeeF's user avatar

You can force excel to recalculate a cell or range of cells by marking the cell/range as dirty.

Example :

' Recalculate Column D4 to D24
Sheets("Name_of_sheet").Range("D4:D24").Dirty

or

' Recalculate Cell D4<br>
Sheets("Name_of_sheet").Range("D4").Dirty<br>

Ike's user avatar

Ike

7,8904 gold badges11 silver badges29 bronze badges

answered Sep 5, 2021 at 11:16

XYZLOL's user avatar

Application.Calculate didn’t work for my function. Not even when followed by DoEvents.

What I found that works is to re-enter the formula in the cell.
A simple way to get the formula is to start recording a macro, use F2 to edit the cell, then press enter. The macro will make a great copy of the function text with all needed quotes.

Below is an example.

Sheets("Name_of_sheet").Range("D424").FormulaR1C1 = "=now()"

svyat1s's user avatar

svyat1s

8689 gold badges12 silver badges21 bronze badges

answered Mar 5, 2021 at 19:36

Scott's user avatar

Cells(x, y).Select
ActiveCell.FormulaR1C1 = Selection.Value

works perfectly for me

answered Aug 2, 2022 at 20:21

user19260138's user avatar

I have a long «macro» in a workbook > 20 MB, tens of thousands of lines, that calls a dll written in Fortran. None of these methods worked:

Call Application.Calculate
Call Application.CalculateFull
Call Application.CalculateFullRebuild
Re-entering the formula
Range.Dirty

Application.Calculation = xlCalculationManual
Application.Calculation = xlCalculationAutomatic

ThisWorkbook.ActiveSheet.EnableCalculation = False
ThisWorkbook.ActiveSheet.EnableCalculation = True

This worked:

On Error Resume Next
Application.SendKeys "{F2}{Enter}{NumLock}"  'SendKeys turns off NumLock for some reason
On Error GoTo 0

This even worked when a chart was selected.

answered Feb 9 at 14:47

Rocky Scott's user avatar

Rocky ScottRocky Scott

4364 silver badges13 bronze badges

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

Пересчитывать или обновлять только выбранные ячейки с помощью сочетания клавиш
Пересчитывать или обновлять только выбранные ячейки с кодом VBA


Пересчитывать или обновлять только выбранные ячейки с помощью сочетания клавиш

Предположим, что формулы находятся в диапазоне F2: F10, как показано на скриншоте ниже. После изменения значений в столбце D или E вам необходимо пересчитать ячейки формулы в столбце F, чтобы получить новые результаты. Пожалуйста, сделайте следующее.

1. После изменения значений опорных ячеек выберите ячейки формулы, которые необходимо пересчитать, затем нажмите кнопку F9 ключ. Затем вы можете увидеть, что результаты выбранных ячеек формулы обновляются сразу.

Внимание: После нажатия этой клавиши выреза все формулы на листе, которые меняют ссылочные ячейки, будут обновлены сразу.


Пересчитывать или обновлять только выбранные ячейки с кодом VBA

Кроме того, вы можете запустить следующий код VBA, чтобы пересчитать только выбранные ячейки в Excel.

1. Выберите ячейки формулы, которые необходимо пересчитать, затем нажмите другой + F11 клавиши одновременно, чтобы открыть Microsoft Visual Basic для приложений окно.

2. в Microsoft Visual Basic для приложений окна, нажмите Вставить > Модули. Затем скопируйте и вставьте приведенный ниже код VBA в окно модуля.

Код VBA: пересчитывать только выбранные ячейки в Excel

Public Sub RecalculateSelection()
    If TypeName(Selection) = "Range" Then Selection.Calculate
End Sub

3. нажмите F5 для запуска кода, то выбранные ячейки формулы немедленно пересчитываются.


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (1)


Оценок пока нет. Оцените первым!

Понравилась статья? Поделить с друзьями:
  • Пересечение с осью абсцисс в excel
  • Пересчет формулы excel автоматически
  • Пересчет формул на листе excel
  • Пересчет формул вручную в excel
  • Пересчет формул в excel что это