Как сделать автоматический пересчет ячеек в Excel

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
sol2
Сообщения: 3
Зарегистрирован: 15 янв 2006, 22:49
Контактная информация:

Братья, помогите плиззз!!!

Насколько я понимаю, если в EXCEL в Параметрах стоит автоматический пересчет, то при изменении какой-либо ячейки пересчитываются ВСЕ ячейки ВСЕЙ Книги, а не только те ячейки, для вычисления которых требуется значение ИЗМЕНЕННОЙ.

В моем конкретном случае в Книге много Листов и на каждом Листе вычисляются Функции, которые требуют данные только их Листа.

Можно ли как-нибудь настроить EXCEL, чтобы он автоматом пересчитывал только те ячейки, которые действительно НУЖНО пересчитать или хотя бы пересчитывал только один Лист, а не всю Книгу???

Спасибо

:roll:
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Попробую предложить вариант, вроде работает...

За перерасчет каждого листа отвечает свойство:
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
2. Создаем 3 кнопки на листе и привязываем макросы (эти кнопки теперь можно копировать на другие листы)

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
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Или просто разнесите листы по разным файлам .xls, если это возможно
sol2
Сообщения: 3
Зарегистрирован: 15 янв 2006, 22:49
Контактная информация:

Спасибо за варианты решений, но они не совсем то чего бы хотелось

Листов более 50

А вариант с кнопками в принципе аналогичен более простому:
1) отключаем автоматический пересчет
2) если нужно пересчитать только Лист - нажимаем shift+f9, если книгу - f9

однако это не удобно (особенно когда ячейки автоматически обновляются извне)

способов же заставить excel пересчитывать автоматом только лист на котором произошло изменение ячейки видимо не существует

очень жаль

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

спасиббо
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Ну вроде получается два варианта:
1. Использовать автоматический пересчет и проставлять признаки .EnableCalculation = True/False для каждого листа
или...
2. Использовать ручной пересчет и принудительно запускать вычисление Shift+F9 для определенного листа.
способов же заставить excel пересчитывать автоматом только лист на котором произошло изменение ячейки видимо не существует
Может событие изменения листа для этого подойдет -
Private Sub Worksheet_Change(ByVal Target As Range)

прикладываю файл, который получился, пока разбирался
http://avsha.narod.ru/Calc_Excel.rar
sol2
Сообщения: 3
Зарегистрирован: 15 янв 2006, 22:49
Контактная информация:

!!! а вот с Sub Worksheet_Change АБАЛАДЕННАЯ ИДЕЯ!!!

1) выключаем автоматический пересчет
2) в каждый Лист вставляем:

Код: Выделить всё

Private Sub Worksheet_Change(ByVal Target As Range)

Target.Worksheet.Calculate

End Sub

теперь все работает:
если меняешь данные на Листе, то происходит ТОЛЬКО его пересчет!!!!!!!!!!!!!!!!!!


завтра буду испытывать в боевых условиях

СПАСИББО!!!

:lol:
Ответить