如何根据查询生成常规Excel公式?

时间:2017-05-02 17:30:16

标签: excel excel-formula powerquery excel-2016

我有一个庞大而复杂的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键,以使其执行公式。

enter image description here

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

我有一种方法可以在此查询列中使用常规公式,并让它在数据刷新之间自动保留吗?

5 个答案:

答案 0 :(得分: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 Formulas,它具有与标准excel公式不同的功能集。

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

这可以使您从工作表中访问数据成为一件苦差事,但这是可能的。一些提示可以在这里找到:

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

答案 1 :(得分:1)

解决方法是通过某些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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

Power Query Table Formula

答案 4 :(得分:0)

我知道帖子有些旧,但是我遇到了同样的问题,无法找到解决方案。

实际上,您可以使用一个宏来完成此操作。我有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中内置的Macro maker做到了。但基本上,您可以复制该代码,只需更改 ThisWorkbook.Sheets(“ Report”)。Range(“ AM2”)。选择您的公式“ = IFERROR(VLOOKUP([@ Arbeitsplatz], Verzeichnis!R3C5:R26C6,2,FALSE),“”“”)“和自动填充目标。

希望它能对您有所帮助。