【问题标题】:is there a way to respond to changes in conditional formatting in excel?有没有办法响应excel中条件格式的变化?
【发布时间】:2012-07-25 17:59:22
【问题描述】:

我有一个 Excel 表,其中包含指向实时市场数据的 dde ​​链接。我使用计时器每秒查看 dde ​​价格。然后在满足某些条件时提交订单。我尝试了一个中间有 DoEvent 的无限循环,它工作了 5 秒,然后冻结了工作簿。

有没有办法响应 dde ​​更新的变化?更改事件不会检测到它们。它只是检测用户何时进行手动更改。

有人告诉我,如果我有条件格式,就有办法获取该事件。因此,我可以创建一个单元格公式以在满足我的条件时变为真,然后在条件为真时将该单元格设置为某种格式,然后获取格式更改事件。那可能吗?如果有怎么办。任何建议,将不胜感激。

澄清:我想在 VBA 中选择一个事件,该事件将提交交易股票的订单。我现在这样做的方式是使用一个计时器,该计时器循环遍历所有行,在触发器列中寻找真正的单元格。一旦找到它就会关闭该行的标志(将真条件设置为假)并提交订单。

问题在于,对于快速移动的股票来说,一秒钟是永恒的。因此,当触发器列中的单元格变为真时,我需要在 VBA 中引发一个事件,这样我就可以立即响应,而不是等待计时器类的第二个间隔。

据我所知,您不能调用值小于一秒的计时器。如果我可以使用毫秒,我的问题就会得到解决。我只是每 10 毫秒循环一次列表。

据我所知,我无法在 VBA 中创建另一个线程。如果可以的话,我会做一个无限循环,并在每次迭代后让它休眠 10 毫秒左右。

据我所知,我无法将 dde ​​直接拉入 VBA 甚至 .net,因为 MSDN 表示它不再受支持。

我希望这可以澄清。所有建议表示赞赏。

【问题讨论】:

  • 如果您创建了一个将 DDE 输出单元格作为参数的虚拟函数,那么您应该能够响应 Worksheet_Calculate 事件吗?我猜这可能行得通,但我没有使用 DDE 的经验。
  • @Tim Worksheet_Calculate 什么时候触发?
  • 工作表计算时。我不知道 DDE 更改是否会直接触发计算 - 如果没有,则使用虚拟公式来触发事件(它将您的 DDE 单元格作为输入,这些单元格中的更改应触发重新计算)
  • 这成功了。谢谢一百万
  • @TimWilliams 请添加这个答案。

标签: excel vba excel-2003 dynamic-data-exchange


【解决方案1】:

如果您创建一个将 DDE 输出单元格作为参数的虚拟函数,那么您应该能够响应 Worksheet_Calculate 事件吗?

我猜这可能可行,但我没有使用 DDE 的经验:DDE 更新甚至可能直接触发计算事件。

【讨论】:

  • 总之,不需要使用条件格式。 Worksheet_Calculate 响应 dde ​​更改。
【解决方案2】:

如果您询问是否可以使用条件格式来触发事件,是的,这是可能的。然而,我自己并不熟悉 DDE 模型,正如 Stepan1010 所指出的,混合条件格式以从数据条件触发事件似乎确实是一个额外的步骤。

您可能需要考虑此链接中 Excel 先生中的讨论,因为问题集中在更改基于单元格值的更改上,从 DDE 连接对单元格所做的更改:http://www.mrexcel.com/forum/showthread.php?176508-Comments-VBA-amp-Min-Max

如果适用于您的应用程序,您也可以考虑使用 DoEvent 并根据您实际实现宏的时间段设置循环。这篇 SO 文章专注于状态栏,但我认为同样的逻辑适用于事件执行,比如基于循环内的条件:Force a screen update in Excel VBA

希望这对你有帮助 =)

~JOL

【讨论】:

    【解决方案3】:

    您为什么不将您在该单元格中的任何条件格式逻辑重新创建到一个单独的单元格中?

    例如,您的条件格式逻辑可能会在某个单元格高于某个数字时突出显示该单元格 - 您可以将该逻辑放在另一个单元格中 - 例如。 =if(A1>100,真,假)

    所以我想我的问题是 - 当您可以选择事件本身时,为什么还要选择格式更改事件?

    编辑您的澄清:

    如果您想在 VBA 中连续运行宏,则不需要计时器 - 您可以像这样执行连续循环:

    Sub macro1()
    
        Dim i As Double
    
        With Sheet1
    
            Do
    
                '.Cells(5, 4).Value = i
    
                i = i + 1
    
                .Cells(1, 1).Value = i
    
                ' you are going to want to comment this out if you want to don't need to do other things
                DoEvents
    
                If Sheets("Sheet1").Range("A2").Value = True Then
                    ' put your code here.
                End If
            Loop
    
        End With
    End Sub
    

    所以我一定还是无法理解你的情况。

    【讨论】:

    • 如何在 VBA 中捕捉其他单元格的变化?
    • 这是基本的 vba: If Sheets("Sheet1").Range("A1").Value = False Then ' out your code here End If
    • 这不是我想要做的。阅读我上面的说明。
    • 我尝试了一个带有 doevents 的循环。它工作了大约 10 秒钟,然后冻结了工作簿。我不知道为什么,但可能有 450 多个 dde ​​链接与它有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多