【问题标题】:Continuously auto-refresh some queries if "B1"> "B2", but auto-refresh all queries every 2 minutes如果“B1”>“B2”,则连续自动刷新一些查询,但每 2 分钟自动刷新所有查询
【发布时间】:2020-08-30 09:27:59
【问题描述】:

我想用 VBA 对某些查询的循环自动刷新进行编程,例如,当“B1”>“B2”时,来自 20 个现有查询的 3 个查询,如果不满足这个不等式条件,那么 20 个查询将每 2 个自动刷新一次分钟。有任何想法吗? 我的工作簿中的 20 个查询目前每 2 分钟刷新一次。当工作表“结论”中的单元格“B1”>“B2”单元格时,我需要中断此刷新模式。只有获取在上述单元格中操作的外部数据所涉及的查询才会自刷新。例如,查询 1、查询 2 和查询 3 负责提供要在导致上述单元格的计算中操作的值,因此它们将是唯一会在循环中刷新的查询,直到说不等式就解决了。停止遵守 一旦最后一次发生,那么 20 个查询将每 2 分钟更新一次。 我在准备 VBA 时需要帮助,因为我对代码层次结构的了解超出了我的知识范围。请帮忙!

【问题讨论】:

  • 每当您发布此内容时,人们都会不断建议 Application.OnTime,但您似乎有意无视该建议。本网站旨在帮助您解决您的代码问题,但如果您不尝试编写一些代码,那么它可能不适合您提出问题。

标签: excel vba loops refresh powerquery


【解决方案1】:

在此示例中,我有 3 个外部查询(File1、File2、File3)和只有 3 个内部查询(Tabelle1、Tabell2、Tabell3)。

我希望我理解你的逻辑是正确的。

首先,您必须检查“结论”表的 worksheet_change 事件,检查 Range("B1:B2) 是否发生变化,并调用另一个子程序(在本例中为“set_refreshPeriod”。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Application.Intersect(Target, Worksheets("Conclusion").Range("B1:B2")) Is Nothing Then
        set_refreshPeriod
    End If

End Sub

SUB“set_refreshPeriod”检查 B1 和 B2 并在查询设置中设置 2 分钟或不设置(0 分钟)。它还会刷新外部查询。

Sub set_refreshPeriod()

Dim wks As Worksheet
Dim rng1 As Range, rng2 As Range
Dim lngPeriod As Long
Dim i As Integer
Dim internalQuerys As Variant 'The 20 Querys which update all 2 Minutes
Dim externalQuerys As Variant 'The 3 Querys which update if B1>B2

Set wks = ActiveWorkbook.Worksheets("Conclusion")
Set rng1 = wks.Range("B1")
Set rng2 = wks.Range("B2")

'The name of your Query always starts wiht "Query - " in english or "Abfrage - " in German
'You can add here more Querys
internalQuerys = Array("Abfrage - Tabelle1", _
                        "Abfrage - Tabelle2", _
                        "Abfrage - Tabelle3")

externalQuerys = Array("Abfrage - File1", _
                        "Abfrage - File2", _
                        "Abfrage - File3")

    'if B1 > B2 then do not refresh the internalQuerys every 2 Minutes else do it
    If rng1 > rng2 Then
        lngPeriod = 0 'do not refresh internalQuerys

        'Refresh the the external Querys
        For i = 0 To UBound(externalQuerys)
            ThisWorkbook.Connections(externalQuerys(i)).OLEDBConnection.Refresh
        Next

    Else: lngPeriod = 2 'Time 2 Minutes for internal Querys
    End If

    'Set the RefreshPeriod for the internal Querys
    For i = 0 To UBound(internalQuerys)
        ThisWorkbook.Connections(internalQuerys(i)).OLEDBConnection.RefreshPeriod = lngPeriod
    Next

End Sub

最好的问候克里斯

【讨论】:

  • 嗨 Cris,internalQuerys 和 externalQuerys 在内容方面有什么区别;为什么你命名一些 Tabelle 和另一个 File,也许你首先代表的是工作簿中的所有查询表?
  • 我目前正在研究您留给我的代码,以便理解并将其应用于我的情况,这比本文中介绍的情况要困难一些。我想知道之前问了什么并添加到我的问题中:我放在工作表“结论”窗口中的第一个代码和我放在前一个下面的第二个代码?
  • 您好佩里,我得到了 internalQuery 和 externalQuery 的名称,因为您在内部和外部的问题中都写了。我了解,您有 3 个表(外部 - 文件)如果 B1>B2 应该更新,其他 20 个(内部 - 表)应该在 B1
  • 克里斯,我不得不再写一篇更具体的帖子来说明我想要什么,我想我在这里更好地解释自己。 stackoverflow.com/questions/61856658/…
  • Cris,我已经尝试过您发送给我的代码,但遇到以下问题: - Private Sub Worksheet_Change (ByVal Target As Range) 对我不起作用,因为“B1”和“B2”具有功能,我试图将其更改为 Private Sub Worksheet_Calculate ( ) 但到目前为止它以黄色突出显示我。我们是否需要添加任何其他代码? - 我需要像“B1:B2”这样的其他范围来控制其他查询的自动刷新。例如“B1:B2”控制“Query-1”的刷新; “查询 - 2”; “查询 - 3”;但是“C1:C2”控制“Query - 4”的刷新; “查询 - 2”; “查询 - 6”等等等等
【解决方案2】:

您必须在链接上执行这两个操作:

https://exceloffthegrid.com/auto-refresh-power-query/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 2013-11-17
    • 1970-01-01
    • 2014-04-23
    • 2017-08-30
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多