Как сохранить динамическую историю значений в строках с отметкой времени VBA / Excel - PullRequest
0 голосов
/ 28 сентября 2018

Я новичок в VBA и мучаюсь, чтобы скрипт работал правильно.Цель: у меня на ячейке A10 динамическое число, каждые несколько дней или часов его значение меняется по формуле.Я хочу сохранить все значения, которые когда-либо были в этой ячейке ... Я не смог найти способ сделать это с формулой, поэтому я попытался с VBA и написал следующий скрипт:

    Dim xVal As String
Private Sub Worksheet_Change(ByVal Target As Range)
    Static xCount As Integer
    Application.EnableEvents = False
    If Target.Address = Range("A10").Address Then
        Range("D2").Offset(xCount, 0).Value = xVal
        Range("C2").Offset(xCount, 0).Value = Now()
        xCount = xCount + 1
    Else
        If xVal <> Range("A10").Value Then
         Range("D2").Offset(xCount, 0).Value = xVal
         Range("C2").Offset(xCount, 0).Value = Now()
        xCount = xCount + 1
        End If
    End If
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    xVal = Range("A10").Value
End Sub

IУ меня есть две проблемы с конкретным сценарием:

  • Хотя я сохранял его как .xlsm при каждом открытии книги, сценарий перезаписывает значения, начинающиеся с C2, поэтому я теряю предыдущие значения ...
  • Я не знаю, почему, но хотя скрипт работает без сбоев, он сохраняет предыдущее значение, которое имела ячейка A10, а не текущее.

Не могли бы вы мне помочь?

Спасибо

1 Ответ

0 голосов
/ 28 сентября 2018

Попробуйте только этот код:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xCount As Long

    Application.EnableEvents = False

    xCount = Cells(ActiveSheet.Rows.Count, 3).End(xlUp).Row - 1

    If Target.Address = Range("A10").Address Then
        Range("D2").Offset(xCount, 0).Value = Range("A10").Value
        Range("C2").Offset(xCount, 0).Value = Now()
    Else
        If xVal <> Range("A10").Value Then
         Range("D2").Offset(xCount, 0).Value = Range("A10").Value
         Range("C2").Offset(xCount, 0).Value = Now()
        End If
    End If

    Application.EnableEvents = True

End Sub

Когда я помещаю функцию = NOW () в «A10», то иногда = NOW () в «A10», который был скопирован в «D», показывал секунду раньшевремя, чем значение времени в «C», но я думаю, это не проблема.

Редактировать:

Option Explicit ' To be sure there are not misspelled variables

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xCount As Long
    Dim valueCell As Range
    Dim timeStampCell As Range
    Dim targetCell As Range
    Dim xVal As Long

    Application.EnableEvents = False

    '''''EDIT''''''

    Set targetCell = Range("A10")
    Set timeStampCell = Range("C2")
    Set valueCell = timeStampCell.Offset(0, 1)

    '''''''''''''''

    xCount = Cells(ActiveSheet.Rows.Count, valueCell.Column).End(xlUp).Row - 1 ' Now it is not checking the third column but the valueCell column

    If Target.Address = targetCell.Address Then
        valueCell.Offset(xCount, 0).value = targetCell.value
        timeStampCell.Offset(xCount, 0).value = Now()
    Else
        If valueCell.Offset(Cells(ActiveSheet.Rows.Count, valueCell.Column).End(xlUp).Row - 2, 0).value <> targetCell.value Then  ' Now duplicates, I forgot I got rid of xVal variable
         valueCell.Offset(xCount, 0).value = targetCell.value
         timeStampCell.Offset(xCount, 0).value = Now()
        End If
    End If

    Application.EnableEvents = True

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...