【问题标题】:How can I produce a regular Excel formula as the result of a query?如何生成常规 Excel 公式作为查询的结果?
【发布时间】:2017-05-02 17:30:15
【问题描述】:

我有一个大而复杂的 Excel 查询,它可以按需要工作。

但是,我正在实现一些实时数据验证功能(即不需要刷新数据),并且我需要在查询结果的其中一列中有一个常规的 excel 公式。

此公式将使用工作簿中的其他工作表执行实时数据比较,有意独立于查询本身。

我可以添加没有值的自定义列吗?
我假设值 null"" 会覆盖任何预先存在的数据,所以我不能在运行查询后将 excel 公式输入到结果表中(公式在刷新之间不会持续存在)。

为了测试,我尝试添加一个值为 "=5+2" 的自定义列,只是为了看看它会如何表现。

let
    Source = Excel.CurrentWorkbook(){[Name="tblInvoicesCategorized"]}[Content],

    /* ... perform numerous query actions ... */

    // Use "=5+2" as a test formula
    #"Added Custom13" = Table.AddColumn(#"Added Custom12", "Stale Data", each "=5+2"),

    /* ... perform numerous query actions ... */

in
    #"Changed Type"

查询确实将公式输出为列中单元格的值,但 Excel 并未自动执行公式。
我仍然必须手动将光标置于单元格中并按 Enter 键,以使其执行公式。

此工作簿不希望手动输入公式,甚至手动执行宏。

有没有办法让我在这个查询列中有一个常规公式,并让它在数据刷新之间自动保持?

【问题讨论】:

    标签: excel excel-formula powerquery excel-2016


    【解决方案1】:
     #"Added Custom13" = Table.AddColumn(#"Added Custom12", "Stale Data", each "=5+2"),
    

    这不是您期望的方式,因为您返回的是字符串文字:“=5+2”

    = 是隐含的,不需要引号

     #"Added Custom13" = Table.AddColumn(#"Added Custom12", "Stale Data", each 5+2),
    

    这将返回 7 而无需手动刷新。但是,您仅限于 Power Query 公式,它具有与标准 excel 公式不同的功能集。

    https://msdn.microsoft.com/library/1ed840b1-7e20-4419-ad2f-d82054c9b2ab

    这会使访问工作表中的数据变得很麻烦,但这是可能的。一些提示可以在这里找到:

    How can I reference a cell's value in a Power Query

    【讨论】:

    • 公式必须是常规的 Excel 公式,独立于查询 - 所以不幸的是,这些解决方案都不适合我。 :(
    • 你为什么要尝试将它添加到查询中呢?您可以在任何单元格中放置一个公式并引用查询输出的数据。刷新数据源时,公式将自动更新。如果不是,请检查“公式”->“计算选项”下的设置
    • 因为我需要为结果中的每一行运行公式,并且行数可能会根据查询输出而有所不同。
    • 您可以通过一个简单的 if 语句来检查该行是否使用 ISBLANK 等填充
    【解决方案2】:

    您不能输出将直接调用 Excel 公式的列。您可以在工作表中使用不同的列,该列将调用 Excel 公式并引用 Power Query 输出的表中的单元格。此单元格将在 Power Query 表刷新时刷新。

    【讨论】:

      【解决方案3】:

      一种解决方法是通过一些 VBA 代码触发单元格更改的刷新...

      这是我的情况,希望对您有所帮助...

      Private Sub Worksheet_Change(ByVal Target As Range)
      
        '
        '  Dim lTest As Long, cn As WorkbookConnection
        '  On Error Resume Next
        '  For Each cn In ThisWorkbook.Connections
        '      lTest = InStr(1, cn.OLEDBConnection.Connection, "Provider=Microsoft.Mashup.OleDb.1", vbTextCompare)
        '  If Err.Number <> 0 Then
        '      Err.Clear
        '      Exit For
        '  End If
        '  If lTest > 0 Then cn.Refresh
        '  Next cn
      
      
      
      
          If Intersect(Target, Me.Range("datachange")) Is Nothing Then Exit Sub
      
          Application.EnableEvents = False 'to prevent endless loop
      
          'Application.Goto Reference:="Tum_Santiyelerin_Satinalinan_Malzemeleri"
          Range("Tum_Santiyelerin_Satinalinan_Malzemeleri").ListObject.QueryTable.Refresh BackgroundQuery:=False
      
          'Application.Goto Reference:="Filtre"
          'Range("Filtre").ListObject.QueryTable.Refresh BackgroundQuery:=False
      
          'Application.Goto Reference:="Filtre_Malzeme"
          Range("Filtre_Malzeme").ListObject.QueryTable.Refresh BackgroundQuery:=False
      
          'Application.Goto Reference:="Filtre_Proje"
          Range("Filtre_Proje").ListObject.QueryTable.Refresh BackgroundQuery:=False
      
          'Application.Goto Reference:="Filtre_Firma"
          Range("Filtre_Firma").ListObject.QueryTable.Refresh BackgroundQuery:=False
      
      
      
          Application.Goto Reference:="Tum_Santiyelerin_Satinalinan_Malzemeleri"
          ActiveWorkbook.RefreshAll
          Application.EnableEvents = True
      

      【讨论】:

        【解决方案4】:

        我意识到这是一个旧线程,但想给出我的答案,以防其他人像我一样遇到它。我偶然发现了这个解决方案,所以我不能说它是设计使然,还是未来版本会解决的错误。

        而不是尝试在查询结果中包含公式,如果您将带有公式的列直接添加到输出表的末尾并选择“使用此公式覆盖此列中的所有单元格”选项,那么当您刷新您的查询,该公式将为表格的所有行填充,并将像普通工作表公式一样解析。

        【讨论】:

        • 该列甚至不需要位于公式的末尾,您只需在首次执行查询后手动插入即可。
        【解决方案5】:

        我知道帖子有点旧,但我遇到了同样的问题,找不到解决方案。

        您实际上可以通过一个宏的小技巧来做到这一点。我有一个包含 18 个不同查询的强力查询,有些需要一个公式。为了提高性能,我写了一个小 vba 来更快地刷新所有内容并在刷新后保存文档。它看起来像这样:

        Sub Aktualisieren()
        
            Application.Calculation = xlCalculationManual
            ActiveWorkbook.RefreshAll
            Application.Calculation = xlAutomatic
        
              On Error GoTo ErrorHandler
              ActiveWorkbook.Save
              Exit Sub
        
              ErrorHandler: MsgBox "You can't save the file right now! This isn't a bug!", vbInformation  Exit Sub
        
        End Sub
        

        现在我的问题是,我的查询中有一些公式,如下所示 Query with formula

        如果在我的Sub Aktualisieren()中添加以下代码,公式会自动激活:

        Sub Aktualisieren()
        
            Application.Calculation = xlCalculationManual
            ActiveWorkbook.RefreshAll
        
            ThisWorkbook.Sheets("Report").Range("AM2").Select
            ActiveCell.FormulaR1C1 = _
                "=IFERROR(VLOOKUP([@Arbeitsplatz],Verzeichnis!R3C5:R26C6,2,FALSE),"""")"
            ThisWorkbook.Sheets("Report").Range("AM2").Select
            Selection.AutoFill Destination:=Range("Report[Prio Anlage]")
        
            Application.Calculation = xlAutomatic
              On Error GoTo ErrorHandler
              ActiveWorkbook.Save
              Exit Sub
        
              ErrorHandler: MsgBox "You can't save the file right now! This isn't a bug!", vbInformation 
                Exit Sub
        
        End Sub
        

        我是使用 Excel 中内置的宏生成器完成的。但基本上你可以复制该代码,只需要更改 ThisWorkbook.Sheets("Report").Range("AM2").Select, 你的公式 "=IFERROR(VLOOKUP([@Arbeitsplatz], Verzeichnis!R3C5:R26C6,2,FALSE),"""")" 和自动填充目标。

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-07
          • 2019-12-06
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          • 1970-01-01
          相关资源
          最近更新 更多