我在为此寻找答案时遇到了一些问题。
在 Sheet1 中,我有一系列单元格(“A4:Q4”),它们都具有某些 RTD 函数,它们从外部程序收集实时股票数据。这些单元格每隔几秒钟更新一次,具体取决于父程序的更改。
我想要做的是,每次该范围内的任何值发生变化时(即每次 RTD 值更新时),复制该范围的值并将它们粘贴到 Sheet2 中的下一个可用空行。这应该有效地创建一长串值,但是我遇到了 RTD 问题。我当前的代码将执行我想要的操作,但前提是手动更改范围内的值,而不是在 RTD 值更新时。即使 RTD 值正在更新/更改,它也不会将这些新值复制到 Sheet2,如果这有意义的话。这似乎与宏没有意识到值正在自动更改有关。当我对该范围内的值进行自己的更改时,它会起作用,但这会使单元格中的 RTD 函数变得无用。
这是我所拥有的:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
' The variable KeyCells contains the cells that will
' cause an alert when they are changed.
Set KeyCells = Worksheets("Sheet1").Range("A4:Q4")
' Wait for change to happen...
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
' once change happens, copy the range (yes keep R4 value too)
ThisWorkbook.Worksheets("Sheet1").Range("A4:R4").Copy
' Paste it into the next empty row of Sheet2
With ThisWorkbook.Worksheets("Sheet2")
Dim NextRow As Range
Set NextRow = ThisWorkbook.Worksheets("Sheet2").Range("A" & .UsedRange.Rows.Count + 1)
NextRow.PasteSpecial Paste:=xlValues, Transpose:=False
Application.CutCopyMode = False
End With
End If
End Sub
我在想一个潜在的解决方案是创建一个循环,通过它存储该范围内的每个值,然后每半秒或 1 秒将存储的值与“当前”值进行比较,看看是否有任何变化. 如果有,将该范围的值复制到 Sheet2。但这似乎很笨拙。
有任何想法吗?谢谢!
如评论中所述,当单元格由于公式重新计算而更改值时,不会触发 Worksheet.Change 事件。所以你可以使用 Worksheet.Calculate 事件。
与 Worksheet.Change 事件不同,Worksheet.Calculate 事件中没有Target
。您可以使用以下方法测试特定范围内的单元格是否已重新计算:
在ThisWorkbook
代码模块中:
Private Sub Workbook_Open()
PopulateKeyValueArray
End Sub
在Sheet1
代码模块中:
Private Sub Worksheet_Calculate()
On Error GoTo SafeExit
Application.EnableEvents = False
Dim keyCells As Range
Set keyCells = Me.Range("A4:Q4")
Dim i As Long
For i = 1 To UBound(KeyValues, 2)
If keyCells(, i).Value <> keyValues(1, i) Then
Dim lastRow As Long
With Sheet2
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Range("A" & lastRow & ":R" & lastRow).Value = Me.Range("A4:R4").Value
End With
Exit For
End If
Next i
SafeExit:
PopulateKeyValueArray
Application.EnableEvents = True
End Sub
在普通代码模块中:
Public keyValues()
Public Sub PopulateKeyValueArray()
keyValues = Sheet1.Range("A4:Q4").Value
End Sub
(1):keyValues
是一个Public
数组,其中填充keyCells
了工作簿首次打开时的值。
(2):当任何单元格因公式重新计算而发生变化时Sheet1
,将中的值keyCells
与其对应的元素进行一一比较keyValues
。如果存在差异,即单元格 inkeyCells
已更新,则 inA4:R4
中的最新值将写入in中的下一个可用行Sheet2
。在Exit For
保证这个值传递只发生一次,即使多个细胞发生了变化。最后,keyValues
更新为 中的最新值keyCells
。
(3):PopulateKeyValueArray
从读取值Sheet1:Range("A4:Q4")
成keyValues
阵列。
请注意,keyValues
当您第一次将代码添加到工作簿时,它将为空,因此要么保存并重新打开,要么运行PopulateKeyValueArray
以填充数组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句