【发布时间】:2020-05-11 00:42:54
【问题描述】:
我在 Excel VBA 中编写了一个手动宏,它显示一个表格,以显示名为“评估”的工作表中某些数据的历史记录。我引用的数据在“清单”表中。(如下所示)问题是“清单”中的数据每天或更频繁地变化。每次工作表更改时,宏都应在“评估”表的 LastRow 中插入一个带有新日期的新行。 (我用谷歌搜索,发现可以使用时间戳,见下文和函数 Workbook.Sheetchange,每次更改工作表时都应该激活这个宏,见下文)。我想在“评估”中显示数据的历史记录。所以最后一次更改的行中的值应该保持稳定。 因此,例如“评估”中的第 1 行:2020-01-17 值为 1(这应该保持为 1,因为我想查看进度) 现在工作表更改并插入第 2 行: 第 2 行:2020-01-18 值现在为 2(从清单复制),我希望第 1 行中的值保持为 1(因为在上次更改之前它是 1)。 现在它看起来像这样:
Sub Test()
'
' Test Macro
Range("A3").Select
ActiveCell.FormulaR1C1 = "=NOW()"
Range("B3").Select
ActiveCell.FormulaR1C1 = "='checklist'!R[399]C[58]"
Range("C3").Select
ActiveCell.FormulaR1C1 = "1"
Range("D3").Select
ActiveCell.FormulaR1C1 = "='checklist'!R[399]C[58]"
End Sub
时间戳:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("'checklist'!BH400:BL500")) Is Nothing Then
Cells(Target.Row, 1) = Format(Now, "DD/MM/YYYY hh:mm")
End If
End Sub
workbook.sheetchange:
Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Source As Range)
' runs when a sheet is changed
End Sub
您对如何连接这些代码有任何想法吗?对不起,我不是真正的 VBA 专家。我制作了一个谷歌表来显示我的实际意思,但我在 excel VBA 中需要这个,谷歌表只是为了形象化我的意思:https://docs.google.com/spreadsheets/d/1OU_95Lhf6p0ju2TLlz8xmTegHpzTYu4DW0_X57mObBc/edit#gid=0
这是我现在的代码:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range)
If Sh.Name = "Checklist" Then
'Monitoring from A3:E100, if different change this
If Not Intersect(target, Range("A2:E1000")) Is Nothing Then
'if any monitoring here, please you add here
Test target 'Here procedure to insert
End If
End If
End Sub
Private Sub Test(target As Range)
Dim LastRow As Long
LastRow = Range("Evaluation!A" & Sheets("Evaluation").Rows.Count).End(xlUp).Row
If Range("Evaluation!A1").Value <> "" Then
LastRow = LastRow + 1
End If
'every change A3:E in checklist will insert row to this evaluation
'but if different please you decide here
Range("Evaluation!A" & LastRow).Value = Format(Now, "dd.mm.yyyy hh:mm") 'you can change this
Range("Evaluation!B" & LastRow & ":F" & LastRow).Value = Range("Checklist!A" & target.Row & ":E" & target.Row).Value
End Sub
【问题讨论】:
-
@user11982798 抱歉,这是一个错误,我现在在问题中编辑了代码,所以当表“清单”!BH400:BL500 中的值发生变化时,时间戳(然后 Cells(Target.Row , 1) = Format(Now, "DD/MM/YYYY hh:mm")) 应该被激活并插入到工作表“评估”的 LastRow 中,最后一行应该填充数据。 C3:C 中的值始终为 1,是的,但 D3:D 行中的值会发生变化,这就是我想查看进度的原因。
-
@user11982798 没错!你知道代码的样子吗?
-
但重要的是,时间戳总是插入到 A 列的最后一行
-
再看另一个答案