Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Реакция на изменение ячеек формулой - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Реакция на изменение ячеек формулой
osnix11 Дата: Воскресенье, 10.12.2023, 01:46 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Доброго времени суток.
Подскажите - как макросом среагировать на изменение содержимого ячеек от формулы (без пересчета всего листа) ?

Вот этот код реагирует - только на изменения содержимого ячеек вручную.
[vba]
Код
Private Sub Worksheet_Change(ByVal target As Range)
     If Not Application.Intersect(Range("G7:M16"), target) Is Nothing Then
        MsgBox "Значение ячейки изменено."
    End If
End Sub
[/vba]
К сообщению приложен файл: 7657879789.xls (35.0 Kb)
 
Ответить
СообщениеДоброго времени суток.
Подскажите - как макросом среагировать на изменение содержимого ячеек от формулы (без пересчета всего листа) ?

Вот этот код реагирует - только на изменения содержимого ячеек вручную.
[vba]
Код
Private Sub Worksheet_Change(ByVal target As Range)
     If Not Application.Intersect(Range("G7:M16"), target) Is Nothing Then
        MsgBox "Значение ячейки изменено."
    End If
End Sub
[/vba]

Автор - osnix11
Дата добавления - 10.12.2023 в 01:46
Gustav Дата: Воскресенье, 10.12.2023, 02:44 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Подозреваю, что надо использовать событие Worksheet_Calculate. И, возможно, внутри него придется временно отключать срабатывание событий с помощью Application.EnableEvents = False - чтобы не попасть в зацикливание.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 10.12.2023, 02:50
 
Ответить
СообщениеПодозреваю, что надо использовать событие Worksheet_Calculate. И, возможно, внутри него придется временно отключать срабатывание событий с помощью Application.EnableEvents = False - чтобы не попасть в зацикливание.

Автор - Gustav
Дата добавления - 10.12.2023 в 02:44
osnix11 Дата: Воскресенье, 10.12.2023, 03:35 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Gustav, а как это сделать макросом - для моего файла ?
 
Ответить
СообщениеGustav, а как это сделать макросом - для моего файла ?

Автор - osnix11
Дата добавления - 10.12.2023 в 03:35
Gustav Дата: Воскресенье, 10.12.2023, 11:57 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
А много у вас таких ячеек, за которыми надо следить, что они (хотя бы одна из них) пересчитались? Событие Calculate не имеет параметра Target как у события Change. Поэтому для того, чтобы узнать об изменении значения какой-либо ячейки, нужно иметь значения этой ячейки ДО (старое) и ПОСЛЕ (новое) пересчета. Значение “после” - это текущее значение ячейки на момент текущего исполнения события Calculate. Значение “до” - это значение ячейки во время предыдущего исполнения события Calculate. Очевидно, что начальные (инициирующие) значения “до” надо будет зафиксировать при каком-то другом событии: например, при открытии книги или активации листа или ручной правке (Change). После очередного сравнения значений “до” и “после”, разумеется, значения “после” копируются в значения “до”, готовясь к следующему событию Calculate.

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


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеА много у вас таких ячеек, за которыми надо следить, что они (хотя бы одна из них) пересчитались? Событие Calculate не имеет параметра Target как у события Change. Поэтому для того, чтобы узнать об изменении значения какой-либо ячейки, нужно иметь значения этой ячейки ДО (старое) и ПОСЛЕ (новое) пересчета. Значение “после” - это текущее значение ячейки на момент текущего исполнения события Calculate. Значение “до” - это значение ячейки во время предыдущего исполнения события Calculate. Очевидно, что начальные (инициирующие) значения “до” надо будет зафиксировать при каком-то другом событии: например, при открытии книги или активации листа или ручной правке (Change). После очередного сравнения значений “до” и “после”, разумеется, значения “после” копируются в значения “до”, готовясь к следующему событию Calculate.

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

Автор - Gustav
Дата добавления - 10.12.2023 в 11:57
i691198 Дата: Воскресенье, 10.12.2023, 12:08 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 337
Репутация: 108 ±
Замечаний: 0% ±

Попробуйте такой вариант отслеживания изменений в диапазоне G7:M16. Контролируются изменения только формулами.
К сообщению приложен файл: change_rng.xlsm (19.2 Kb)
 
Ответить
СообщениеПопробуйте такой вариант отслеживания изменений в диапазоне G7:M16. Контролируются изменения только формулами.

Автор - i691198
Дата добавления - 10.12.2023 в 12:08
Gustav Дата: Воскресенье, 10.12.2023, 14:37 | Сообщение № 6
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
По мотивам кода i691198 для данного случая предложу свою версию процедуры ChangeRng:
[vba]
Код
Sub ChangeRng()
    Dim currArr, i, j, isDiffer As Boolean
    currArr = Worksheets("Лист").Range("$G$7:$M$16").Value
    
    For i = 1 To UBound(currArr, 1)
        For j = 1 To UBound(currArr, 2)
            isDiffer = currArr(i, j) <> KArr(i, j)
            If isDiffer Then Exit For
        Next j
        If isDiffer Then Exit For
    Next i
    
    If isDiffer Then
        MsgBox "Значение одной из ячеек изменено."
        KArr = currArr  'первоначально KArr инициируется в событии Workbook_Open
    End If
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 10.12.2023, 14:47
 
Ответить
СообщениеПо мотивам кода i691198 для данного случая предложу свою версию процедуры ChangeRng:
[vba]
Код
Sub ChangeRng()
    Dim currArr, i, j, isDiffer As Boolean
    currArr = Worksheets("Лист").Range("$G$7:$M$16").Value
    
    For i = 1 To UBound(currArr, 1)
        For j = 1 To UBound(currArr, 2)
            isDiffer = currArr(i, j) <> KArr(i, j)
            If isDiffer Then Exit For
        Next j
        If isDiffer Then Exit For
    Next i
    
    If isDiffer Then
        MsgBox "Значение одной из ячеек изменено."
        KArr = currArr  'первоначально KArr инициируется в событии Workbook_Open
    End If
End Sub
[/vba]

Автор - Gustav
Дата добавления - 10.12.2023 в 14:37
osnix11 Дата: Воскресенье, 10.12.2023, 23:09 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Спасибо за ответы
 
Ответить
СообщениеСпасибо за ответы

Автор - osnix11
Дата добавления - 10.12.2023 в 23:09
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!