Ну то что можно хранить копию на другом листе или в другом диапазон - это понятно, но задумался, где б еще и задействовал для этого Range.ID. Получилось не совсем просто , так как потребовался контроль типа данных, ведь в ID text. В оригинальной задаче был вопрос контроля именно при пересчете формул, поэтому событие Calculate и просмотр определенного диапазона, но это детали. Сперва запихнул это в проверку данных, и использовал .Validation.ErrorTitle, который без условия то и не влияет, но там была дополнительная обработка ошибки нужна, удалять , добавлять проверу, и тогда про ID вспомнил.
Получилось сляпать такое
Скрытый текст
Код
Private Sub Worksheet_Calculate()
Dim changed As Boolean
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
Randomize
On Error Resume Next
For Each cell In Range("A1:A1000").SpecialCells(xlCellTypeFormulas)
With cell
If .Value <> "" Then
Select Case True
Case Application.WorksheetFunction.IsNumber(.Cells)
changed = .Value <> CDbl(.ID)
Case Application.WorksheetFunction.IsLogical(.Cells)
changed = .Value <> (.ID = CStr(True))
Case Application.WorksheetFunction.IsText(.Cells)
changed = .Value <> .ID
End Select
If Err <> 0 Then
Err.Clear
changed = True
End If
If changed Then
.ID = cell.Value
.Offset(0, 1).Value = Int((55 - 25 + 1) * Rnd + 25)
End If
End If
End With
Next
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
в примере пересчитывается одна ячейка постоянно и меняется значение в соседней. Остальные только при смене значений, в данном случае формул.
В своей ветке HKCU он не только может читать, но и писать. Так что это не проблема. А вот то что там потом замусорено будет так что системе от этого не проще, это да.
У ID ещё есть огромный плюс - он не сохраняется при закрытии файла. Учитывая это, временные значения ячеек можно хранить сразу в глобальном массиве: что его, что ID надо инициализировать при открытии файла. Там и проблем с типом данных нет. Так что хранить предыдущие данные в Проверке тоже имеет свои плюсы.
Если любым сбоем считать закрытие самого Excel, то конечно, массиву - кирдык. Впрочем, ID тоже не выживут. Однако если глюк в файле, то его можно закрыть, не закрывая приложение, а пока жив Excel, будет жить и массив. Но пользоваться лучше ID. Причина: возможная недостоверность привязки к определённой ячейке. Если в массив в качестве ключа внести некую ссылку на ячейку, то она будет ошибочной при удалении/добавлении строк/столбцов. С ID такого не происходит. В качестве привязок можно использовать имена ячеек. Т.е. каждой нужной ячейки присваивать уникальное имя и обращаться к нему в массиве. Но тогда это само предыдущее значение можно хранить и в имени ячейки, т.е. каждый раз удаляя старое имя и добавляя новое. Когда-то давно я пытался такое проделывать для сохранения предыдущих значений. Даже более-менее удачно получалось, но правда, если таких ячеек ограниченное количество и там можно было придумать маску для имени, чтоб оно было уникальным. Понятно, что нужно было делать отдельную процедуру для работы с такими именами.
tolikt написал: а пока жив Excel, будет жить и массив.
да ладно. Возьмем например просто END и привет массиву. Тогда уж словарь нужно использовать, где ключ это как раз имя ячейки, а оно состоит из имени файла, листа и адреса, но он также обнулится Но потом отслеживать удаление ячеек и удалять из массива ...
tolikt написал: У ID ещё есть огромный плюс - он не сохраняется при закрытии файла.
Считаю что это огромный минус. Кроме имен и примечаний не отследить перемещение ячейки по листу (в результате добавления удаления строк, столбцов).А имена и примечания легко правятся пользователями, можно конечно скрыть, но этот костыль так себе.
Если нужно хранить дополнительную информацию о ячейках - отличный вариант. При необходимости постоянного хранения можно при каждом сохранении файла информацию о ячейках и их ID заносить куда-нибудь в документ, при открытии файла обратно раскидать по ячейкам.
bedvit написал: если будет открыто две или три сессии Excel
у SaveSetting (GetSetting) кроме ключа и значения есть еще 2 параметра (которые формально называются приложение и раздел) но при небольшом уровне фантазии можно решить что в них написать, чтобы не пересекались данные процессов что оставить в реестре при закрытии всех процессов, что оттуда читать при новом старте и т.д.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!