Страницы: 1
RSS
Дата последнего обновления в ячейке VBA
 
Здравствуйте, уважаемые форумчане!

Помогите, пожалуйста, подправить код чтобы он реагировал на изменение в ячейке через формулу. Сейчас код работает если данные в ячейке изменяю вручную, но если в ячейке данные меняются через формулу, начинает ругаться или просто не работает. Спасибо! Пример прилагается.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
'Update 20140722
Dim WorkRng As Range
Dim Rng As Range
Dim xOffsetColumn As Integer
Set WorkRng = Intersect(Application.ActiveSheet.Range("B:B"), Target)
xOffsetColumn = 1
If Not WorkRng Is Nothing Then
    Application.EnableEvents = False
    For Each Rng In WorkRng
        If Not VBA.IsEmpty(Rng.Value) Then
            Rng.Offset(0, xOffsetColumn).Value = Now
            Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
        Else
            Rng.Offset(0, xOffsetColumn).ClearContents
        End If
    Next
    Application.EnableEvents = True
End If
End Sub
 
Роман, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение.
По вопросу: попробуйте отслеживать изменение не в ячейке с формулой, а в той, на которую ссылается формула.
Или используйте событие Calculate, но тогда будет реакция при любом пересчёте листа.
===
P.S. Прикрепляя запароленный файл и не сообщив пароль, Вы проявляете неуважение к форумчанам.
 
А каков пароль?
 
ой блин.... прошу прощения... снял пароль...
 
Роман, реагировать на замечание собираетесь?
 
Не совсем понял как это ссылаться на ячейку не с формулой а на ту в которой меняю значение - код не работает тогда. По поводу Calculate - при любом пересчёте листа подойдет. Но не понимаю к сожалению где нужно изменить на Calculat?
 
Цитата
Юрий М написал:
код следует оформлять соответствующим тегом
Начните с этого.
 
Что сложного? Выделяем текст и жмём кнопку. Исправил.
По вопросу: Вы сейчас контролируете столбец В. Контролируйте А.
 
Доброе время суток.
Вариант
 
Я в VBA не силен, код нашел на просторах, если я данные в ячейке меняю то здесь
Код
Set WorkRng = Intersect(Application.ActiveSheet.Range("B:B"), Target)
xOffsetColumn = 1
можно изменить куда дата обновления вставится, в моем реальном файле я не могу сделать чтобы дата обновления становилась справа, а когда меняю на ячейку слева, код чудесным образом перестает работать. Только через формулу вижу выход, а на изменения в ячейке через формулу код не работает. Через Calculate попробовал, тоже не работает.
 
Это с вашей точки зрения, при пересчете происходят какие либо изменения в ячейке.
А на самом деле - какая формула была, такая и осталась, как возвращала она какой-то результат, так и возвращает.
И для того, чтобы отследить изменения, нужно где-то запомнить значения до пересчета, и сравнить со значением после пересчета.
 
Роман, не могу понять, зачем в Вашем варианте цикл перебора ячеек, если контролируете всего одну.
Изменил код только в части контролируемой ячейки и смещения - адреса ячейки с датой.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
'Update 20140722
Dim WorkRng As Range
Dim Rng As Range
Dim xOffsetColumn As Integer
Set WorkRng = Intersect(Application.ActiveSheet.Range("A1"), Target)
xOffsetColumn = 1
If Not WorkRng Is Nothing Then
    Application.EnableEvents = False
    For Each Rng In WorkRng
        If Not VBA.IsEmpty(Rng.Value) Then
            Rng.Offset(0, 2).Value = Now
            Rng.Offset(0, 2).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
        Else
            Rng.Offset(0, 2).ClearContents
        End If
    Next
    Application.EnableEvents = True
End If
End Sub

 
Цитата
Андрей VG написал:
Доброе время суток.Вариант
Андрей, спасибо, но это что то совсем не то что нужно :) При чем случайное число, которое появляется во всплывающем окне?
 
Цитата
Роман написал:
При чем случайное число
А чем формула случайного числа хуже любой другой?
 
Цитата
RAN написал:
Это с вашей точки зрения, при пересчете происходят какие либо изменения в ячейке.А на самом деле - какая формула была, такая и осталась, как возвращала она какой-то результат, так и возвращает.И для того, чтобы отследить изменения, нужно где-то запомнить значения до пересчета, и сравнить со значением после пересчета.
RAN, я смысл алгоритма понял, но написать не смогу... в VBA не умею писать, к сожалению очень большому, как теперь понимаю... Изучаю, пытаюсь, но пока уровень оставляет желать лучшего... Вот у меня есть код, который к кнопке привязан, если я обновил веб-запрос, то дата последнего обновления изменяется в ячейке. Возможно ли макрос записать для моего случая?


Код
Private Sub CommandButton2_Click()ActiveWorkbook.RefreshAll
ThisWorkbook.Sheets("имя листа").[J3].Value = Now
End Sub
 
Роман, #12 видели?
 
Цитата
Роман написал:
При чем случайное число,
А вы по рассуждайте. Calculate срабатывает на любой пересчёт на листе. Вам же нужно определить был ли пересчёт в конкретной ячейке. Переделаем код. Теперь, если меняется случайное число в А3 - ничего не происходит. Но, вы получаете сообщение, если измените что-то в В3 - что приведёт к пересчёту в А1, которую мы отслеживаем.
 
Юрий, код не я писал, честно я не понимаю даже что там в нем прописано, понял только как менять диапазон изменяемых ячеек и слева -1 или справа 1 будут показаны даты обновления. В моем случае не нужно фиксировать изменение в диапазоне, достаточно одной ячейки. А получается в коде прописан цикл и поэтому он не работает для обновления в одной ячейке?
 
Цитата
Юрий М написал:
Изменил код только в части контролируемой ячейки и смещения - адреса ячейки с датой.
Юрий, спасибо Вам большое! Теперь работает все как надо! Извините, чайника, за беспокойство... :)
 
Цитата
Роман написал:
честно я не понимаю даже что там в нем прописано
Тогда зачем вы пишете
Цитата
Роман написал:
Помогите, пожалуйста, подправить код
?
Тогда так и пишите - Пожалуйста, подправьте код, чтобы он делал то и то. В чём помощь, если вы не участник решения?
 
Роман, Вы код из #12 проверили?
 
Юрий, из #12 код работает, да. Скажите, пожалуйста, можно ли в этом коде указать конкретный адрес ячейки куда вставится дата последнего изменения (обновления), чтобы без формулы обойтись?
 
Цитата
Андрей VG написал:
?Тогда так и пишите - Пожалуйста, подправьте код, чтобы он делал то и то. В чём помощь, если вы не участник решения?
Андрей, я так быстро не могу, мне  нужно время чтобы на реальном файле все проверить. Извините. Я все сообщения читаю, и обязательно все проверю и отпишусь.
 
Формула на позицию ячейки с датой никак не влияет. Адрес ячейки определяется смещением: Offset(0, 2) - в той же строке, на два столбца правее.
 
А если изменения происходят в ячейке А1, например, а дату нужно записать в ячейку С4? Вот это я имею ввиду. тогда как здесь прописать смещение Offset(0, 2)?
 
Андрей, я посмотрел Ваш код. Идею Вашу я понял, но мне нужна ячейка в которой отображается дата изменения.
 
Тогда Offset(3, 2) - на три строки ниже и два столбца правее.
 
Цитата
Юрий М написал:
Тогда Offset(3, 2) - на три строки ниже и два столбца правее.
Дошло... :) Спасибо, Юрий, большое. Универсальный код получился. Буду эксперементировать! Всем спасибо за помощь в решении вопроса! Всего хорошего!
Страницы: 1
Наверх