Братья, помогите плиззз!!!
Насколько я понимаю, если в EXCEL в Параметрах стоит автоматический пересчет, то при изменении какой-либо ячейки пересчитываются ВСЕ ячейки ВСЕЙ Книги, а не только те ячейки, для вычисления которых требуется значение ИЗМЕНЕННОЙ.
В моем конкретном случае в Книге много Листов и на каждом Листе вычисляются Функции, которые требуют данные только их Листа.
Можно ли как-нибудь настроить EXCEL, чтобы он автоматом пересчитывал только те ячейки, которые действительно НУЖНО пересчитать или хотя бы пересчитывал только один Лист, а не всю Книгу???
Спасибо
:roll:
Как сделать автоматический пересчет ячеек в Excel
Модератор: Naeel Maqsudov
Попробую предложить вариант, вроде работает...
За перерасчет каждого листа отвечает свойство:
ActiveSheet.EnableCalculation = True/False
Его и будем менять, но лучше не лазить в VBA каждый раз, а создать командную строку из кнопок непосредственно на каждом листе (или создать на одном, а на другие скопровать).
1. В редакторе VBA создаем модуль Module1 с кодом для трех кнопок:
2. Создаем 3 кнопки на листе и привязываем макросы (эти кнопки теперь можно копировать на другие листы)
3. В ячейке A1 будет выводиться состояния свойства ActiveSheet.EnableCalculation
Почему-то при запуске рабочей книги свойства .EnableCalculation для всех листов по-любому устанавливаются в True, попробуем это исправить.
4. В модуль "Эта книга" в VBA пишем код на открытие книги.
За перерасчет каждого листа отвечает свойство:
ActiveSheet.EnableCalculation = True/False
Его и будем менять, но лучше не лазить в VBA каждый раз, а создать командную строку из кнопок непосредственно на каждом листе (или создать на одном, а на другие скопровать).
1. В редакторе VBA создаем модуль Module1 с кодом для трех кнопок:
Код: Выделить всё
Sub Кнопка_CalcucationTrue()
ActiveSheet.EnableCalculation = True
ActiveSheet.Cells(1, 1).Value = "Вычисление..."
ActiveSheet.Cells(1, 1).Font.ColorIndex = 5
End Sub
Sub Кнопка_CalcucationFalse()
ActiveSheet.EnableCalculation = False
ActiveSheet.Cells(1, 1).Value = "Стоп"
ActiveSheet.Cells(1, 1).Font.ColorIndex = 3
End Sub
Sub Кнопка_CalcucationStatus()
'MsgBox "Вычисление текущего листа: " + Str(Application.ActiveSheet.EnableCalculation)
If Application.ActiveSheet.EnableCalculation = True Then
ActiveSheet.Cells(1, 1).Value = "Вычисление..."
ActiveSheet.Cells(1, 1).Font.ColorIndex = 5
Else
ActiveSheet.Cells(1, 1).Value = "Стоп"
ActiveSheet.Cells(1, 1).Font.ColorIndex = 3
End If
End Sub
3. В ячейке A1 будет выводиться состояния свойства ActiveSheet.EnableCalculation
Почему-то при запуске рабочей книги свойства .EnableCalculation для всех листов по-любому устанавливаются в True, попробуем это исправить.
4. В модуль "Эта книга" в VBA пишем код на открытие книги.
Код: Выделить всё
Private Sub Workbook_Open()
On Error GoTo err
Dim iWSheet As Worksheet
For Each iWSheet In Application.ActiveWorkbook.Worksheets
If iWSheet.Cells(1, 1).Value = "Стоп" Then iWSheet.EnableCalculation = False _
Else iWSheet.EnableCalculation = True
Next
Exit Sub
err:
End Sub
Или просто разнесите листы по разным файлам .xls, если это возможно
Спасибо за варианты решений, но они не совсем то чего бы хотелось
Листов более 50
А вариант с кнопками в принципе аналогичен более простому:
1) отключаем автоматический пересчет
2) если нужно пересчитать только Лист - нажимаем shift+f9, если книгу - f9
однако это не удобно (особенно когда ячейки автоматически обновляются извне)
способов же заставить excel пересчитывать автоматом только лист на котором произошло изменение ячейки видимо не существует
очень жаль
глупость со стороны микрософт делать программу электронной таблицы не содержащей внутри базы данных, связывающей заполненные ячейки с ячейками требующими пересчета в случае изменения таковых
спасиббо
Листов более 50
А вариант с кнопками в принципе аналогичен более простому:
1) отключаем автоматический пересчет
2) если нужно пересчитать только Лист - нажимаем shift+f9, если книгу - f9
однако это не удобно (особенно когда ячейки автоматически обновляются извне)
способов же заставить excel пересчитывать автоматом только лист на котором произошло изменение ячейки видимо не существует
очень жаль
глупость со стороны микрософт делать программу электронной таблицы не содержащей внутри базы данных, связывающей заполненные ячейки с ячейками требующими пересчета в случае изменения таковых
спасиббо
Ну вроде получается два варианта:
1. Использовать автоматический пересчет и проставлять признаки .EnableCalculation = True/False для каждого листа
или...
2. Использовать ручной пересчет и принудительно запускать вычисление Shift+F9 для определенного листа.
Private Sub Worksheet_Change(ByVal Target As Range)
прикладываю файл, который получился, пока разбирался
http://avsha.narod.ru/Calc_Excel.rar
1. Использовать автоматический пересчет и проставлять признаки .EnableCalculation = True/False для каждого листа
или...
2. Использовать ручной пересчет и принудительно запускать вычисление Shift+F9 для определенного листа.
Может событие изменения листа для этого подойдет -способов же заставить excel пересчитывать автоматом только лист на котором произошло изменение ячейки видимо не существует
Private Sub Worksheet_Change(ByVal Target As Range)
прикладываю файл, который получился, пока разбирался
http://avsha.narod.ru/Calc_Excel.rar
!!! а вот с Sub Worksheet_Change АБАЛАДЕННАЯ ИДЕЯ!!!
1) выключаем автоматический пересчет
2) в каждый Лист вставляем:
теперь все работает:
если меняешь данные на Листе, то происходит ТОЛЬКО его пересчет!!!!!!!!!!!!!!!!!!
завтра буду испытывать в боевых условиях
СПАСИББО!!!
:lol:
1) выключаем автоматический пересчет
2) в каждый Лист вставляем:
Код: Выделить всё
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Worksheet.Calculate
End Sub
теперь все работает:
если меняешь данные на Листе, то происходит ТОЛЬКО его пересчет!!!!!!!!!!!!!!!!!!
завтра буду испытывать в боевых условиях
СПАСИББО!!!
:lol: