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