поставил напротив Симонова отметку "снят" данные из первой строки полностью исчезли
похоже, что у вас отключены макросы в параметрах безопасности, у меня на всех компах все пересчитывается и возвращаются правильные значения добавил комментарии в макрос, авось где-нить пригодится
[vba]
Код
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) With Application: .DisplayAlerts = 0: .Iteration = 0 'если нет итеративных формул, выйти из процедуры If Me.CircularReference Is Nothing Then .DisplayAlerts = 1: Exit Sub Else 'создаем словарь Dim dic: Set dic = CreateObject("scripting.dictionary") Dim cell As Range, rngRef As Range 'перебираем все ячейки с формулами For Each cell In Me.UsedRange.SpecialCells(xlCellTypeFormulas) 'если диапазон ячейки пересекается с диапазоном влияющих на нее ячеек If Not Intersect(cell.Precedents.Cells, cell) Is Nothing Then 'то добавляем в словарь (адрес диапазона влияющих ячеек) с ключем (адрес ячейки) dic(cell.Address) = cell.Precedents.Address 'и объединяем диапазон влияющих ячеек с диапазоном rngRef If rngRef Is Nothing Then Set rngRef = cell.Precedents _ Else Set rngRef = Union(rngRef, cell.Precedents) End If Next cell Dim rngAC As Range, rngSel As Range, strAddr 'записываем в переменные текущее выделение и активную ячейку Set rngSel = Selection: Set rngAC = ActiveCell 'измененные ячейки не входят в диапазон rngRef, то выйти из процедуры If Intersect(rngRef, Target) Is Nothing Then Exit Sub .ScreenUpdating = 0: .EnableEvents = 0: .Iteration = 1 'перебираем адреса ячеек (strAddr) в ключах словаря For Each strAddr In dic.keys .ScreenUpdating = 0: .EnableEvents = 0: 'если измененные ячейки входят в диапазон соответсвующего элемента словаря (Range(dic(strAddr)) If Not Intersect(Range(dic(strAddr)), Target) Is Nothing Then With Range(strAddr) 'то выделяем ячейку Range(strAddr) и перевводим в ней формулу .Select: .Replace "=", "=" 'пересчитываем ячейку, пока значение имени Check станет равным ИСТИНА Do: .Calculate: Loop Until [check] End With End If Next 'возвращаем выделение и активную ячейку из переменных rngSel.Select: rngAC.Activate lb: .ScreenUpdating = 1: .EnableEvents = 1: .DisplayAlerts = 1: End With 'очищаем переменные Set dic = Nothing Set cell = Nothing: Set rngRef = Nothing: Set rngAC = Nothing: Set rngSel = Nothing End Sub
поставил напротив Симонова отметку "снят" данные из первой строки полностью исчезли
похоже, что у вас отключены макросы в параметрах безопасности, у меня на всех компах все пересчитывается и возвращаются правильные значения добавил комментарии в макрос, авось где-нить пригодится
[vba]
Код
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) With Application: .DisplayAlerts = 0: .Iteration = 0 'если нет итеративных формул, выйти из процедуры If Me.CircularReference Is Nothing Then .DisplayAlerts = 1: Exit Sub Else 'создаем словарь Dim dic: Set dic = CreateObject("scripting.dictionary") Dim cell As Range, rngRef As Range 'перебираем все ячейки с формулами For Each cell In Me.UsedRange.SpecialCells(xlCellTypeFormulas) 'если диапазон ячейки пересекается с диапазоном влияющих на нее ячеек If Not Intersect(cell.Precedents.Cells, cell) Is Nothing Then 'то добавляем в словарь (адрес диапазона влияющих ячеек) с ключем (адрес ячейки) dic(cell.Address) = cell.Precedents.Address 'и объединяем диапазон влияющих ячеек с диапазоном rngRef If rngRef Is Nothing Then Set rngRef = cell.Precedents _ Else Set rngRef = Union(rngRef, cell.Precedents) End If Next cell Dim rngAC As Range, rngSel As Range, strAddr 'записываем в переменные текущее выделение и активную ячейку Set rngSel = Selection: Set rngAC = ActiveCell 'измененные ячейки не входят в диапазон rngRef, то выйти из процедуры If Intersect(rngRef, Target) Is Nothing Then Exit Sub .ScreenUpdating = 0: .EnableEvents = 0: .Iteration = 1 'перебираем адреса ячеек (strAddr) в ключах словаря For Each strAddr In dic.keys .ScreenUpdating = 0: .EnableEvents = 0: 'если измененные ячейки входят в диапазон соответсвующего элемента словаря (Range(dic(strAddr)) If Not Intersect(Range(dic(strAddr)), Target) Is Nothing Then With Range(strAddr) 'то выделяем ячейку Range(strAddr) и перевводим в ней формулу .Select: .Replace "=", "=" 'пересчитываем ячейку, пока значение имени Check станет равным ИСТИНА Do: .Calculate: Loop Until [check] End With End If Next 'возвращаем выделение и активную ячейку из переменных rngSel.Select: rngAC.Activate lb: .ScreenUpdating = 1: .EnableEvents = 1: .DisplayAlerts = 1: End With 'очищаем переменные Set dic = Nothing Set cell = Nothing: Set rngRef = Nothing: Set rngAC = Nothing: Set rngSel = Nothing End Sub
похоже, что у вас отключены макросы в параметрах безопасности
они у меня включены, но видимо сказывается моё неумение правильно обращаться с макросами. Сейчас открыл сохранённый ранее документ и всё стало работать, включая добавленную строку с новой фамилией. Спасибо еще и еще раз! [offtop]Пользуясь случаем. С Днём рождения, Андрей!!! Всех земных благ тебе и твоим близким! [/offtop]
похоже, что у вас отключены макросы в параметрах безопасности
они у меня включены, но видимо сказывается моё неумение правильно обращаться с макросами. Сейчас открыл сохранённый ранее документ и всё стало работать, включая добавленную строку с новой фамилией. Спасибо еще и еще раз! [offtop]Пользуясь случаем. С Днём рождения, Андрей!!! Всех земных благ тебе и твоим близким! [/offtop]VEKTORVSFREEMAN
"Опыт - это то, что получаешь, не получив того, что хотел"