vba - 如何使用时间戳 VBA/Excel 保留动态值历史记录

标签 vba excel

我是 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

我对特定脚本有两个问题:

  • 虽然我每次打开工作簿时都将其保存为 .xlsm,但脚本会覆盖 C2 开头的值,因此我会丢失以前的值...
  • 我不知道为什么,但尽管脚本运行顺利,但保留了单元格 A10 的先前值,而不是当前值。

你能帮我一下吗?

谢谢

最佳答案

仅尝试以下代码:

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”中时,有时复制到“D”的“A10”中的 =NOW() 显示的时间比“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

关于vba - 如何使用时间戳 VBA/Excel 保留动态值历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52552497/

相关文章:

vba - 在使用的单元格范围VBA中应用边框

php - 在 PHP 中以编程方式创建 Excel 图表

excel - 关闭 Powerpoint 的屏幕更新

vba - Excel VBA 代码无法打开名为 "CON.txt"的文件

vba - 自动筛选在筛选 View 中看不到数值数据(多个值)

vba - 在VBA宏中打开/激活Word文档

excel - 单击时清除文本框

vba - Excel/VBA 最后一行/列

java - 编辑 Excel 文件时,由于 native 代码错误,崩溃发生在 Java 虚拟机之外

excel - 有没有办法编辑表单控件按钮上的标题?