如何在excel中获取实时数据
Posted
技术标签:
【中文标题】如何在excel中获取实时数据【英文标题】:how to capture real time data in excel 【发布时间】:2016-04-18 17:47:34 【问题描述】:我有一个链接到实时数据 (=Tickers!Z12) 的单元格 (A1)。我想在五分钟内捕获所有价格范围。我的问题是我正在尝试使用 Worksheet_Change 方法,但如果单元格 (A1) 已制定,则当值更改时它不会更新。如果我手动更改值,它工作正常。但我需要捕获公式生成的值,然后在每次值更改时复制并粘贴 B 列中的值。这是我到目前为止所拥有的。
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Range("A1").value <> Range("B2").value Then
Range("A1").Select
Selection.Copy
With ActiveSheet
LastRow = .Cells(.rows.Count, "B").End(xlUp).row + 1
.Cells(LastRow, 2).Select
Selection.PasteSpecial Paste:=xlPasteValues
End With
End If
Application.CutCopyMode = False
Application.EnableEvents = True
End Sub
【问题讨论】:
this thread 有什么帮助吗?还是this one?你尝试过什么,什么没用/没用? 是什么导致A1中的公式重新计算? 是什么导致单元格Tickets!Z12中的数据刷新?你使用自动刷新选项吗? 我正在使用 dde 链接来检索不同工作表(代码)上的实时数据,我只是通过 =Tickers!Z12 链接到它。我不确定如何通过 dde 链接处理重新计算。 每秒刷新可能会产生不必要的影响。如果您确实选择了它,请确保您实施 DoEvents 否则 Excel 可能会冻结。由于我们不确切知道您的 dde 链接是如何工作的,请尝试检测正确的事件。也许 worksheet_calculate 正如 vacip 所建议的那样。如果找不到事件,您最终将不得不使用 Timer/Sleep 方法。 【参考方案1】:尝试使用 Worksheet_Calculate 事件。
另外,我不确定您是否要将 A1 与 B2 进行比较。逻辑表明您应该将其与 B 列中的最后一个单元格进行比较。
此外,使用 Activesheet 也不是一个好主意,因为当您在任何其他工作表上时可能会发生重新计算,并且您不想在随机工作表上写入值。
还有一件事:不要在宏中使用复制粘贴。只需让 .Value=.Value 即可。
Private Sub Worksheet_Calculate()
Dim lngLastRow As Long
On Error Goto SkipAllThis
Application.ScreenUpdating = False
Application.EnableEvents = False
With Worksheets("Source") 'or whatever sheet has your code and stores your values
lngLastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
If .Range("A1").Value <> .Cells(lngLastRow, 2).Value Then
.Cells(lngLastRow + 1, 2).Value = Range("a1").Value
End If
End With
SkipAllThis:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
【讨论】:
它没有对实时更改做出反应,也没有捕获 B 列中的所有值。它只是覆盖 B 列中的值,我需要在下一个中捕获更改的值空行。那有意义吗?所以每次值改变时,它都会在 b 列的最后一行输入。 通过将代码修改为此。我已经实现了我想要的捕获顺序,但我仍然无法让它在值发生变化时自动捕获它们。 lngLastRow = Range("B" & rows.Count).End(xlUp).row @drs 奇怪,它确实为我收集了彼此下方的值。 0_o @drs 嗯,您可以尝试在工作表“Tickers”上添加代码并测试事件Calculate
和Change
,以查看在刷新 dde 链接时是否有任何触发?
出于好奇,我尝试在 worksheet_change 下运行它,并链接了 A1 单元格 (=E1),因此我可以手动输入和更改 E1 中的值并且它工作正常,但是当我链接到从其 api 源检索数据的单元格 (=abc123|tik!id0?last) 对该单元格的任何更改都没有反应。每次数据从其 api 源更改时,是否有触发事件?【参考方案2】:
DRS,
将睡眠功能实现为:
Declaring & Calling The Sleep API
然后,抓住你的价值。请注意 API 以毫秒为单位。
G.
【讨论】:
以上是关于如何在excel中获取实时数据的主要内容,如果未能解决你的问题,请参考以下文章